前言
最近有一个需求,对接跨境电商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());
}
}
}