2017-10-27 2 views
0

Ich versuche, die Werte in einem PDF-Formular mit dynamischen Eingabefeldern zu setzen, aber ich erhalte immer einen Fehler mit einem Stream-Writer.PDFBox 2.0.7 XFA kann nicht gesetzt werden

Ich habe die Schritte erforscht die Form (http://mail-archives.apache.org/mod_mbox/pdfbox-users/201510.mbox/browser) und lesen Sie ähnliche Fragen zu füllen Combining XFA with PDFBox und PDFBox bloated PDF file size

Gibt es eine andere Art und Weise, es zu tun? Irgendwelche Tipps, die mich in die richtige Richtung führen könnten?

Dies ist mein Code

PDDocument doc = null; 
FileOutputStream fos = null; 
COSStream cosout = null; 

try { 
    doc = PDDocument.load(new File(pdfTemplatePath)); 
    doc.setAllSecurityToBeRemoved(true); 

    PDDocumentCatalog cat = doc.getDocumentCatalog(); 
    PDAcroForm aform = cat.getAcroForm(); 

    if (aform.hasXFA()) { 

     PDXFAResource xfa = aform.getXFA(); 
     org.w3c.dom.Document xmlDoc = xfa.getDocument(); 

     Node xfaData = xmlDoc.getElementsByTagName("xfa:data").item(0); 
     HashMap<String, String> xmlFields = new HashMap<String, String>(); 

     setDataElements(xfaData, xmlFields); //I set node contents here 
     //System.out.println(xmlFields); 

     cosout = new COSStream(new ScratchFile(new File("C://tests//"))); 

     TransformerFactory.newInstance().newTransformer() 
       .transform(new DOMSource(xmlDoc), new StreamResult(cosout.createOutputStream())); 

     PDXFAResource resout = new PDXFAResource(cosout); 

     aform.setXFA(resout); 

    } 

    fos = new FileOutputStream(tempFilePath); 

    doc.save(fos); 
    doc.close(); 

} catch (Exception e) { 
    e.printStackTrace(); 
    success = false; 
} catch (Error err) { 
    err.printStackTrace(); 
    success = false; 
} finally { 
    if (doc != null) 
     doc.close(); 
    if (fos != null) 
     fos.close(); 
    if (cosout != null) 
     cosout.close(); 
} 

Dies ist der Fehler ich

bekommen
*java.lang.IllegalStateException: Cannot read while there is an open stream writer 
     at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:133) 
     at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1203) 
     at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:388) 
     at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:522) 
     at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:460) 
     at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:444) 
     at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1099) 
     at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:419) 
     at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1370) 
     at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1257) 
     at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1278)* 

Ich habe versucht, direkt den Stream zu schließen, bevor das Dokument zu speichern (ich es die Beispiele nicht sehen, alle, die ich tun lesen), aber dann bekam ich einen anderen Fehler

*java.io.IOException: COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed? 
     at org.apache.pdfbox.cos.COSStream.checkClosed(COSStream.java:82) 
     at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:130) 
     at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1203) 
     at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:388) 
     at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:522) 
     at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:460) 
     at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:444) 
     at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1099) 
     at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:419) 
     at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1370) 
     at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1257) 
     at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1278)* 

Jede Hilfe sehr geschätzt wird

+0

Ich weiß nicht viel über xfa, aber bitte versuchen Sie dies: 1) Erstellen Sie Ihren COSStream mit 'document.getDocument(). createCOSStream()', 2) Achten Sie darauf, Ihr 'cosout.createOutputStream()' -Objekt zu schließen, 3) schließen Sie 'fos', wenn Sie fertig sind oder speichern Sie es direkt in einer Datei. –

+0

Schreiben Sie das Transformationsergebnis in einen Zwischenspeicher wie z. B. 'File' oder' byte [] 'und lesen Sie es dann in den COSStream, da es entweder zum Schreiben oder Lesen geöffnet sein kann. –

Antwort

0

ich beschlossen dies mit document.getDocument().createCOSStream(), wie Tilman Hausherr vorgeschlagen und die erzeugte Output Schließen nach der RFA Ressource Einstellung sieht der Code wie dieser

COSStream cs = doc.getDocument().createCOSStream(); 
OutputStream os = cs.createOutputStream(); 

Result outputTarget = new StreamResult(os); 
Transformer t = TransformerFactory.newInstance().newTransformer(); 
t.transform(new DOMSource(xmlDoc), outputTarget); 

PDXFAResource resout = new PDXFAResource(cs); 

aform.setXFA(resout); 
os.close(); 
doc.save("test.pdf"); 
Verwandte Themen