【问题标题】:why page tree obtained after creating PDF using pdfBox different?为什么使用pdfBox创建PDF后得到的页面树不同?
【发布时间】:2014-08-10 12:59:21
【问题描述】:

我正在尝试使用pdfBox 创建一个pdf document,下面提到了相同的代码段

 for(int j=0;j<26;j++)
         {
             PDPage page = new PDPage(PDPage.PAGE_SIZE_LETTER);
             document.addPage(page);
             PDPageContentStream content = new PDPageContentStream(document,page);
             content.setFont(font[j%15], 12);
             content.beginText();
             content.moveTextPositionByAmount(100, 700);
             content.drawString("PDF BOX TEXT CONTENT");
             content.endText();
             content.close();
             //generate data for first page

         }

我可以创建 pdf,但是我得到的页面树与我已经为 existing PDF file 获得的具有相同内容流的页面树不同,所以我无法理解为什么 pdfBox 的工作方式不同,而创建pdf文档?如果有人能在这方面有所启发,那将是一个很大的帮助。

区别在于: 我在检查 pre-existing PDF 时得到的页面树的深度为 3,而在使用 pdfBox 创建 PDF 时正在形成的树是 1 。所以,我添加的所有 26 个页面似乎都是我的页面树根的孩子得到。

以下是文件: 已有文件:https://www.dropbox.com/s/7o7nocg5g5o7qry/ABC.pdf 新文件:https://www.dropbox.com/s/uubs36tikqkl5w1/26ABC.pdf

【问题讨论】:

  • pdfBox 在创建 pdf 文档时的工作方式有所不同 - PDF 格式允许多种方式对相同的建模。因此,当您分析 PDF 时,您必须考虑所有变体。话虽如此,您忘记解释哪些差异实际上对您来说是个问题,以及您对这里的答案的实际期望。
  • 感谢 mkl 的建议。希望现在我的帖子很清楚。
  • PDF 规范 (link to Adobe's PDF 1.7) 中没有禁止页面树的深度。 PDF 创建者可以根据需要将其复杂化。
  • 为什么要关心页面树呢?您不需要它来访问单个页面,只需使用 document.getDocumentCatalog().getAllPages() 。
  • 谢谢,Tilman,但我只是对结构感到困惑,否则我尝试使用您稍后提到的 api。

标签: pdf pdfbox


【解决方案1】:

不同之处在于:我在检查 预先存在的 PDF 时得到的页面树的深度为 3,而在使用 pdfBox 创建 PDF 时形成的树 为 1

PDF 规范ISO 32000-1 允许页面树的任意深度和复杂性,参见。第 7.7.3 节 页面树

在您的情况下,PDFBox 选择了最简单的结构,所有页面都直接位于根节点下,而 预先存在的 PDF 的生产者选择了更复杂的结构。

页面树的结构可能是由于不同的原因,

  • 为了简单起见,可能会创建一个扁平树(如 PDFBox 的情况);
  • 平衡树可能是在包含许多页面的文档中优化页面访问的结果;
  • 内部节点也可以保存可继承的页面属性(例如媒体框);这有助于简化最终页面节点;
  • 将多个 PDF 合并为一个的程序也可以复制原始页面树并将其用作合并文档中的子树;结果可能看起来不太均匀;
  • 处理现有 PDF 的程序可能会以自己喜欢的方式添加新页面,而现有页面则按照原始 PDF 制作者的偏好进行组织;结果可能看起来不是很均匀;
  • 创建 PDF 的程序可能有自己的内部建模文档的方式,这反映在它们创建的结构中;
  • ...

规范明确提到优化页面访问和可继承属性是使用非平​​面树的原因。不过,它确实劝阻,更不用说出于其他原因禁止使用它们了。

OP 没有共享 预先存在的 PDF,因此我无法做出更充分的猜测,为什么该特定文档使用的不是像 PDFBox 这样的扁平树。

但最终这并不重要。 PDF 消费程序必须与任何合理的页面树结构相处,并且可以随意操作它。

当然,如果一页 PDF 的页面树有一百万个节点深,则没有理由抱怨此 PDF 没有,例如显示速度与页面树深度为 1 的等效文档一样快。

编辑 OP 同时分享了预先存在的 PDF。根节点有 5 个子节点,每个子节点也有 5 个(如果是最后一个,则为 6 个)子节点,它们是页面节点。没有继承的属性。

这看起来像是尝试创建平衡树以优化访问。考虑到文档大小(26 页),这似乎没有必要。生产者很可能具有创建这些平衡树以优化大型文档的功能,并且在这里也简单地使用了此功能。

另一方面,PDFBox 不会创建这种平衡的树,而是创建一个扁平的树。

【讨论】:

  • 这是有用的信息!!将更详细地研究。
  • 我已经在后期编辑中附加了这两个文件。请查看并提供更多可能的信息。
  • 我稍后再看。
  • 我稍后查看并相应地编辑了答案。 预先存在的 PDF 将其页面树组织为非平凡的平衡树(因此,它比 PDFBox 的平面结构更深)。这在页面非常多的文档的情况下可能是一个优势。但是,如果您有 26 页,这几乎不是优势,可能更多的是负担,很可能对任何合规的 PDF 消费者来说没有后果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2013-07-15
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
相关资源
最近更新 更多