使用 iText 进行 Acroform 编辑的 Pdf

Posted

技术标签:

【中文标题】使用 iText 进行 Acroform 编辑的 Pdf【英文标题】:Pdf with Acroform editing using iText 【发布时间】:2015-06-08 11:28:02 【问题描述】:

我正在使用 iText 将文本添加到现有的 pdf 文件中。它适用于简单的 pdf,但在使用 AcroForms 的 pdf 时存在问题。

我的代码:

    PdfReader reader = new PdfReader("/Users/simple-user/Downloads/acroform.pdf");
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
            "/Users/simple-user/Downloads/acroform2.pdf"));
    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
            BaseFont.NOT_EMBEDDED);

    PdfContentByte over = stamper.getOverContent(1);
    over.beginText();
    over.setFontAndSize(bf, 10);
    over.setTextMatrix(107, 107);
    over.showText("page updated");
    over.endText();

    stamper.close();

错误信息: “此文档在 Adob​​e Acrobat Reader DC 中启用了扩展功能。该文档自创建以来已更改,扩展功能的使用不再可用。请联系作者获取此文档的原始版本。”

我没有想要添加到文件中的文本

任何想法我缺少什么?

【问题讨论】:

有什么问题?任何错误信息?我们需要更多细节才能提供帮助。 哦抱歉忘记了。错误消息“此文档在 Adob​​e Acrobat Reader DC 中启用了扩展功能。该文档在创建后已更改,扩展功能的使用不再可用。请联系作者获取此文档的原始版本。”并且没有我想添加到文件中的文本 请编辑您的问题以包含此错误,并尽可能详细。 【参考方案1】:

您的诊断是错误的。 问题与 AcroForms 的存在无关。 问题与您的文档是否Reader Enabled有关。只能使用 Adob​​e 软件启用阅读器。这是一个需要使用 Adob​​e 的私钥进行数字签名的过程。当存在有效签名时,特定功能(在签名时的使用权限中定义)在 Adob​​e Reader 中解锁。

请查看此问题的答案以了解如何检测 PDF 是否已启用阅读器:How to Check PDF is Reader enabled or not using C#?

您更改了此类 PDF 的内容,因此您破坏了签名。破坏此签名是导致丑陋错误消息的原因:

本文档启用了 Adob​​e Acrobat Reader DC 中的扩展功能。该文档自创建以来已更改,并且不再使用扩展功能。请联系作者获取本文档的原始版本。

有两种方法可以避免此错误消息:

    删除使用权限。这将导致不再启用 Reader 的表单。例如:如果文档的创建者允许将填写的表单保存在本地,则在移除使用权限后将不再可能。 以追加模式填写表格。这会导致文件变大,但会保留阅读器启用。

删除使用权限如下:

PdfReader reader = new PdfReader(path_to_file);
if (reader.hasUsageRights()) 
    reader.removeUsageRights();
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(path_to_new_file));
    stamper.close();

reader.close();

在追加模式下使用 iText 是这样完成的:

PdfReader reader = new PdfReader(src);
PdfStamper stamper =
    new PdfStamper(reader, new FileOutputStream(dest), '\0', true);
stamper.close();
reader.close();

注意PdfStamper中的额外参数。

【讨论】:

1.您为什么要使用要求您成为 PDF 专家的方法?为什么不使用 iText 中提供的便捷方法? 2. 您在位置 x=107 处添加文本; y = 107。你怎么知道这些是有效坐标? 下载 pages.itextpdf.com/ebook-***-questions.html 并搜索 Watermark 示例(有几个)。您的代码看起来像是从某处复制/粘贴的。如果您喜欢复制/粘贴,为什么不从大师本人那里复制/粘贴呢? ;-)

以上是关于使用 iText 进行 Acroform 编辑的 Pdf的主要内容,如果未能解决你的问题,请参考以下文章

使用 iText 填写静态 XFA PDF

IText7如何解码字段的默认外观int字体对象及其属性

C# 中的 AcroForm PDF 到普通 PDF

IText - 使用 PdfDictionary 和 PDF Stamper 编辑西班牙语文档

Fabric.js - 分组 iText 不可编辑

使用DevExpress Reports和PDF Viewer创建AcroForm Designer