Ich bin noch am lernen und wenn ich etwas mehr Zeit habe, findet ihr die überarbeitet Version meiner Anwendung unter
Ok, kommen für zum besagten Code(-Fragment), für erste eigene Ansätze mit Sicherheit sehr hilfreich, so hoffe ich ...
Code: Alles auswählen
package ...[Anwendung].office;
/*
* notwendige Imports herausgenommen...
*/
public class OpenOffice {
private XComponentContext mxRemoteContext;
private XMultiComponentFactory mxRemoteServiceManager;
private String loadUrl;
private StringBuffer loadUrlSB;
private String unoUrl = "uno:socket,host=localhost,port=8100;urp;" +
"StarOffice.ServiceManager";
private XComponent xDocument;
private XTextDocument xTextDocument;
private XComponentLoader xComponentLoader;
private Dokument dokument; // Objekt aus der Anwendung
/*
* ========= Kernfunktionen
*/
public void oeffnen(Dokument dokument){
this.dokument = dokument;
ladeDokument(false);
if (dokument.getTyp() == SGV.BERICHT){
variablenEinfuegen();
kapitelListeEinfuegen();
}
}
public void drucken(Dokument dokument) {
this.dokument = dokument;
ladeDokument(true);
if(xDocument != null) {
if (dokument.getTyp() == SGV.BERICHT){
variablenEinfuegen();
}
// query the XPrintable interface from your document
XPrintable xPrintable = (XPrintable)UnoRuntime.queryInterface(XPrintable.class, xDocument);
// create an empty printOptions array
PropertyValue[] printOpts = new PropertyValue[0];
// PropertyValue[] printerDesc = new PropertyValue[1];
// printerDesc[0] = new PropertyValue();
// printerDesc[0].Name = "Name";
// printerDesc[0].Value = "5D PDF Creator";
// xPrintable.setPrinter(printerDesc);
// PropertyValue[] printOpts = new PropertyValue[1];
// printOpts[0] = new PropertyValue();
// printOpts[0].Name = "Pages";
// printOpts[0].Value = "1,7";
// xPrintable.print(printOpts);
// kick off printing
try {
xPrintable.print(printOpts);
} catch (IllegalArgumentException e) {
// TODO Automatisch erstellter Catch-Block
e.printStackTrace();
}
}
}
private void ladeDokument(boolean hidden) {
String datei = dokument.getDatei();
try {
// den Dateinamen für eine gültige (uno)URL aufbereiten
java.io.File sourceFile = new java.io.File(datei);
loadUrlSB = new StringBuffer("file:///");
loadUrlSB.append(sourceFile.getCanonicalPath().replace('\\', '/'));
loadUrl = loadUrlSB.toString();
// remote service manager einrichten
// und für den XComponentLoader brauchen wir ein Desktop Objekt
mxRemoteServiceManager = getRemoteServiceManager();
Object desktop = mxRemoteServiceManager.createInstanceWithContext(
"com.sun.star.frame.Desktop", mxRemoteContext);
xComponentLoader = (XComponentLoader)UnoRuntime.queryInterface(
XComponentLoader.class, desktop);
// Eigenschaften für das Laden (siehe com.sun.star.document.MediaDescriptor )
PropertyValue[] loadProps = null;
if (hidden){
loadProps = new PropertyValue[1];
loadProps[0] = new PropertyValue();
loadProps[0].Name = "Hidden";
loadProps[0].Value = new Boolean(true);
} else {
loadProps = new PropertyValue[1];
loadProps[0] = new PropertyValue();
loadProps[0].Name = "AsTemplate";
loadProps[0].Value = new Boolean(false);
}
// Laden des Dokumentes
xDocument = xComponentLoader.loadComponentFromURL(loadUrl, "_blank", 0, loadProps);
xTextDocument =
(XTextDocument)UnoRuntime.queryInterface(XTextDocument.class, xDocument);
} catch (IOException e) {
// TODO Automatisch erstellter Catch-Block
e.printStackTrace();
} catch (Exception e) {
// TODO Automatisch erstellter Catch-Block
e.printStackTrace();
}
}
protected XMultiComponentFactory getRemoteServiceManager() {
try {
// First step: create local component context, get local servicemanager and
// ask it to create a UnoUrlResolver object with an XUnoUrlResolver interface
XComponentContext xLocalContext;
xLocalContext = com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null);
XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager();
Object urlResolver = xLocalServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", xLocalContext );
// query XUnoUrlResolver interface from urlResolver object
XUnoUrlResolver xUnoUrlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface(
XUnoUrlResolver.class, urlResolver );
// Second step: use xUrlResolver interface to import the remote StarOffice.ServiceManager,
// retrieve its property DefaultContext and get the remote servicemanager
Object initialObject = xUnoUrlResolver.resolve( unoUrl );
XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(
XPropertySet.class, initialObject);
Object context = xPropertySet.getPropertyValue("DefaultContext");
mxRemoteContext = (XComponentContext)UnoRuntime.queryInterface(
XComponentContext.class, context);
} catch (Exception e) {
// TODO Automatisch erstellter Catch-Block
e.printStackTrace();
} catch (java.lang.Exception e) {
// TODO Automatisch erstellter Catch-Block
e.printStackTrace();
}
return mxRemoteContext.getServiceManager();
}
/*
* ====== einfügen einzelner Stammdatenfelder
*
* über festgelegte Benutzerfelder im Dokument
*/
private void variablenEinfuegen(){
Vorgang vorgang = Vorgang.getInstance();
Schaden schaden = vorgang.getSchaden();
Person schadenOrt = schaden.getSchOrt();
Rechnung rechnung = vorgang.getRechnung();
Versicherer versicherer = vorgang.getVersicherer();
Person versicherter = vorgang.getPerson();
Person versichererAp = vorgang.getVersichererAp();
Person ast = schaden.getPerson();
feldEinfuegen("VR_BEZEICHNUNG", versicherer.getBezeichnung());
feldEinfuegen("VR_NAME", versichererAp.getName());
feldEinfuegen("VR_VORNAME", versichererAp.getVorname());
feldEinfuegen("VR_NACHNAME", versichererAp.getNachname());
feldEinfuegen("VR_STRASSE", versichererAp.getStrasse());
/*
* ...
*
*/
}
private void feldEinfuegen (String benutzerfeld, String text){
try {
// get XTextFieldsSupplier, XBookmarksSupplier interfaces
XTextFieldsSupplier xTextFieldsSupplier = (XTextFieldsSupplier)
UnoRuntime.queryInterface(XTextFieldsSupplier.class,
xDocument);
// access the TextFields and the TextFieldMasters collections
XNameAccess xNamedFieldMasters = xTextFieldsSupplier.getTextFieldMasters();
XEnumerationAccess xEnumeratedFields = xTextFieldsSupplier.getTextFields();
Object fieldMaster = xNamedFieldMasters.getByName(
"com.sun.star.text.FieldMaster.User." + benutzerfeld);
// query the XPropertySet interface, we need to set the Content property
XPropertySet xPropertySet = (XPropertySet)UnoRuntime.queryInterface(
XPropertySet.class, fieldMaster);
// insert the column value into field master
xPropertySet.setPropertyValue("Content", text);
// afterwards we must refresh the textfields collection
XRefreshable xRefreshable = (XRefreshable)UnoRuntime.queryInterface(
XRefreshable.class, xEnumeratedFields);
xRefreshable.refresh();
} catch (NoSuchElementException e) {
// TODO Automatisch erstellter Catch-Block
// e.printStackTrace();
} catch (UnknownPropertyException e) {
// TODO Automatisch erstellter Catch-Block
// e.printStackTrace();
} catch (PropertyVetoException e) {
// TODO Automatisch erstellter Catch-Block
// e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Automatisch erstellter Catch-Block
// e.printStackTrace();
} catch (WrappedTargetException e) {
// TODO Automatisch erstellter Catch-Block
// e.printStackTrace();
}
}
/*
* ====== einfügen der einzelnen Kapitel im definierten Bereich
*
* KapitelListe = Objekt Liste aus der Anwendung, mit ...
* - Kapitel = Objekt aus der Anwendung, mit ...
* - BausteinListe = Objekt Liste aus der Anwendung, mit ...
* - Baustein = Bausteintext
*
*/
private void kapitelListeEinfuegen() {
/*
* Position im Dokument ermitteln
* 1.Fall : noch nicht vorhanden, dann am Ende des Dok. einfügen
* 2.Fall : Start zwar vorhanden, aber das Ende ist vorloren gegangen
* 3.Fall : Bereich besteht bereits, dann diesen überschreiben
*
*/
XTextRange start = wortSuchen("KSTART");
XTextRange ende = wortSuchen("KENDE");
XTextCursor cursor = null;
XTextRange bereich = null;
String test;
if (start == null && ende == null){
XText text = xTextDocument.getText();
cursor = text.createTextCursor();
cursor.gotoEnd(false);
verstecktenTextEinfuegen(cursor,"KSTART");
cursor.gotoEnd(false);
kapitelEinfuegen(cursor);
verstecktenTextEinfuegen(cursor,"KENDE");
} else {
if ( ende == null) {
bereich = start;
cursor = bereich.getText().createTextCursor();
cursor.gotoEnd(true);
kapitelEinfuegen(cursor);
verstecktenTextEinfuegen(cursor,"KENDE");
} else {
cursor = xTextDocument.getText().createTextCursor();
test = cursor.getString(); // "" (leer)
cursor.gotoRange(start,false);
test = cursor.getString(); // "KSTART" (versteckter Text1)
cursor.collapseToEnd();
test = cursor.getString(); // "" (leer, steht hinter KSTART ?)
cursor.gotoRange(ende,true);
String test2 = ende.getString(); // "KENDE" (versteckter Text2)
test = cursor.getString(); // markierter Text bis ans Ende "KENDE"
kapitelEinfuegen(cursor);
}
}
}
private void kapitelEinfuegen(XTextCursor cursor){
/*
* Alle Kapitel mit den jeweiligen Bausteinen einfügen
* 1. Schritt : Kapitel.Titel (Fett) einsetzen, "versteckt" aufheben
* 2. Schritt : Kapitel.Baustein.Inhalt (nicht Fett) x mal einsetzen
* 3. Schritt : nach allen Kapitel, Bereich abschließen
*/
List kapitelListe = dokument.getKapitelListe();
List bausteinListe = new ArrayList();
if (kapitelListe.size() > 0){
for (int i = 0; i < kapitelListe.size(); i++) {
Kapitel kapitel = (Kapitel) kapitelListe.get(i);
if (kapitel.getDrucken()){
kapitelEinfuegenTitel(cursor, kapitel.getTitel());
bausteinListe = kapitel.getBausteine();
if (bausteinListe.size() > 0){
for (int j = 0; j < bausteinListe.size(); j++) {
kapitelEinfuegenBaustein(cursor, (Baustein) bausteinListe.get(j) );
}
}
kapitelEinfuegenBeenden(cursor);
}
}
}
}
private XTextRange wortSuchen(String gesucht) {
/*
* Ein bestimmtes Wort im Dokument suchen und Position zurückgeben
*/
XInterface result = null;
XTextRange range = null;
String string = "";
try {
XTextDocument xTextDocument =
(XTextDocument)UnoRuntime.queryInterface(XTextDocument.class, xDocument);
XSearchable xSearchable =
(com.sun.star.util.XSearchable)
UnoRuntime.queryInterface(
com.sun.star.util.XSearchable.class, xTextDocument);
XSearchDescriptor xSearchDescr =
(com.sun.star.util.XSearchDescriptor)
xSearchable.createSearchDescriptor();
xSearchDescr.setSearchString(gesucht);
XPropertySet xSearchProp =
(com.sun.star.beans.XPropertySet)
UnoRuntime.queryInterface(
com.sun.star.beans.XPropertySet.class, xSearchDescr);
xSearchProp.setPropertyValue("SearchCaseSensitive",new Boolean(true));
xSearchProp.setPropertyValue("SearchWords",new Boolean(true));
result = (XInterface) xSearchable.findFirst(xSearchDescr);
if (result != null){
range = (XTextRange)UnoRuntime.queryInterface(
com.sun.star.text.XTextRange.class,result);
}
} catch( Exception e) {
e.printStackTrace(System.err);
}
return range;
}
private void verstecktenTextEinfuegen(XTextCursor cursor,String text){
/*
* Um bestimme Bereich im Dokument zu kennzeichnen (versteckt durch
* das Merkmal "ausgeblendet" , über ein Start- und Endewort)
*/
XPropertySet xCursorProps = null;
try {
// Text verstecken (ausblenden,hidden) einfuegen
cursor.gotoEnd(false);
cursor.setString(text);
xCursorProps =
(XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
xCursorProps.setPropertyValue ( "CharHidden", new Boolean (true) );
cursor.gotoEnd(false);
xCursorProps =
(XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
xCursorProps.setPropertyValue ( "CharHidden", new Boolean (false) );
} catch (UnknownPropertyException e) {
} catch (PropertyVetoException e) {
} catch (IllegalArgumentException e) {
} catch (WrappedTargetException e) {
}
}
/*
* nachfolgend die Einzelheiten zum einfügen der Kapitelliste
*/
private void kapitelEinfuegenTitel(XTextCursor cursor, String titel) {
try {
// cursor.gotoEnd(false);
String string = cursor.getString();
cursor.setString(titel);
// Schriftbild formatieren
XPropertySet xCursorProps =
(XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
xCursorProps.setPropertyValue ( "CharWeight",
new Float(com.sun.star.awt.FontWeight.BOLD) );
xCursorProps =
(XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
xCursorProps.setPropertyValue ( "CharHidden", new Boolean (false) );
XText bereich = cursor.getText();
bereich.insertControlCharacter (
cursor, ControlCharacter.LINE_BREAK, false );
} catch (UnknownPropertyException e) {
} catch (PropertyVetoException e) {
} catch (IllegalArgumentException e) {
} catch (WrappedTargetException e) {
}
}
private void kapitelEinfuegenBaustein(XTextCursor cursor, Baustein baustein) {
if (baustein.getInhalt().compareTo("") != 0){
try {
cursor.gotoEnd(false);
cursor.setString(baustein.getInhalt());
// Schriftbild formatieren
XPropertySet xCursorProps =
(XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, cursor );
xCursorProps.setPropertyValue ( "CharWeight",
new Float(com.sun.star.awt.FontWeight.NORMAL) );
XText bereich = cursor.getText();
bereich.insertControlCharacter (
cursor, ControlCharacter.LINE_BREAK, false );
} catch (UnknownPropertyException e) {
e.printStackTrace();
} catch (PropertyVetoException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (WrappedTargetException e) {
e.printStackTrace();
}
}
}
private void kapitelEinfuegenBeenden(XTextCursor cursor){
cursor.gotoEnd(false);
try {
XText bereich = cursor.getText();
bereich.insertControlCharacter (
cursor, ControlCharacter.LINE_BREAK, false );
} catch (IllegalArgumentException e) {
// TODO Automatisch erstellter Catch-Block
e.printStackTrace();
}
verstecktenTextEinfuegen(cursor,"KENDE");
}
}
So das wars....