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

如何使用iText填写XFA表单?

扈德容
2023-03-14

代码:

using (FileStream pdf = new FileStream("C:/test.pdf", FileMode.Open))
using (FileStream xml = new FileStream("C:/test.xml", FileMode.Open))
using (FileStream filledPdf = new FileStream("C:/test_f.pdf", FileMode.Create))
{
   PdfReader.unethicalreading = true;
   PdfReader pdfReader = new PdfReader(pdf);
   PdfStamper stamper = new PdfStamper(pdfReader, filledPdf);

   stamper.AcroFields.Xfa.FillXfaForm(xml);
   stamper.Close();
   pdfReader.Close();
}

这段代码没有异常,一切似乎都很好,但是如果我打开填充的pdf,Adobe Reader会说这样的话:

此文档启用了扩展功能。此文档自创建以来已更改,无法再使用扩展功能。

有些字段填写正确,但我无法编辑。某些字段为空。若我通过单击Adobe Reader中的“导入数据”手动选择xml,则表单填写正确,所以我猜xml中并没有错误。

共有1个答案

解明辉
2023-03-14

您没有正确创建PdfStamper对象。使用:

PdfStamper stamper = new PdfStamper(pdfReader, filledPdf, '\0', true)

在您的代码中,您没有在附加模式下使用PdfStamper。这意味着iText将重新组织PDF中的不同对象。通常这不是问题。

但是:您的PDF是支持读卡器的,这意味着您的PDF是使用Adobe拥有的私钥进行数字签名的。通过重新组织PDF中的对象,该签名将被破坏。您刚才提到的信息表明了这一点:

此文档启用了扩展功能。此文档自创建以来已更改,无法再使用扩展功能。

您以一种不允许的方式更改了文档(请参阅我的书中题为“保留启用读者的表单的使用权限”的第8.7节)。

为了避免破坏签名,您需要在附加模式下使用PdfStamper。iText现在将保持原始文件的完整性,并在原始文件结束后附加新内容,而不是重新组织原始内容。

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

  • 我有一个基于XFA的pdf表单,我们需要使用java来填充它。你能建议最好的方法吗。我能够使用iText为pdf生成xfa xml。 我有从上面的代码生成的Pdf和Xfa XML。你能不能建议我如何继续下去,因为我似乎没有主意了。我试图检查XFA文档,但似乎不对。我没有xml,pdf非常复杂,因为它有许多字段,是一个动态XFA pdf表单。 您的帮助和建议将受到衷心的感谢。

  • 考虑到字段名称结构可能发生了变化,我尝试像第一次那样阅读format/fields。(代码如下)。但是,现在它告诉我没有要读取的字段()。 所以,我开始做一些搜索,并找到了参考另一种类型的PDF结构,他们可以切换到;XFA.老实说,我还没有找到任何令人满意的文档/示例,但我确实找到了一些代码,看起来应该可以在XFA PDF的结构中阅读。(代码如下)。我尝试了两种不同的方法。第一个基本说明XfaFi

  • 我需要将预填充的PDF/XFA表单设置为只读(因为在没有输入的情况下,例如文本、复选框、单选按钮等可以更改其值)。 对于常规AcroForms PDF和静态XFA表单,我可以通过在PdfStamper实例上调用setFormFlatting(true)来实现这一点。对于动态XFA表单,我必须将XDP的“字段”节点的“访问”属性设置为“只读”。 问题是,如何检测表单是否是动态XFA?不区分静态或动态

  • 问题内容: 我试图浏览到加利福尼亚网站http://kepler.sos.ca.gov/的描述页面。但无法走。 然后,我有一个html表单,在该表单上我正在提交请求,我无法在此处添加表单,但是它只是带有必需参数的对http://kepler.sos.ca.gov/的请求 我能得到并且从我来到这里之前的页面。 我究竟做错了什么? 码: 问题答案: 您要使用。这是Jsoup的有用功能。它能够找到在表单

  • 我创建一个列表,如下所示: 然后,我想在第一个子列表中插入10个,如下所示: 但是,我得到以下错误: 线程“main”java中出现异常。lang.IndexOutOfBoundsException:java中的索引:0,大小:0。util。ArrayList。java上的rangeCheck(ArrayList.java:653)。util。ArrayList。get(ArrayList.jav