从长远来看,要求我们的 Java 文件处理应用程序作 PDF 文档只会增加它们的价值。PDF 是当今世界上最流行、使用最广泛的文件类型,而且这种情况不太可能很快改变。
介绍
在本文中,我们将专门学习如何在 Java 中将 PDF 文件划分为一系列单独的 PDF 文档,从而在原始文件的每一页中生成一个新的 PDF,并且我们将讨论开源和第三方 Web API 选项,以促进在我们的代码中实现该编程工作流。我们将从高级概述开始,了解如何构建 PDF 文件以使这种类型的工作流程成为可能。
区分 PDF 和 Open-Office XML 文件类型
最近几个月,我写了很多关于 MS Open-Office XML (OOXML) 文件(例如 DOCX、XLSX 等)的文章——值得注意的是,PDF 文件非常不同。
OOXML 文件的结构是包含文档格式说明的 XML 文件的 zip 压缩包,而 PDF 文件使用二进制文件格式,该格式优先考虑布局保真度,而不是结构化数据表示和可编辑性。换句话说,PDF 文件更关心内容的视觉外观,而不是其辅助功能;如果我们尝试将信息直接从 PDF 文件复制并粘贴到另一个文档中,我们可能会自己注意到这一点。
了解 PDF 文件如何管理单个页面
PDF 文档中的每个单独页面都组织在称为“页面树”的分层部分中。在此 Tree 中,每个页面都表示为其自己的独立对象,并且每个页面对象都引用其自己的内容流(即,文件在打开时应如何呈现页面)和资源(即,文件应在每个页面上使用哪些字体、图像或其他对象)。在任何给定的 PDF 页面上找到的每个资源在 PDF 目录中都包含一个特定的字节偏移引用(称为交叉引用表),该引用将对象定向到特定的页面位置加载。
如果我们过去花时间查看过任何文档文件结构,这听起来应该很熟悉。可能不太熟悉的是,使用 PDF 页面树中的每个页面对象构建一系列新的独立 PDF 文档的路径。
从拆分的 PDF 页面创建新的 PDF 文件
我们流程的后一阶段包括提取和随后克隆 PDF 页面内容,包括保留必要的资源(页面渲染说明)和为每个 PDF 页面维护正确的对象引用(内容位置说明)。我们用于处理此阶段流程的 API 通常会从原