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());
        }
    }
}
相关推荐
泡海椒1 小时前
JQuick-java (JQuick-ASM)性能优化原理:字节码生成与缓存机制深度解析
java·缓存·性能优化
光电笑映1 小时前
Linux 线程同步与互斥:锁的本质、条件变量与信号量的底层原理
linux·运维·服务器·开发语言·c++
Bs_MoneyMagnet1 小时前
基于springboot+vue的家居生活商城平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
微三云 - 廖会灵 (私域系统开发)1 小时前
Spring Boot实战:五级分销定价与自动分佣系统设计与实现
java·spring boot·后端
Json____1 小时前
从零构建在线拍卖系统:Java 全栈开发实践
java·开发语言·管理系统·it学习·wwwoop.com
2601_966949651 小时前
批量 K 线不只是提速:因子研究中的数据质量、复权与回测偏差
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
matlab代码1 小时前
基于matlab水果识别系统(西红柿、香蕉、梨、青椒)【源码64期】
开发语言·matlab
我命由我123451 小时前
Android Compose 开发,使用 ConstraintLayout,但是引入的是旧的 ConstraintLayout
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
王的宝库1 小时前
Gin + GORM
开发语言·golang·gin