2015-04-07 11 views
11

Quindi ... fondamentalmente ho un file docx. E devo fare alcune modifiche di formattazione in pochi paragrafi e quindi salvare in un nuovo file. Quello che sto facendo essenzialmente sta seguendo.Infinite pagine fasulle in uscita docx usando 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. 
} 

Per la maggior parte tutto funziona correttamente. L'output docx sta aprendo tutto in LibreOffice su Ubuntu.

Tuttavia, quando trasferisco questo output docx su un sistema Windows e provo ad aprire questo docx di output in MS Word, ottengo pagine garbage infinite (sempre in crescita).

Qualsiasi ipotesi da parte della comunità saggia di Poi è il benvenuto.

Inoltre ... Una delle mie ipotesi è - Le terminazioni di riga nei file possono confondere MS Word. Come Ubuntu usa (LF - \n) terminazioni di linea mentre Windows utilizza (CRLF - \r\n). Se questo è effettivamente il problema ... allora come lo risolvo?

Anche se ... Il mio codice è in Scala ... Penso che il simile dovrebbe valere per il codice Java così ... e gli utenti maggior parte dei punti di interesse saranno nella comunità Java ... così io sono anche l'aggiunta di tag Java.

+0

Chiunque abbia qualche ipotesi ... ?? –

+0

hai provato a modificare le terminazioni di linea con la versione di Windows? Potrebbe confermare o negare il tuo sospetto che le terminazioni di linea siano il problema. In questo modo le persone possono essere indicate lungo la strada giusta da una conferma, o non perdere tempo a percorrere una strada sbagliata, se il problema è un'altra cosa. –

+0

Bene ... anche se sappiamo che i file 'docx' sono praticamente file zip contenenti vari' xml's. Ora ... anche se posso cambiarlo in tutti i file xml. Non sono sicuro di come creare correttamente un file 'docx' da questi' xml 'modificati. Il che significa ... dobbiamo in qualche modo forzare le terminazioni di linea mentre stiamo scrivendo sul fileoutputstream. –

risposta

3

Beh ... così ho provato varie cose e alla fine ho risolto il problema.

Fondamentalmente il problema è stato causato dal seguente cosa molto semplice,

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

qualche modo, impostando la dimensione del carattere di un'istanza XWPFRun, lascia dire xWPFRunTarget al valore restituito xWPFRunSource.getFontSize (dove xWPFRunSource è un altro esempio di XWPFRun) provoca risultati molto strani e inaspettati.

Quindi ... per il momento ho rimosso tutti quei bit in cui stavo facendo questa cosa copyRunFontSizeAttribute che ha risolto il problema.