【问题标题】:PDF specification for appending用于附加的 PDF 规范
【发布时间】:2015-03-10 20:36:48
【问题描述】:

我正在编写一些代码,需要能够获取两个 pdf 并将它们附加到页面级别(例如,如果它们都是 2 页文档,则有一个 4 页文档,其中所有 4 页都与原始文档相同)。

不使用库的最佳方法是什么? PDF 规范是否使这变得容易?

【问题讨论】:

  • 不使用代码库,首先要做的是编写一个
  • 从头开始做这件事并非易事。那里有 700 多页的 PDF 文档格式规范(一个简单的谷歌搜索应该能够找到它)。要么使用免费图书馆,要么硬着头皮使用商业图书馆,这取决于您正在从事的是个人项目还是商业级项目。
  • 其他 cmets 已经说明了为什么您应该使用库,但我很好奇在您的要求中不使用库的“原因”。
  • 不幸的是,即使只是将两个文档合并为一个,我相信您也需要实施相当多的规范。它不仅仅是在幕后进行简单的页面连接(它必须重建文件的索引、重建所有元数据等)
  • 很抱歉重复发布,但无论如何用 javascript 将其推送给客户端可能并不明智,因为无法判断客户端是否启用了 javascript(或者他们是否正在使用低功率设备 - 例如,旧手机 - 对于此类设备来说这是相当大的工作量)。如果可能的话,这真的应该在服务器端完成。要在 javascript 中执行此操作,必须先将两个文档推送到网络上,然后在它们的末端组装。这需要对客户端做出一些非常激进的假设。

标签: pdf pdf-generation


【解决方案1】:

正如其他人已经提到的,如果您不使用 PDF 库,将两个 PDF 文件合并在一起将是一项艰巨的任务。您将需要对内部 PDF 结构有深入的了解。这是 PDF 规范的链接。这是一个开始的好地方 - PDF Reference

在我详细介绍之前,这里有一个合并两个非常简单的 PDF 文件的小实验,以及结果。这两个文件各为 34kb。生成的文件为 35kb,包含每个输入文件的页面。仅此一项就表明,除了合并两个输入文档的代码之外,还有更多的事情要做。比较输入和输出文档的代码,也表明它们已经完全重新创建,每个对象具有不同的对象 ID。

一个普通的 PDF 文档包含一个标题、正文、交叉引用表和一个预告片。 阅读 PDF 文档时,库从顶部开始,然后跳转到文档的末尾,向后移动,直到碰到交叉引用表。在此表中,库查找特定文档中的对象和字节偏移量。将新对象添加到文档时会更新或重新创建此表。

要手动合并两个文档,您必须将对象从第二个文档的正文移动到第一个文档中。然后,如有必要,您可以更新第一个文档的元数据。这里的困难任务是更新,并可能重新创建交叉引用表。您需要实现 PDF 规范的重要部分才能做到这一点。

如果您决定在项目中使用库,那么有一些相当轻量级的库可以解决问题。 PDFtk 库相当轻量级,可以使用 1 个命令进行 PDF 合并。它有一个免费版本,以及命令行功能。您应该能够设置一个简单的服务器在您的环境中托管它,然后通过 Java Script 调用它。

如果您的项目需要的不仅仅是免费库,那么还有APDFL,它是一个商业 PDF 处理库。它具有 .NET 或 Java 接口,因此您可以轻松创建一个服务器应用程序,为您合并 PDF 文件。

【讨论】:

  • 在几乎所有情况下,您都必须重新创建文件并重新创建交叉引用表,这仅仅是因为对象已编号,并且两个文件中的对象编号之间可能存在类。但这本身并不是一项非常困难的任务,因为交叉引用表只是每个对象在文件中所在位置的索引:换句话说就是簿记。困难的是您提到的合并方面,事实上在许多情况下您不必重复某些对象,因为您只需要它们一次......但是要简单,我认为您可以跳过大部分这些方面.
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 2023-03-23
  • 2018-01-02
相关资源
最近更新 更多