当我将PDF注释到FDFMerge()并保存时,在Google Chrome浏览器的pdf查看器中打开PDF时,注释是不可见的。直接从acrobat打开相同文件或在PDFTron的WebViewer中打开时,注释是可见的。
如果我打开一个已经使用FDFMerge()但不能在chrome viewer中工作的PDF,我可以打开并在acrobat中保存文件,此时问题就会消失。
在FDFMerge()之后我需要做些什么才能使这些注释的行为与acrobat的解决方法完全相同?某些图层是否未完全创建?
答案 0 :(得分:2)
PDF中的注释可以具有所谓的外观流,这是对其外观的明确描述。如果缺少,则在查看时,大多数PDF阅读器将根据注释的属性生成新的外观流。
但是,Chrome不会生成这些Appearance Streams,它只会读取现有的Streams Streams。如果它们丢失,则注释根本不会出现。
另一方面,Safari会忽略Appearance Stream,并始终根据Annotation属性生成自己的。Acrobat检测到没有外观流,并添加它,这就是在使用Acrobat保存后Chrome中的注释显示的原因。
要回答您的实际问题,请在FDFMerge之后添加以下代码。
PageIterator itr = doc.GetPageIterator();
for (; itr.HasNext(); itr.Next())
{
System.Console.WriteLine("Page {0:d}: ", itr.GetPageNumber());
Page page = itr.Current();
int num_annots = page.GetNumAnnots();
for (int i=0; i<num_annots; ++i)
{
Annot annot = page.GetAnnot(i);
if (annot.IsValid() == false) continue;
if (annot.GetAppearance() == null)
{
// generate missing appearance
annot.RefreshAppearance();
}
}
}
这将确保每个注释都有一个外观流,但避免覆盖现有注释。