gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:32 24 4
gpt4 key购买 nike

我遇到了一个 Web API 的问题,它接收一个 PDF 文档(PDF 格式)作为 base64 编码的字符串,将它变成一个文件,填写一些字段(使用 iTextSharp PdfStamper 类)并将结果作为 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();

编辑:添加示例 PDF 文件

示例文件只是在互联网上找到的东西,我记得它在此处的另一篇文章中有链接。

我已尝试在此 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));

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

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

Adobe Reader pop-up

但是,如果您在附加 模式下进行标记,则使用权签名不会失效。您可以使用不同的构造函数来做到这一点:

stamp = new PdfStamper(reader, new FileStream("path to filled PDF form file", FileMode.Create), '\0', 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 表单定义( native PDF 表单类型)和一个 XFA 表单定义(一种仅使用 PDF 作为传输容器的 XML 格式)。

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

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

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

关于此方法,请阅读 this answer还有这个iText article .

关于c# - 部分填写后 PDF 表单不再可编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53098463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com