2015-04-07 7 views
11

Also ... im Grunde habe ich eine docx-Datei. Und ich muss einige Formatierungsänderungen in einigen Absätzen vornehmen und dann in einer neuen Datei speichern. Was ich tue, folgt im Wesentlichen.Unendliche gefälschte Seiten in Outpout docx mit Apache Poi

import scala.collection.JavaConversions._ 
import org.apache.poi.xwpf.usermodel._ 

def format(sourceDocumentPath: String, outputDocumentPath: String) { 

    val sourceXWPFDocument = new XWPFDocument(new FileInputStream(sourcePath)) 

    // lets say I have a list of paragraph numbers... I want to format 
    val parasToFormat = List(2, 10, 15, 20) 

    val allParagraphs = sourceXWPFDocument.getParagraphs 

    for ((paragraph, index) <- allParagraphs.zipWithIndex) { 
    if(parasToFormat.contains(index)) { 
     formatParagraph(paragraph) 
    } 
    } 

    val outputDocx = new FileOutputStream(new File(outputDocumentPath)); 
    xwpfDocument.write(outputDocx) 
    outputDocx.close() 

} 

def formatParagraph(paragraph: XWPFParagraph): Unit = { 
    // Do some color changing to few runs 
    // Add few runs with new text. 
} 

Zum größten Teil funktioniert alles gut. Die Ausgabe docx öffnet alles in LibreOffice auf meinem Ubuntu.

Aber, wenn ich diese Ausgabe docx auf ein Windows-System übertrage, und versuche, diese Ausgabe docx in MS Word zu öffnen, bekomme ich unendliche (immer wachsende) Müllseiten.

Alle Vermutungen von den Weisen der Poi-Gemeinschaft sind willkommen.

Auch ... Einer meiner Vermutungen ist - Möglicherweise sind die Zeilenenden in den Dateien MS Word verwirrend. Als Ubuntu verwendet (LF - \n) Zeilenenden, während Windows verwendet (CRLF - \r\n). Wenn das tatsächlich das Problem ist ... wie kann ich das beheben?

Obwohl ... Mein Code ist in Scala ... Ich denke, die ähnliche sollte auch für Java-Code gelten ... und die meisten Poi-Benutzer werden in Java-Community sein ... Also ich bin auch Java-Tag hinzufügen.

+0

Wer etwas raten ... ?? –

+0

haben Sie versucht, die Zeilenenden auf die Windows-Version zu ändern? Es bestätigt oder leugnet Ihren Verdacht, dass die Zeilenenden das Problem sind. Auf diese Weise können Menschen entweder durch eine Bestätigung auf den richtigen Weg gebracht werden, oder keine Zeit verschwenden, die auf einen falschen Weg geht, wenn das Problem etwas anderes ist. –

+0

Nun ... obwohl wir wissen, dass 'docx' Dateien praktisch Zip-Dateien sind, die verschiedene' xml's enthalten. Jetzt ... obwohl ich das in allen xml-Dateien ändern kann. Ich bin nicht wirklich sicher, wie man eine 'docx' Datei aus diesen modifizierten' xml's korrekt erstellt. Was bedeutet ... wir müssen die Zeilenenden irgendwie erzwingen, während wir in den Dateiausgabestream schreiben. –

Antwort

3

Nun ... also versuchte ich verschiedene Dinge und löste schließlich das Problem.

Grundsätzlich ist das Problem, das durch folgende sehr einfache Sache verursacht wurde,

def copyRunFontSizeAttribute(sourceRun: XWPFRun, targetRun: XWPFRun): Unit = { 
    targetRun.setFontSize(sourceRun.getFontSize) 
} 

Irgendwie die Schriftgröße einer Instanz Einstellung XWPFRun, lässt xWPFRunTarget auf den Rückgabewert von xWPFRunSource.getFontSize sagen (wo xWPFRunSource ist eine andere Instanz XWPFRun) verursacht einige sehr seltsame und unerwartete Ergebnisse.

Also ... im Moment habe ich alle diese Bits entfernt, wo ich diese copyRunFontSizeAttribute Sache tat, die das Problem löste.