Aid*_*dal 3 c# itext pdf-form pdfstamper
我遇到了一个 Web API 的问题,该 API 接收 PDF 文档(PDF 表单)作为 base64 编码字符串,将其放入文件中,填充一些字段(使用iTextSharpPdfStamper
类)并将结果发送回Base64 编码的字符串,再次被制成文件。
当我随后尝试使用Foxit Reader打开此文件/文档时,我仍然可以编辑这些字段,但是当使用Adobe Acrobat Reader尝试打开此文件/文档时,这些字段不再可编辑。
在福昕阅读器中打开属性页并查看文档的安全属性时,它说一切都是允许的。然而,当在Adobe Acrobat Reader中执行相同操作时,它表示不允许评论、填写字段和签名(这是在将其发送到 API 之前的情况)。
不幸的是,我无法规定最终用户正在使用哪种 PDF 阅读器,所以我需要它是通用的。
我可以看到许多其他人都发布了类似的问题,但我没有在那里看到我的特定问题。
有谁知道这里发生了什么以及如何解决它?
编辑:添加代码
我正在这样做(稍微简化了一点,但相同):
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();
Run Code Online (Sandbox Code Playgroud)
编辑:添加了示例 PDF 文件
示例文件只是在互联网上找到的,我记得它是在此处的另一篇文章中链接的。
我尝试在此 PDF 表单中填写 2 个字段(名字和姓氏)。
第一个文件是从 base64 字符串创建的表单。
d94b6076-983d-47db-b496-a0ba383deda4.pdf
第二个文件是填写两个字段后的输出。
您的 PDF 包含混合 AcroForm/XFA 表单定义和使用权签名。这两个事实都使表格填写变得复杂。
您的 PDF 包含一种特殊类型的数字签名,即使用权签名。使用此类签名(使用 Adobe 为此任务生成的私钥)签名的 PDF 向 Adobe Reader 发出信号,表明在处理该 PDF 时应激活某些额外的 Adobe Reader 功能。
但是,如果签名无效,Adobe Reader 不仅不会激活这些额外功能,甚至会停用某些其他功能,而这些功能原本对未签名的文档有效。
你PdfStamper
像这样创建你的
stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create));
Run Code Online (Sandbox Code Playgroud)
该构造函数不会在追加模式下初始化标记。因此,加盖印记的 PDF 最终被写入为新的 PDF。这会使使用权签名失效,并且 Adobe Reader 再次打开 PDF 时会限制功能。
顺便说一句,当使用 Adobe Reader 打开 PDF 时,程序会告诉您:
但是,如果您在附加模式下进行标记,则使用权签名不会失效。您可以使用不同的构造函数来执行此操作:
stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create), '\0', true);
Run Code Online (Sandbox Code Playgroud)
最后true
激活附加模式。
或者,您可以删除使用权签名
PdfReader reader = new PdfReader("path to PDF form file");
reader.RemoveUsageRights();
Run Code Online (Sandbox Code Playgroud)
结果不再有使用权签名,特别是没有无效的签名。因此,Adobe Reader 为该文件提供了其标准功能。
不幸的是,保存 XFA 表单并不在其中,因此 PDF 可以编辑,但不能保存在 Adobe Reader 中。这可能不是您想要的。
关于这些选项,还可以参见这个旧答案;该答案谈到了“Reader-Enabling”,这是 Adobe 的一个术语,意为“应用使用权签名”。
该文件包含双重表单定义,一个 AcroForm 表单定义(本机 PDF 表单类型)和一个 XFA 表单定义(仅使用 PDF 作为传输容器的 XML 格式)。
XFA 表单定义提供更多功能,但仅受 Adobe 软件完全支持。对于混合表单,iText 对将数据填充到两个表单定义中的支持有限。不过,根据 XFA 定义中使用的具体功能,这可能会失败。
在这种情况下,您可能需要删除 XFA 表单定义并仅使用 AcroForm 表单定义。
reader.Catalog.GetAsDict(PdfName.ACROFORM).Remove(PdfName.XFA);
Run Code Online (Sandbox Code Playgroud)