部分填写后 PDF 表单不再可编辑

PDF Form no longer editable after partly filled

我遇到了 Web 问题 API 我有一个 PDF 文档(PDF 表单)作为 base64 编码的字符串,将其放入文件,填写一些字段(使用iTextSharp PdfStamper class) 并将结果作为 base64 编码字符串发回,并再次制作成文件。

当我之后尝试使用 Foxit Reader 打开这个 file/document 时,我仍然可以编辑字段,但是当尝试使用 Adobe Acrobat Reader,字段不再可编辑。

当打开 属性 页面并查看 Foxit Reader 中文档的安全属性时,它说一切都是允许的。 但是,当在 Adobe Acrobat Reader 中执行相同操作时,它表示不允许评论、填写字段和签名(这是在将其发送到 API).

不幸的是,我无法指定最终用户正在使用哪个 PDF reader,所以我需要它是通用的。

我可以看到许多其他人 post 讨论过类似的问题,但我没有在其中看到我的特定问题。

有谁知道这里发生了什么以及如何解决它?

编辑:添加代码

我正在这样做(略微简化,但相同):

PdfReader reader = new PdfReader("path to PDF form file");

stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create));

AcroFields form = stamp.AcroFields;

IDictionary<string, AcroFields.Item> fs = form.Fields;

foreach (var f in fs)
{
    form.SetField(f.Key, "some value");
}

stamp.Close();

编辑:添加了示例 PDF 文件

示例文件只是在 Internet 上找到的,我记得它在此处的另一个 post 中有链接。

我已尝试在此 PDF 表单中填写 2 个字段(名字和姓氏)。

第一个文件是从base64字符串创建的表单。

d94b6076-983d-47db-b496-a0ba383deda4.pdf

second文件是填写2个字段后的输出

d94b6076-983d-47db-b496-a0ba383deda4_filled.pdf

您的 PDF 包含混合 AcroForm/XFA 表单定义和使用权签名。这两个事实都使表格填写变得复杂。

使用权签名

您的 PDF 包含一种特殊类型的数字签名,即使用权签名。使用此类签名(使用 Adob​​e 为此任务生成的私钥)签名的 PDF 向 Adob​​e Reader 发出信号,表明在处理该 PDF 时应激活某些额外的 Adob​​e Reader 功能。

但是,如果签名无效,Adobe Reader 不仅不会激活这些额外的功能,它甚至会停用某些其他对未签名文档有效的功能。

你这样创建你的PdfStamper

stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create));

该构造函数不会在 append 模式下初始化标记。因此,盖章的 PDF 最终被写入为新的 PDF。这会使使用权签名无效,并且 Adob​​e Reader 会在再次打开 PDF 时限制功能。

顺便说一下,用 Adob​​e Reader 打开 PDF 后,程序会告诉您:

不过,如果你在append模式下戳记,使用权签名不会失效。您可以使用不同的构造函数来做到这一点:

stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create), '[=11=]', true);

最后的 true 激活追加模式。

或者您可以删除使用权签名

PdfReader reader = new PdfReader("path to PDF form file");
reader.RemoveUsageRights();

结果没有使用权签名,特别是没有失效的签名。因此,Adobe Reader 为该文件提供其标准功能。

不幸的是,保存 XFA 表单不在其中,因此 PDF 可以编辑但不能保存在 Adob​​e Reader 中。这可能不是你想要的。

关于这些选项,另请参见例如this old answer;该答案谈到“Reader-Enabling”,这是一个 Adob​​e 术语,表示“应用使用权签名”。

混合 XFA/AcroForm 表单定义

该文件包含一个双重表单定义、一个 AcroForm 表单定义(本机 PDF 表单类型)和一个 XFA 表单定义(一种 XML 格式,仅使用 PDF 作为传输容器。

XFA 表单定义提供更多功能,但只有 Adob​​e 软件完全支持。在混合表单的情况下,iText 对将数据填充到两个表单定义中的支持有限。但是,根据 XFA 定义中使用的确切功能,这可能会失败。

在这种情况下,您可能希望删除 XFA 表单定义并仅使用 AcroForm 表单定义。

reader.Catalog.GetAsDict(PdfName.ACROFORM).Remove(PdfName.XFA);

关于此方法请阅读 and this iText article