Seitenumbruch mit Leerseite bei Wechsel von LO 2.4.7 zu 2.6.7

Hallo,

wir generieren bei uns in der Firma Dokumente mit Hilfe von Libre Office. Das Programm zum Generieren ist komplett in Java und verwendet die JAVA-UNO Api.
Bei der Generierung ist es auch so, dass wir manchmal mehrer Dokumente zusammenfügen. Der Quellcode zum Zusammenfügen sieht wie folgt aus:

String insertAnhangDocUrl = Tools2.savetemporaryasMSWord(invocation.getXAnhangComponent(), invocation);
invocation.getPageProps().setPropertyValue("PageDescName", pagestylename); //$NON-NLS-1$
XPropertySet cursorProps = UnoRuntime.queryInterface(  XPropertySet.class, xTextCursorLetzteSeite);
cursorProps.setPropertyValue(BREAK_TYPE, BreakType.PAGE_BEFORE);
XDocumentInsertable xinsertAnhang = UnoRuntime.queryInterface(XDocumentInsertable.class,  xTextCursorLetzteSeite);

File tmpFile = new File(insertAnhangDocUrl);

if (tmpFile.exists()) {
      insertDocumentFromURL(xinsertAnhang, tmpFile);
     invocation.getTempfiles().add(tmpFile);
} else {
    invocation.setErfolg(false);
     insertAnhangDocUrl)); //$NON-NLS-1$
    invocation.getError().append(MessageFormat.format(Messages.getString("Doc2PdfImpl.tempfile_not_exists"), insertAnhangDocUrl));
}

 // nach dem Anhaengen des Attachments dessen
 // Paragrapheneigenschaften tunen
Tools2.setParticularParaProps(invocation.getXWriterComponent(), paraPropsArray, anzahlParas);

Die entscheidende Zeile ist wohl das Einfügen des Break_Type. Es ist nun so das Verhalten, dass mit Version 7.4.7 ein Seitenumbruch eingefügt wird, dann kommt ein Abschnittswechsel und dann wird das angehangene Dokument auf der neuen Seite gestartet.
Mit Version 7.6.7 kommt erst der Abschnittswechsel, dann kommt auf einer neuen Seite der Seitenumbruch und wieder auf einer neuen Seite startet das angehangene Dokument. So entsteht also eine Leerseite.

Kann jemand dieses Phänomen erklären und ist das ein Bug oder ist mein Code vielleicht nicht richtig? Ich brauche auch eine Lösung, die mit beiden Versionen funktioniert.

Hier sind beide Dokumente zum Vergleich angehangen:

test-747.docx (85.9 KB)
test-767.docx (84.6 KB)

This post was flagged by the community and is temporarily hidden.

Also erstmal kannst du dich mal bissel zügeln in deiner Wortwahl. Natürlich wird docx als Ausgabeformat noch benötigt, da es auch die Anforderung gibt, nach der Generierung das Dokument noch zu bearbeiten. Auch so wollen unsere Kunden auch oft noch das Dokument im Word Format haben. Das ist hier aber auch überhaupt nicht das Problem. Mit der Generierung als PDF tritt die Problematik ja genauso auf. Das habe ich ja längst probiert.

So und nun zum anderen Teil deiner Antwort. Dieser von die angesprochene Umbruch ist ja genau der, den ich programmatisch einfüge, damit das angehangenen Dokument auf einer neuen Seite beginnt. Siehe Quellcode. Da war ja schon die Frage, ob dass eben so nicht korrekt ist.

Ich würde eine Dokumentenvorlage mit ein paar angepassten Absatz- und Zeichenvorlagen verwenden, angereichert durch Formularelemente und Datenbankfelder für die Kundendaten. Dauert auch ein paar Stunden, funktioniert dann aber ohne Code über Jahre hinweg.
Für tausende aneinander gereihte Formatierungsattribute ist MS Word prädestiniert.

Was soll ich dazu noch sagen, ohne ausfallend zu werden? Bin raus.

