用于附加的 PDF 规范

PDF specification for appending

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

在不使用库的情况下,最好的方法是什么? PDF 规范是否使这变得容易?

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

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

普通的 PDF 文档包含页眉、正文、交叉引用 table 和结尾。 阅读 PDF 文档时,库从顶部开始,然后跳到文档的末尾,向后移动,直到它碰到交叉引用 table。在此 table 中,库在特定文档中查找对象和字节偏移量。此 table 会在新对象添加到文档时更新或重新创建。

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

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

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