如何使用PDFBox将多尺寸PDF页面导出为A4尺寸图片?
解决PDFBox导出多尺寸PDF页面为A4尺寸图片的问题
你之前找的代码方向完全搞反啦——那是把图片添加到A4 PDF里的逻辑,而我们需要的是把PDF里不同尺寸(A3、Letter等)的页面直接渲染并调整为标准A4尺寸的图片。下面是修正后的实现思路和完整代码:
核心实现思路
- 加载目标PDF文档,逐页遍历处理
- 先按原页面尺寸渲染出高DPI的原始图片(保证清晰度)
- 按比例缩放原始图片,确保内容完整适配A4尺寸(保持宽高比,避免拉伸/裁剪)
- 将缩放后的图片绘制到A4尺寸的画布上并保存
完整代码实现
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.tools.imageio.ImageIOUtil; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; private static void exportPDFToA4Images(File sourcePdf, String destinationDir) { // 按300DPI计算的A4尺寸像素值(210mm*300/25.4≈2480px,297mm*300/25.4≈3508px) final int A4_WIDTH_300DPI = 2480; final int A4_HEIGHT_300DPI = 3508; try { File destDir = new File(destinationDir); if (!destDir.exists()) { destDir.mkdirs(); // 自动创建多级目标目录 } PDDocument document = PDDocument.load(sourcePdf); PDFRenderer pdfRenderer = new PDFRenderer(document); String baseFileName = "A4_Export_Image"; for (int pageIndex = 0; pageIndex < document.getNumberOfPages(); pageIndex++) { // 1. 按原页面尺寸渲染高DPI原始图片 BufferedImage originalImage = pdfRenderer.renderImageWithDPI(pageIndex, 300, ImageType.RGB); // 2. 计算适配A4的缩放比例(取宽高比最小值,保证内容完整) double scaleWidth = (double) A4_WIDTH_300DPI / originalImage.getWidth(); double scaleHeight = (double) A4_HEIGHT_300DPI / originalImage.getHeight(); double scaleRatio = Math.min(scaleWidth, scaleHeight); // 3. 创建A4尺寸的画布,默认白色背景 BufferedImage a4Image = new BufferedImage(A4_WIDTH_300DPI, A4_HEIGHT_300DPI, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = a4Image.createGraphics(); // 开启渲染优化,提升缩放后图片的清晰度 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); // 计算居中绘制的坐标,让内容在A4画布上居中显示 int x = (A4_WIDTH_300DPI - (int)(originalImage.getWidth() * scaleRatio)) / 2; int y = (A4_HEIGHT_300DPI - (int)(originalImage.getHeight() * scaleRatio)) / 2; // 绘制缩放后的原始图片到A4画布 g2d.drawImage(originalImage, x, y, (int)(originalImage.getWidth() * scaleRatio), (int)(originalImage.getHeight() * scaleRatio), null); g2d.dispose(); // 4. 保存最终的A4尺寸图片 String outputFilePath = destinationDir + File.separator + baseFileName + "_" + (pageIndex + 1) + ".png"; ImageIOUtil.writeImage(a4Image, outputFilePath, 300); System.out.println("已导出A4图片:" + outputFilePath); } document.close(); System.out.println("所有页面导出完成!"); } catch (IOException e) { e.printStackTrace(); } }
关键细节说明
- DPI可调:代码用300DPI是印刷级清晰度,如果只需要屏幕显示,可改成96DPI,同时对应修改A4尺寸的像素值(96DPI下A4为794×1123px)
- 背景控制:如果需要透明背景,可将
BufferedImage.TYPE_INT_RGB改为TYPE_INT_ARGB - 内容适配:通过取最小缩放比例,确保原页面内容完整显示在A4画布内,不会被裁剪
- 画质优化:开启抗锯齿和双线性插值,避免缩放后图片出现锯齿边缘
内容的提问来源于stack exchange,提问作者UserOfStackOverflow




