2013-07-25 74 views
9

我有一个启用了扩展功能的表单的PDF模板。使用iTextSharp的这个表单的字段填写后,与Acrobat Reader的用户得到的错误消息:使用iTextSharp禁用扩展功能

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

我GOOGLE了一下,但所有的帖子谈“启用”扩展功能,但是,我想表单字段保持残疾人和扩展功能关闭

这里的样本代码我使用:

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(); 
} 
+0

也许你不应该保存它,但创意用iTextSharp替代它的一个新实例?由于您刚刚重新创建了文档,因此不做任何更改?我不熟悉PDF扩展功能或iTextSharp。你的代码与iTextSharp的用法有什么关系?我目前正在阅读Java API,但其安静的大... –

+0

@Mike:我正在创建一个新的实例。我更新了问题以显示我正在使用的代码。 – Jags

回答

10

iText KeywordReader enabled PDFs指向以下信息:

布鲁诺Lowagie于星期五,12/31/2010 - 16:37

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

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

  • 删除使用权限。这将导致不再启用Reader的表单。例如:如果文档的创建者允许填写的表单可以在本地保存,那么在删除使用权之后将不再可能。
  • 在追加模式下填写表格。这将导致更大的文件大小,但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() 
0

之前使用PdfStamper constractor超载

填写追加模式形式
// PdfStamper, which will create 
var stamper = new PdfStamper(pdfReader, fileStream, '\0', true);