2016-04-27 175 views
0

我试图使用iTextSharp更改某些PDF注释中的文本。这是我的代码:无法更改/注释的内容

void changeAnnotations(string inputPath, string outputPath) 
    { 
     PdfReader pdfReader = new PdfReader(inputPath); 
     PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(outputPath, FileMode.Create)); 

     //get the PdfDictionary of the 1st page 
     PdfDictionary pageDict = pdfReader.GetPageN(1); 

     //get annotation array 
     PdfArray annotArray = pageDict.GetAsArray(PdfName.ANNOTS); 

     //iterate through annotation array 
     int size = annotArray.Size; 
     for (int i = 0; i < size; i++) 
     { 

      //get value of /Contents 
      PdfDictionary dict = annotArray.GetAsDict(i); 
      PdfString contents = dict.GetAsString(PdfName.CONTENTS); 

      //check if /Contents key exists 
      if (contents != null) 
      { 

       //set new value 
       dict.Put(PdfName.CONTENTS, new PdfString("value has been changed")); 
      } 
     } 
     pdfStamper.Close(); 
    } 

当我在Adobe Reader中打开输出文件时,任何注释中的文本都没有改变。我应该如何在注释中设置新值?

更新:我发现在单击注释时出现的弹出框中更改了值。在某些情况下,当我在弹出框中修改此值时,更改将应用​​于注释。

+0

您不检查相关注释是否有外观流。如果确实如此,则PDF查看器可以选择仅在该流中预先定义注释,而不是生成自己的外观。此外,**内容**可能会或可能不会显示为注释文本,参见参考资料。规范:*应为注释显示的文本,或者,如果此类注释不显示文本,则以人类可读的形式*替代描述注释的内容。 – mkl

+0

@mkl,我无法弄清楚如何确定是否有外观流。那是'/ AP'属性吗?我检查了其中一个注释,它是一个单个条目的值为'28 0 R'的字典,但是'annotArray'中没有任何项目具有该值。这个注释是一个'FreeText',我如何查找和更改显示在这个文本框中的文本? – sigil

回答

1

正如评论明确了OP:

此注解是一个FreeText,我该如何查找和更改中显示的有关该文本框中的文本?

自由文本注释允许多种机制来设置显示的文本:

  • 甲预格式化外观流,通过在AP字典
  • A中的Ñ入口参照富文本字符串,默认样式字符串为RCDS分别为
  • 甲默认外观串应用于DA给出的含量和内容分别

(详情参见PDF规范ISO 32000-1部分12.5.6.6 免费文本注释

如果你想改变使用这些机制中的一个文本,请确保您删除或调整条目的内容为其他机制;否则您的更改可能在某些查看器中不可见或不可见,但在其他查看器中不可见。

我不知道如何确定是否有外观流。这是/AP属性?我检查了其中一个注释,它是一个单词条目,其值为28 0 R

这样其中一个注释确实带有一个外观流。 单个条目的值为28 0 R想必N名称表示正常的出现。 28 0 R是对物体编号28和代码0的间接对象的引用。

如果要更改文本内容但不想处理格式详细信息,应删除条目。

+0

从每个注释中删除** AP **键可解决此问题。删除此密钥是否存在风险,例如,如果注释没有此密钥,是否存在某些Adobe Reader/Acrobat功能将失败? – sigil

+0

主要的风险是,有一些简单的PDF查看器(大多数所谓的预览器)依赖于呈现流存在,并没有任何代码来自己创建它们。在删除** AP **之后,这些观看者完全不会呈现您的注释。 – mkl

+0

是的,我发现他们不显示在Outlook的预览。有没有另外一种方法来完成这个?参见我刚刚发布的[this question](http://stackoverflow.com/questions/37014984/how-to-read-text-of-appearance-stream);在这两种情况下,解决方案都涉及识别外观文本的设置位置。 – sigil