Ich hab keine Ahung was deine Spezialität ist. Lesen scheinbar nicht. Hast du Ahnung von der Verwendung der JAVA-UNO Api? Wenn nicht dann lass es einfach.
Ich hab doch hier keinen Code gebaut, um genau ein Dokument zu erzeugen. Mit dem Programm werden unzählige Dokumente bei verschiedensten Kunden erzeugt. Und diese Dokumente sind ganz verschiedene aufgebaut und verschachtelt usw. Und ja klar wissen wir das MS Word da viel Formatierungsmist macht und das a und o ist, dass man saubere Formatvorlagen etc. benutzt. Wir machen da sauch nicht erst seit gestern, seit bestimmt 15 Jahren.
Aber genau aus dieser Zeit sind halt dann vllt auch Codestellen, die nicht so günstig sind, weil keiner weiß was da wirklich passiert. So richtig gut beschrieben ist die API ja nicht. Und aufgrund vieler Bugs in vergangenen Zeiten musste da auch viel “gebastelt” werden. Vielleicht st davon einiges auch nicht mehr notwendig. Vllt auch die Zeile, die du meinst obwohl zu ja gar nicht wissen kannst was da passiert, weil der Inhalt der Funktion dir fehlt:

   public static void setParticularParaProps(XComponent xComponent, Object[][] object, int anzParasbisher) {
        try {
            XTextDocument xTextDocument = UnoRuntime.queryInterface(XTextDocument.class, xComponent);
            XText xText = xTextDocument.getText();
            XEnumerationAccess xEnumerationAccess = UnoRuntime.queryInterface(XEnumerationAccess.class, xText);
            XEnumeration xEnumeration = xEnumerationAccess.createEnumeration();
            /*
             * Enumeration geht immer ueber alle Paragraphen, deswegen muss ich die ersten,
             * schon "behandelten" ueberspringen, um zu den zuletzt eingefuegten zu gelangen
             */
            // vorgelagerten Paras ueberspringen
            for (int i = 1; i < anzParasbisher; i++) {
                xEnumeration.nextElement();
            }
            // jetzt aber zu den zuletzt eingefuegten
            int m = 0;
            while (xEnumeration.hasMoreElements()) {
                Object paraObject = xEnumeration.nextElement();
                XServiceInfo xInfo = UnoRuntime.queryInterface(XServiceInfo.class, paraObject);
                // bei Texttabellen ist das naemlich nicht so einfach
                if (!xInfo.supportsService(COM_SUN_STAR_TEXT_TEXT_TABLE)) {
                    XPropertySet insertedParaProps = UnoRuntime.queryInterface(XPropertySet.class, paraObject);
                    setParaProps(object, m, insertedParaProps);
                    m++;
                } else {
                    /*
                     * was passiert, wenn ein Fehler schon beim Auslesen der ParaProps einer
                     * Texttabelle auftrat weiß ich nicht -> Props duerften hier nicht setzbar
                     * sein... => dann duerfte alles so bleiben, wie es eingefuegt worden ist
                     */
                    XTextTable xTextTable = UnoRuntime.queryInterface(XTextTable.class, paraObject);
                    XCellRange xCellRange = UnoRuntime.queryInterface(XCellRange.class, xTextTable);

                    String[] cellNames = xTextTable.getCellNames();
                    XCellRange cellRange = xCellRange.getCellRangeByName("A1:" + cellNames[cellNames.length - 1]);
                    XPropertySet cellRangeProps = UnoRuntime.queryInterface(XPropertySet.class, cellRange);
                    /*
                     * versagt, wenn in verschiedenen Zellen verschiedene Werte fuer die
                     * aufgefuehrten Eigenschaften eingestellt wurden...
                     */
                    setParaProps(object, m, cellRangeProps);
                    m++;
                }
            }
        } catch (Exception ex) {
            LOGGER.debug("Fehler beim Setzen der Paragraph-Eigenschaften", ex.getLocalizedMessage());
        }
    }

private static void setParaProps(Object[][] object, int m, XPropertySet insertedParaProps)
        throws UnknownPropertyException, PropertyVetoException, WrappedTargetException
    {
        if (object != null && object.length > m) { // 10.02.2015: ggf.
                                                  // java.lang.ArrayIndexOutOfBoundsException
                                                  // m�glich (> da 0 based)
            try {
                insertedParaProps.setPropertyValue(PARA_TOP_MARGIN, object[m][0]);
                insertedParaProps.setPropertyValue(PARA_BOTTOM_MARGIN, object[m][1]);
            } catch (IllegalArgumentException iaex) {
                LOGGER.warn("Fehler beim Setzen der Paraprops", iaex);
            }
        }
    }

Aber die eigentlich Frage war ja, warum sich da was zwischen den Versionen beim Libre Office ändert.

Ich nehme an, dass Du hier nur schwerlich eine Anwort zu irgendwelchem Java-Code bekommen kannst. Dazu ist ask.libreoffice.org doch zu nahm an den eigentlichen Usern.

