世界上几乎每个企业每天都以某种身份处理 PDF 文档,仅此一项就确定了利用利基技术自动化独特 PDF 工作流程的价值。本文的目的是演示一种高效的 Web API 解决方案,Java 开发人员可以使用该解决方案在常见的 ISO 216 A 系列纸张大小(A0 到 A7)之间快速调整 PDF。
但是,在进行演示之前,我们首先需要花点时间了解 ISO 216 标准,然后简要回顾一下 PDF 文件结构如何处理页面大小,以便进行编程调整。
ISO 216 PDF 纸张尺寸定义
PDF 是最初在数十个其他应用程序中创建的内容的标准数字发布格式,它还经常用于格式化和物理打印工作场所 ID、广告小册子和许多其他材料。
确保 PDF 内容与标准物理打印材料相对应是一门科学,而这门科学是由国际标准化组织 (ISO) 制定的。这 216第ISO 发布的标准定义了各种 PDF 纸张尺寸,这些尺寸源于一个常见的纵横比,即 2 的平方根。这些不同的纸张尺寸(分为 A 系列、B 系列和 C 系列)使得在不改变布局的情况下缩放文档变得容易,最重要的是,它们有助于确保全球不同设备(即打印机和复印机)之间的兼容性。A 系列,分为 A0(最大)到 A7(最小),是迄今为止世界上使用最多的纸张尺寸系列。A4 (210 x 297 毫米) 是我们发现大多数 PDF 文档使用的标准默认字母大小。
PDF 文件结构:定义页面大小
虽然我们人类更容易将纸张大小视为 A0 和 A7 之间的任意范围,但计算机不需要以这种方式查看。就我们的 PDF 文档而言,PDF 中每个页面的大小只是在页面对象字典的条目中指定。这个“盒子”是一个数组,它试图定义物理介质的边界,而不是数字媒体的边界,任何给定的页面都打算在上面显示或打印。中每个页面的每个角都由一个数字定义,这些数字对应于一个点系统(每个点 = 1/72 英寸),该系统共同定义了页面矩阵。为了说明这一点,前面提到的标准 A4 字母尺寸 (210 x 297 mm) 在 as 中定义为,因为 210 mm = 595 磅和 297 mm = 842 磅。MediaBoxMediaBoxMediaBox`[0, 0, 595, 842]`
因此,当我们以编程方式更改 PDF 文档的纸张大小时,我们需要将 PDF 文件结构导航到数组,然后从那里,我们需要通过将 A 系列毫米定义转换为文档准备理解的基于点的坐标来确定目标 ISO 大小。MediaBox
开源解决方案:更改纸张大小
当然,像往常一样,我们(谢天谢地)不必从头开始编写超级复杂的程序来处理这些步骤。如果我们想走开源路线,我们可以使用像 Apache PDFBox 这样的东西——一个流行的库,用于以各种方式操作 PDF,包括改变 PDF 纸张大小——并利用该类与 PDF 进行交互,从而定义我们的 PDF 页面的大小。让我们用相当少的代码来处理整个操作:我们可能遇到的唯一问题是在这个过程中如何管理内存。我们计划用于物理打印的 PDF 往往是大文件,我们可能会发现在本地内存缓冲区中大规模处理此类文件会消耗更多的资源,而不是我们愿意承诺的资源。这是 Web API 可以介入并提供一些额外灵活性的地方;它既可以简化操作,又可以减少完成工作所需的本地处理能力。PDRectangleMediaBoxPDRectangle
Web API 解决方案:更改纸张大小
通过使用 Web API 来处理我们的 PDF 纸张大小调整,我们可以将大部分繁重的 PDF 文件处理卸载到外部云托管的端点,并且我们可以在操作完成后简单地下载操作结果。我们还可以完全避免从库中调用独立类,而是利用简单、可读且直观定义的变量,这些变量专门用于处理纸张大小的操作。
在下面的演示中,我们将逐步完成调用专用 Web API 所需的每个步骤,该 API 允许我们通过简单的字符串输入在 A0 和 A7 之间调整纸张大小(例如,输入“A5”会将文档中的所有页面大小更改为 ISO 标准 148 x 210 毫米)。这是一个免费的解决方案,它只需要一个免费的 API 密钥就可以永久使用(每月 800 次 API 调用)。
步骤 1:安装 Maven SDK
要开始构建我们的 API 调用,我们首先需要将存储库和依赖项信息添加到我们的文件中(用于动态编译库)。pom.xmlJitpack
让我们添加以下存储库引用:
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
然后,让我们添加以下依赖项引用:
<dependencies> <dependency> <groupId>com.github.Cloudmersive</groupId> <artifactId>Cloudmersive.APIClient.Java</artifactId> <version>v4.25</version> </dependency> </dependencies>
步骤 2:添加导入语句
现在,我们将添加以下导入:
// Import classes: //import com.cloudmersive.client.invoker.ApiClient; //import com.cloudmersive.client.invoker.ApiException; //import com.cloudmersive.client.invoker.Configuration; //import com.cloudmersive.client.invoker.auth.*; //import com.cloudmersive.client.EditPdfApi;
步骤 3:配置 API 密钥授权
在以下代码片段中,我们将设置 API 客户端并配置 API 密钥:
ApiClient defaultClient = Configuration.getDefaultApiClient(); // Configure API key authorization: Apikey ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey"); Apikey.setApiKey("YOUR API KEY"); // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null) //Apikey.setApiKeyPrefix("Token");
第 4 步:实例化 API
在最后一步中,我们将创建一个 API 实例,定义输入文件和所需的纸张大小(请记住,这些是 A0 到 A7 的值),然后调用
API: EditPdfApi apiInstance = new EditPdfApi(); File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on. String paperSize = "paperSize_example"; // String | The desired paper size for the resized PDF document. Size ranges from A7 (smallest) to A0 (largest). try { byte[] result = apiInstance.editPdfResize(inputFile, paperSize); System.out.println(result); } catch (ApiException e) { System.err.println("Exception when calling EditPdfApi#editPdfResize"); e.printStackTrace(); }
- 块确保我们的程序能够优雅地处理任何潜在的错误。我们将获得信息丰富的消息和堆栈跟踪,以诊断和解决运营中的问题。trycatch
我们回顾了 ISO 216 纸张尺寸定义的相关性,讨论了 PDF 文件结构如何独立于 ISO A、B 和 C 系列定义存储和表示纸张尺寸信息,然后研究了两种解决方案(一种是开源的,一种是独立的 Web API),用于以编程方式调整 PDF A 系列纸张大小。
公文PDF格式Web APIJava(编程语言)