You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用PDFBox将多尺寸PDF页面导出为A4尺寸图片?

解决PDFBox导出多尺寸PDF页面为A4尺寸图片的问题

你之前找的代码方向完全搞反啦——那是把图片添加到A4 PDF里的逻辑,而我们需要的是把PDF里不同尺寸(A3、Letter等)的页面直接渲染并调整为标准A4尺寸的图片。下面是修正后的实现思路和完整代码:

核心实现思路

  1. 加载目标PDF文档,逐页遍历处理
  2. 先按原页面尺寸渲染出高DPI的原始图片(保证清晰度)
  3. 按比例缩放原始图片,确保内容完整适配A4尺寸(保持宽高比,避免拉伸/裁剪)
  4. 将缩放后的图片绘制到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

火山引擎 最新活动