如何使用 Java 中的 API 更改 PDF 纸张大小

简介: 如何使用 Java 中的 API 更改 PDF 纸张大小

世界上几乎每个企业每天都以某种身份处理 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(编程语言)


目录
相关文章
|
26天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
2天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
308 14
|
18天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
5天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
20天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
22天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2584 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
4天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
177 2
|
2天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
102 65
|
6天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
283 2
|
22天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1580 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码