11

我有一个 PDF 模板,其中包含启用了扩展功能的表单。使用iTextSharp填写此表单的字段后,使用acrobat reader 的用户会收到错误消息:

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

我用谷歌搜索了一下,但所有帖子都在谈论“启用”扩展功能,但是,我希望表单字段保持禁用状态并关闭扩展功能

这是我正在使用的示例代码:

using (var existingFileStream = new FileStream(fileNameExisting, FileMode.Open))
using (var newFileStream = new FileStream(fileNameNew, FileMode.Create))
{
    // Open existing PDF
    var pdfReader = new PdfReader(existingFileStream);

    // PdfStamper, which will create
    var stamper = new PdfStamper(pdfReader, newFileStream);

    var form = stamper.AcroFields;

    var fieldKeys = form.Fields.Keys;

    foreach (string fieldKey in fieldKeys)
    {
        if (fieldKey.Equals("Retailer Name"))
            form.SetField(fieldKey, retailerName);
    }
    // “Flatten” the form so it wont be editable/usable anymore
    stamper.FormFlattening = true;

    stamper.Close();
    pdfReader.Close();
}
4

2 回答 2

12

由于 iTextPdf 网站已完全改版,此处的链接已失效。但是没有这些链接也可以理解答案。

iText Keyword : Reader enabled PDFs指向以下信息:

由 Bruno Lowagie 于 2010 年 12 月 31 日星期五 - 16:37 提交

填写表格后,我的 PDF 显示以下消息:此文档启​​用了 Adob​​e Reader 中的扩展功能。该文档自创建以来已更改,并且不再使用扩展功能。请联系作者获取本文档的原始版本。如何避免此消息?

表单的创建者启用了文档阅读器。阅读器启用只能使用 Adob​​e 软件完成。您可以通过两种方式避免此消息:

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

它还指向示例ReaderEnabledForm.java(C#/iTextSharp 的等价物是ReaderEnabledForm.cs),它显示了如何做到这一点。

在你的情况下,这相当于打电话

pdfReader.RemoveUsageRights();

在创建之后PdfReader和创建之前PdfStamper.

/**
 * Removes any usage rights that this PDF may have. Only Adobe can grant usage rights
 * and any PDF modification with iText will invalidate them. Invalidated usage rights may
 * confuse Acrobat and it's advisabe to remove them altogether.
 */
public void RemoveUsageRights()
于 2013-07-25T09:20:14.153 回答
1

PdfStamper使用构造函数重载以追加模式填写表单

// PdfStamper, which will create
var stamper = new PdfStamper(pdfReader, fileStream, '\0', true);
于 2017-05-10T03:28:04.240 回答