Java 10x15cm面单PDF转换A4格式PDF

前言

最近有一个需求,对接跨境电商API,对方那边国外面单只返回10x15cm格式的pdf文件,但客户方要求是A4纸张格式,发给国外收件人打印取件。

未了避免拉伸原有格式导致条码变形等其他问题,我们决定是居中原有内容,其他地方留白。采用apache的pdfbox类库,来达成上述目的。

java 复制代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import org.apache.pdfbox.multipdf.LayerUtility;
import org.apache.pdfbox.util.Matrix;

import java.io.File;
import java.io.IOException;

public class ToA4Util {

    public static void main(String[] args) throws IOException {
        File inputFile = new File("/upload/fedex/2026-06-10/872880646260.pdf");
        File outputFile = new File("output_a4_centered.pdf");
        try (PDDocument doc = PDDocument.load(inputFile)) {
            // A4尺寸
            PDRectangle a4Rect = PDRectangle.A4;
            // 新建一个空文档,用于存放转换后的页面
            PDDocument newDoc = new PDDocument();
            for (PDPage oldPage : doc.getPages()) {
                // 获取原始页面实际尺寸
                PDRectangle oldBox = oldPage.getMediaBox();
                float oldW = oldBox.getWidth();
                float oldH = oldBox.getHeight();

                // 居中
                float offsetX = (a4Rect.getWidth() - oldW) / 2;
                float offsetY = (a4Rect.getHeight() - oldH) / 2;

                // 创建新的 A4 页面
                PDPage newPage = new PDPage(a4Rect);
                newDoc.addPage(newPage);

                // 将原页面内容作为 XObject 导入
                LayerUtility layerUtility = new LayerUtility(newDoc);
                PDFormXObject form = layerUtility.importPageAsForm(doc, oldPage);

                try (PDPageContentStream cs = new PDPageContentStream(
                        newDoc, newPage, PDPageContentStream.AppendMode.APPEND, false)) {
                    cs.transform(new Matrix(
                            1, 0, 0, 1, offsetX, offsetY));
                    cs.drawForm(form);
                }
            }

            newDoc.save(outputFile);
            System.out.println("转换完成:" + outputFile.getAbsolutePath());
        }
    }
}
相关推荐
文丑颜不良啊33 分钟前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang2 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪2 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息2 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼3 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff4 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff4 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
David猪大卫5 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
SL_staff6 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品
nice_lcj5206 小时前
【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端
java·后端·spring·spring ai·ai应用开发