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());
        }
    }
}
相关推荐
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 黑名单:取消黑名单
java·windows·交友
Pin_Qing9 小时前
账单没超,请求先被拒了
大数据·开发语言·人工智能
2601_962885729 小时前
如何用 Python 计算 VaR 和 CVaR(在险价值)?
开发语言·python
杨杨杨大侠9 小时前
DeepSeek Harness:连 Agent Loop 都能替换的插件架构
java·人工智能·agent
SL_staff9 小时前
私有化低代码运维三重雷区:JVS开源栈中的Kafka/ES/RabbitMQ治理实践
java·低代码·全栈
yuniko-n9 小时前
【算法】约瑟夫环问题
java·算法
郝亚军9 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
譕痕9 小时前
stripe 实例
java·开发语言·stripe·checksession
墨子夕9 小时前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式
骇客野人9 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维