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());
        }
    }
}
相关推荐
hasty15 分钟前
限制写了却没生效:OpenTelemetry Go 的 Unicode 截断边界
开发语言·后端·golang
一念春风23 分钟前
PDF浏览器(阅读、编辑、新建)
pdf
大侠归来26 分钟前
C语言与C++在基础语法上的区别
java·c语言·c++
小宋10211 小时前
SQL + RAG 混合问答实战:结构化指标与文档证据如何统一路由
java·jvm·人工智能·sql
bro_Java6661 小时前
链表进阶2:双向链表的构建
java·数据结构·链表
DianSan_ERP1 小时前
多平台订单自动下载与回传的技术实现:从消息推送到状态闭环引言
java·linux·服务器·前端·网络·架构·自动化
Joe_Wang51 小时前
【从0到1学习JVM · 13】点进JDK源码只有一个分号?搞懂本地方法栈与JNI机制
java·jvm·学习·本地方法栈
编码者卢布1 小时前
【App Service 】WebJobs 多实例实验:谁在运行,什么时候运行?
开发语言·python
kaixin_learn_qt_ing1 小时前
Qt抽屉窗体实现demo
开发语言·qt
quantdash_cc2 小时前
Python 获取实时行情后如何进行批量筛选?从全市场快照到策略候选池
开发语言·python·数据分析·量化交易·股票数据·quantdash