我正在尝试使用 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 中打开输出文件时,任何注释中的文本都没有更改。我应该如何在注释中设置新值?
更新:我发现当我单击注释时出现的弹出框中的值正在更改。在某些情况下,当我在弹出框中修改此值时,更改将应用于注释。
正如OP在评论中澄清的那样:
这个注释是一个FreeText
,如何查找并更改此文本框中显示的文本?
自由文本注释允许通过多种机制来设置显示的文本:
- 预格式化的外观流,由N条目在AP字典
- 带有默认样式字符串的富文本字符串RC and DS分别
- 应用于给定内容的默认外观字符串DA and Contents分别
(详细信息请参见 PDF 规范ISO 32000-1 http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf第12.5.6.6节自由文本注释)
如果您想使用其中一种机制更改文本,请确保删除或调整其他机制的条目内容;否则,您的更改可能不可见,甚至对某些查看者可见,但对其他查看者不可见。
我不知道如何确定是否存在外观流。那是不是/AP
财产?我检查了其中一个注释,它是一本带有单个条目的字典,其值为28 0 R
.
So that 注释之一确实带有外观流。这其值为的单个条目28 0 R
大概有N名称来表示normal外貌。28 0 R
是对具有对象编号的间接对象的引用28
和一代0
.
如果您想更改文本内容但不想处理格式细节,则应删除AP entry.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)