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

PDFBox:通过重复添加包含表单的一页模板来填写PDF

姚钊
2023-03-14

下面是Java pdfBox的问题:填写pdf表单,将其附加到pddocument中,然后重复一遍,我在将克隆页面附加到新pdf中时遇到了问题。

这个页面上的代码看起来很有趣,但对我来说并不管用。

事实上,答案不起作用,因为这是你一直修改并添加到列表中的同一个PDField。所以下次你用名字的首字母叫“getField”,它就找不到了,你会得到一个NPE。我试过使用尼斯github项目中使用的pdfbox版本(1.8.12),但不明白他是如何做到这一点的。

我今天也遇到了同样的问题,试图在页面上添加一个表单,其中包含不同的值。我想知道解决方案是否不是复制字段,但无法成功地正确执行。我总是以PDF结尾,每个表单包含相同的值。

(我为Mkl提供了模板文档的链接,但现在我删除了它,因为它不属于我)

编辑:按照Mkl的建议,我发现了我缺少的东西,但是复制每一页的性能真的很差。文件大小不令人满意。也许有一种方法可以优化这个,重用PDF中的类似部分。

共有1个答案

赵英资
2023-03-14

最后,我在每次都不重新加载模板的情况下让它工作了。因此,生成的文件是我想要的:不太大(164页为4Mb)。我想我以前犯过两个错误:一个是页面创建错误,另一个可能是字段复制错误。因此,如果有人碰巧遇到同样的问题,下面是工作代码。

表单创建:

    PDAcroForm finalForm = new PDAcroForm(finalDoc, new COSDictionary());
    finalForm.setDefaultResources(originForm.getDefaultResources())

页面创建:

    PDPage clonedPage = templateDocument.getPage(0);

    COSDictionary clonedDict = new COSDictionary(clonedPage.getCOSObject());

    clonedDict.removeItem(COSName.ANNOTS);
    clonedPage = new PDPage(clonedDict);
    finalDoc.addPage(clonedPage);

字段复制:(将字段重命名为唯一并设置值)

    PDTextField field = (PDTextField) originForm.getField(fieldName);
    PDPage page = finalDoc.getPages().get(nPage);
    PDTextField clonedField = new PDTextField(finalForm);
    List<PDAnnotationWidget> widgetList = new ArrayList<>();
    for (PDAnnotationWidget paw : field.getWidgets()) {
        PDAnnotationWidget newWidget = new PDAnnotationWidget();
        newWidget.getCOSObject().setString(COSName.DA,  paw.getCOSObject().getString(COSName.DA));
        newWidget.setRectangle(paw.getRectangle());
        widgetList.add(newWidget);
    }
    clonedField.setQ(field.getQ()); // To get text centered
    clonedField.setWidgets(widgetList);
    clonedField.setValue(value);
    clonedField.setPartialName(fieldName + cnt++);
    fields.add(clonedField);

    page.getAnnotations().addAll(clonedField.getWidgets());

在过程结束时:

    finalDoc.getDocumentCatalog().setAcroForm(finalForm);
    finalForm.setFields(fields);
    finalForm.flatten();
 类似资料:
  • 问题内容: 我有一个pdf表格,我正在尝试使用pdfBox填写表格并打印文档。我的工作非常适合1页打印作业,但我不得不尝试修改多个页面。基本上,这是一个具有基本信息和内容列表的表格。好吧,如果内容大于表格所能容纳的空间,则必须将其设为多页文档。我最终得到一个文档,该文档的第一页漂亮,然后其余所有页面都是空白模板。我究竟做错了什么? 问题答案: 您的代码中有两个主要问题: PDF的AcroForm元

  • 我的目标是用iText填写交互式PDF xfa表单。一切正常,但不幸的是,某些字段有JavaScript操作,我无法通过fillXfaForm()方法填充它们。我的问题是:如何以编程方式(在Java中)实现它?有可能吗? 我可以通过启用JS的Adobe Reader导入工具手动完成。 请参阅PDF表格:http://www.finanse.mf.gov.pl/documents/766655/14

  • 主要内容:将页面添加到PDF文档,示例在前一章中,我们已经学习了如何创建PDF文档。 创建PDF文档后,我们需要添加页面。 现在来了解如何在PDF文档中添加页面。 将页面添加到PDF文档 可以通过实例化类并使用类的方法将其添加到PDF文档来创建空白页面。 以下是创建一个空文档并向其中添加页面的步骤。 第1步:创建空白文档 通过实例化类创建一个空的PDF文档,如下所示。 第2步:创建一个空白页面 类表示PDF文档中的一个页面,因此可以通

  • 我制作了一个pdf表单,我正在尝试使用pdfBox填写表单并打印文档。我让它在单页打印作业中运行良好,但我不得不尝试修改多页。基本上这是一个表单,顶部有基本信息和内容列表。好吧,如果内容大于表单的空间,我必须将其设为多页文档。我最终得到了一个具有漂亮页面的文档,然后所有剩余页面都是空白模板。我做错了什么?

  • 我有一个页面模板,它应用于我的wordpress页面上的特定页面。通常,对于我的所有其他脚本,我将它们放在我的footer.php中,然后从那里漂亮地加载。在这个特定的页面上,我想加载一个脚本,这个脚本应该只在这个页面上运行。因此,在我的模板中,我将其包括如下内容: 不幸的是,在执行此操作时,我只会遇到如下错误: 未捕获类型错误:$(…)。任何不是函数的 WordPress中是否有一些方法只在特定

  • 当我使用这个长字段名时,我没有得到任何错误,但是得到的PDF不包含我放在字段中的值。我想可能字段名有问题,所以我使用了Pdftk工具,它只给出了作为字段名。但是当我仅仅使用它时,我会得到error。救命?