我正在尝试使用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 :(得分:1)
OP在评论中澄清:
此注释是
FreeText
,如何查找和更改此文本框中显示的文本?
自由文本注释允许使用多种机制来设置显示的文本:
(有关详细信息,参见PDF规范ISO 32000-1第12.5.6.6节自由文本注释)
如果要使用其中一种机制更改文本,请确保删除或调整其他机制的条目内容;否则您的更改可能在某些观看者身上不可见或甚至不可见,但在其他观看者身上不可见。
我无法弄清楚如何确定是否有外观流。那是
/AP
财产吗?我检查了其中一个注释,它是一个包含单个条目的字典,其值为28 0 R
。
因此其中一个注释确实带有一个外观流。值为28 0 R
的单个条目可能具有 N 名称,以指示正常外观。 28 0 R
是对对象编号为28
且生成为0
的间接对象的引用。
如果您想更改文字内容但不想处理格式详细信息,则应删除 AP 条目。