当前位置: 首页 > 知识库问答 >
问题:

PDFBox 2.0.7无法设置XFA

沃阳曜
2023-03-14

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

我研究了填写表格(http://mail-archives.apache.org/mod_mbox/pdfbox-users/201510.mbox/browser)的步骤,并阅读了类似的问题结合XFA与PDFBox和PDFBox臃肿的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.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)*

在保存文档之前,我尝试关闭流(在我阅读的示例中,我没有看到有人这样做),但后来又出现了另一个错误

*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)*

非常感谢您的帮助

共有1个答案

金阳华
2023-03-14

我用文档解决了这个问题。getDocument()。createCOSStream(),正如TilmanHausherr所建议的,在设置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" );
 类似资料:
  • JSON查询应该可以使用多个搜索参数。为此,服务器需要获取每个参数作为搜索对象,例如: 我们在swagger中使用下面的声明: 问题是,从swagger生成的PHP库创建的请求如下: 这是服务器无法使用的。为了解决这个问题,我发现可以通过将属性“collectionFormat”设置为csv而不是multi来影响这个行为。 我的问题是,声明取自示例页面https://swagger.io/docs

  • 问题内容: 我正在尝试在Django中开发示例项目,并且在运行syncdb命令时遇到错误。 这是我的项目结构的样子: / Users / django_demo / godjango / bookings: 我的manage.py文件如下: 我的PYTHONPATH和DJANGO_SETTINGS_MODULE设置如下 我的WSGI.py文件如下所示: 当我运行python manage.py s

  • 我在设置kubernetes ingress-nginx时遇到了麻烦,以便在外部公开我的应用程序。下面是我所做的步骤: 应用程序部署: 创建了名为Ingress的命名空间 部署了statefulset集资源,用于在入口命名空间中描述我的应用程序(我们称之为testapp) 创建了ClusterIP服务,使我的应用程序在kube集群(testapp)中的入口命名空间中可用 入口nginx设置: nu

  • 我正在尝试执行以下操作以避免稍后未选中的转换: 强制取消行上未选中得强制转换: 我如何做到这一点而不需要抑制?

  • 所以我告诉IDEA它应该使用什么JDK,但它仍然要求我设置一个JDK。这是一个窃听器还是我遗漏了什么?我能应用任何变通方法使一切照常工作吗?

  • 我们在本地网络的共享环境中使用XAMPP。所有项目都有默认的mysql用户名和密码。最近我试图更改一个项目的用户名和密码。现在我无法访问phpmyadmin。它只显示以下消息: phpMyAdmin试图连接到MySQL服务器,但服务器拒绝了连接。确保您的用户名和密码与管理员提供的MySQL服务器的配置一致。 现在没有人能够访问phpmyadmin。我怎样才能解决这个问题?