Bei LibreOffice ist es nun einmal so, dass sich mit der Entwicklung neuer Versionen auch neue Fehler einschleichen. Ich nehme einfach an, dass die Änderung, über die Du stolperst, ungewollt ist.

Bei so etwas hilft dann nur ein Bugmeldung. Nur wird die Dir nicht weiter helfen, da Du 2 LO-Versionen nennst, für die es schon länger keine Bugfixes mehr gibt. Die “neuere” Version 7.6 hat vor ziemlich genau einem Jahr sein letzten Bugfix erhalten.

das befürchte ich halt auch. Ich hatte ja gehofft, dass sich hier einpaar Leute tummeln, die programmatisch die UNO Api benutzen. Da gibt es irgendwie kaum Leute.
Wir würden ja gern auch auf neuere Libre Office Versionen gehen, aber zb mit der Version 25.2 gibt es Probleme mit dem Dienst. Also man muss für die Generierung ja das Libre Office als Dienst im Headless Modus laufen lassen, damit es aus dem Java ansprechbar ist. Und scheinbar wurde da auch was geändert, so dass der Prozess jetzt immer abstürzt. Aber wegen sowas brauch man auch keinen Bug aufmachen. Das wird auch stiefmütterlich unterstützt.

Ich benutze die API seit 24 Jahren. Was Du da treibst, ist nicht sinnvoll, weil offensichtlich an der Anwendung vorbei programmiert. Die Seitengröße ab Seite 3 ist in beiden Versionen Deiner Datei US-Letter.

Dann schreibe doch mal bitte ein Beispiel, wie es richtige wäre ein Dokument anzuhängen. Du schreibst immer nur das alles Mist ist, aber nicht was und wie genau.

Wir haben jetzt zumindets schon mal herausgefunden, dass ein Abschnittswechsel das Problem ist. Dadurch fliegt dann die komplette Formatierung weg z.B. wird es dadurch zu dem Letter Format. Die problematischen Quellcodezeilen sind diese:

String pagestylename = MessageFormat.format(Messages.getString("Doc2PdfImpl.att"), invocation.getZaehler());
.
.
.
invocation.getPageProps().setPropertyValue("PageDescName", pagestylename);

dadurch ensteht der Abschnittswechsel. Es löst aber noch nicht alle Probleme. Es gibt jetzt noch das Problem, wenn das angehangenen Dokument im Querformat ist. Dann wird es Krütze und der Seitenumbruch wird zu früh eingefügt und dadurch wird auch das Querformat nicht übernommen. Macht man es innerhalb eines Dokuments mit Abschnittswechsel geht es super.
Die Frage ist deshalb immer noch, ob das Einfügen von Anhängen so richtig ist. Also Ans Ende gehen -->Seitenumbruch einfügen -->Cursor letzte Seite holen–>Dokument einfügen

Die beigefügten Dokumente sind Ergebnis einer Konvertierung, während die API sich immer auf das Modell im Open Document Format bezieht, also z.B. mit Seitenvorlagen, die in Word gar nicht existieren. Von daher gibt es gar nicht viel zu sagen, weil wir das Originaldokument nicht sehen, bzw. nur eine Rück-Konvertierte Version davon. Dort befindet sich u.a. eine Seitenvorlage, die aus der Rück-Konvertierung aus harten Word-Attributen hervorgegangen ist. Diese Seitenvorlage ist auf US-Letter gesetzt, aus Gründen, die man in Umgebungsvariablen verorten könnte. Ansonsten habe ich mich mit den Dokumenten nicht weiter befasst.

Java LibreOffice Programming erklärt eigentlich alles im Detail für Java-Programmierer. Bei der Nutzung von LibreOffice sind Vorlagen (engl. templates and styles) das Alpha und das Omega, egal ob man das Dokument per API oder per UI bearbeitet.

Was ich machen würde:
Zuerst einmal Deine Version ausdrucken und anhand des Ausdrucks systematisch und semantisch sauber eine neue Dokumentenvorlage mit Absatz- Seiten- Zeichen- und Rahmenvorlagen erstellen. Was auch immer Du da versuchst einzufügen, sollte mit ein paar Zeilen Code zu bewerkstelligen sein, dann aber ohne jede Änderung von Formatierungsattributen.
P.S. Tabellenvorlagen sind aus Gründen zu vermeiden.