Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PDFBox 2.0.7无法设置XFA_Java_Pdf_Pdfbox_Xfa - Fatal编程技术网

Java PDFBox 2.0.7无法设置XFA

Java PDFBox 2.0.7无法设置XFA,java,pdf,pdfbox,xfa,Java,Pdf,Pdfbox,Xfa,我试图在具有动态输入字段的pdf表单中设置值,但流编写器不断出错 我研究了填写表格的步骤,并阅读了类似的问题和建议 有不同的方法吗?有什么建议可以指引我正确的方向吗 这是我的密码 PDDocument doc = null; FileOutputStream fos = null; COSStream cosout = null; try { doc = PDDocument.load(new File(pdfTemplatePath)); doc.setAllSecurity

我试图在具有动态输入字段的pdf表单中设置值,但流编写器不断出错

我研究了填写表格的步骤,并阅读了类似的问题和建议

有不同的方法吗?有什么建议可以指引我正确的方向吗

这是我的密码

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();
}
在保存文档之前,我尝试关闭流。我没有看到任何人这样做。我阅读了一些示例,但后来我又出现了另一个错误

*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)*
非常感谢任何帮助

我用document.getDocument.createcostream解决了这个问题,正如建议的那样,在设置XFA资源后关闭创建的outputstream,代码如下所示

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" );

我对xfa了解不多,但请尝试以下操作:1使用document.getDocument.createCOSStream创建您的COSStream,2在完成后小心关闭您的cosout.createOutputStream对象,3在完成后关闭fos或直接保存到文件中。将转换结果写入中间存储,如文件或字节[]然后将其读入Costream,因为它可以打开进行写入或读取。
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" );