2

当我将 FDFMerge() 注释放入 PDF 并保存时,在谷歌浏览器的 pdf 查看器中打开 PDF 时,注释不可见。直接从 acrobat 打开同一文件或在 PDFTron 的 WebViewer 中打开时,注释可见。

如果我打开一个已被 FDFMerge()d 但无法在 chrome 查看器中工作的 PDF,我可以在 acrobat 中打开并保存该文件,此时问题就消失了。

在 FDFMerge() 之后我需要做些什么来让这些注释的行为与 acrobat 解决方法完全相同?某些层没有完全创建吗?

4

1 回答 1

3

PDF 中的注释可以具有所谓的外观流,这是对其外观的明确描述。如果它丢失,那么在查看时,大多数 PDF 阅读器将根据注释的属性生成一个新的外观流。

但是,Chrome 不会生成这些外观流,它只会读取现有的。如果它们丢失,注释将根本不会出现。

另一方面,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();
        }
    }
}

这将确保每个注释都有一个外观流,但避免覆盖现有的。

于 2016-05-03T16:16:35.437 回答