无法更改/注释内容

时间:2016-04-27 22:53:05

标签: c# pdf itextsharp itext

我正在尝试使用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中打开输出文件时,没有任何文本在任何注释中发生更改。我该如何在注释中设置新值?

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

1 个答案:

答案 0 :(得分:1)

OP在评论中澄清:

  

此注释是FreeText,如何查找和更改此文本框中显示的文本?

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

  • 预格式化的外观流,由 AP 词典
  • 中的 N 条目引用
  • 富文本字符串,其中包含分别在 RC DS 中指定的默认样式字符串
  • 应用于 DA 内容中给出的内容的默认外观字符串

(有关详细信息,参见PDF规范ISO 32000-1第12.5.6.6节自由文本注释

如果要使用其中一种机制更改文本,请确保删除或调整其他机制的条目内容;否则您的更改可能在某些观看者身上不可见或甚至不可见,但在其他观看者身上不可见。

  

我无法弄清楚如何确定是否有外观流。那是/AP财产吗?我检查了其中一个注释,它是一个包含单个条目的字典,其值为28 0 R

因此其中一个注释确实带有一个外观流。值为28 0 R单个条目可能具有 N 名称,以指示正常外观。 28 0 R是对对象编号为28且生成为0的间接对象的引用。

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