You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现PDF页面内容拉伸:如何放大页面并使图文适配新尺寸?

Java实现PDF页面内容拉伸(放大/缩小)的解决方案

Got it, let's tackle this PDF page scaling issue in Java—this is a common requirement, and I'll walk you through two reliable libraries to get it done properly, so all content (text, images, vector graphics) scales with the page.


方案一:使用iText 7库

iText is a mature, feature-rich PDF processing library that supports precise content scaling. It's widely used in enterprise projects for its stability.

1. 添加Maven依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.5</version> <!-- 建议使用最新稳定版 -->
</dependency>

2. 实现代码

import com.itextpdf.kernel.geom.AffineTransform;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;

import java.io.IOException;

public class PdfScaler {
    public static void scalePdf(String inputPath, String outputPath, float scaleFactor) throws IOException {
        // 自动关闭资源的try-with-resources语法
        try (PdfReader reader = new PdfReader(inputPath);
             PdfWriter writer = new PdfWriter(outputPath);
             PdfDocument sourceDoc = new PdfDocument(reader);
             PdfDocument targetDoc = new PdfDocument(writer)) {

            int pageCount = sourceDoc.getNumberOfPages();
            for (int i = 1; i <= pageCount; i++) {
                // 获取原页面
                com.itextpdf.kernel.pdf.PdfPage sourcePage = sourceDoc.getPage(i);
                // 获取原页面尺寸
                PageSize originalSize = sourcePage.getPageSize();
                // 计算新页面尺寸(原尺寸 × 缩放比例)
                float newWidth = originalSize.getWidth() * scaleFactor;
                float newHeight = originalSize.getHeight() * scaleFactor;
                PageSize newSize = new PageSize(newWidth, newHeight);

                // 创建新页面并设置尺寸
                com.itextpdf.kernel.pdf.PdfPage targetPage = targetDoc.addNewPage(newSize);
                // 将原页面转为Form XObject,方便统一缩放绘制
                PdfFormXObject pageXObject = sourcePage.copyAsFormXObject(targetDoc);

                // 获取新页面画布,应用缩放变换
                PdfCanvas canvas = new PdfCanvas(targetPage);
                AffineTransform transform = AffineTransform.getScaleInstance(scaleFactor, scaleFactor);
                canvas.concatMatrix(transform);
                // 绘制缩放后的页面内容
                canvas.addXObject(pageXObject, 0, 0);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        // 示例:放大1.5倍(scaleFactor>1为放大,<1为缩小)
        scalePdf("input.pdf", "scaled_output.pdf", 1.5f);
    }
}

核心要点

  • scaleFactor:控制缩放比例,比如0.8f是缩小到80%,1.2f是放大到120%
  • copyAsFormXObject:把整页内容转为可复用的XObject,确保文本、图片、矢量图形等所有元素同步缩放
  • concatMatrix:以页面左下角为原点应用缩放变换,保证内容位置与原页面完全对应

方案二:使用Apache PDFBox库

PDFBox是Apache旗下的开源PDF处理库,轻量易用,适合快速开发场景。

1. 添加Maven依赖

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.29</version> <!-- 最新稳定版 -->
</dependency>

2. 实现代码

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 java.io.IOException;
import java.io.File;

public class PdfBoxScaler {
    public static void scalePdf(String inputPath, String outputPath, float scaleFactor) throws IOException {
        try (PDDocument sourceDoc = PDDocument.load(new File(inputPath));
             PDDocument targetDoc = new PDDocument()) {

            for (PDPage sourcePage : sourceDoc.getPages()) {
                // 获取原页面媒体框尺寸
                PDRectangle originalRect = sourcePage.getMediaBox();
                // 计算新页面尺寸
                float newWidth = originalRect.getWidth() * scaleFactor;
                float newHeight = originalRect.getHeight() * scaleFactor;
                PDRectangle newRect = new PDRectangle(newWidth, newHeight);

                // 创建新页面并设置尺寸
                PDPage targetPage = new PDPage(newRect);
                targetDoc.addPage(targetPage);

                // 将原页面转为Form XObject
                PDFormXObject pageXObject = sourcePage.convertToFormXObject(targetDoc);

                // 绘制缩放后的内容
                try (PDPageContentStream contentStream = new PDPageContentStream(targetDoc, targetPage)) {
                    // 应用缩放矩阵:[scaleX, skewX, skewY, scaleY, translateX, translateY]
                    contentStream.transform(new float[]{scaleFactor, 0, 0, scaleFactor, 0, 0});
                    contentStream.drawForm(pageXObject);
                }
            }
            // 保存新PDF
            targetDoc.save(outputPath);
        }
    }

    public static void main(String[] args) throws IOException {
        // 示例:缩小到70%
        scalePdf("input.pdf", "pdfbox_scaled_output.pdf", 0.7f);
    }
}

核心要点

  • convertToFormXObject:PDFBox中实现整页内容缩放的关键方法,确保所有元素同步缩放
  • transform:通过矩阵参数直接设置缩放比例,平移参数设为0即可保证内容对齐原页面位置
  • 务必使用try-with-resources关闭流和文档,避免资源泄漏

额外注意事项

  • 缩放比例限制:如果缩放比例过大(比如超过2倍),低分辨率图片可能会模糊,这是原始资源的限制,无法通过PDF处理库解决
  • 加密PDF处理:如果原PDF加密,PDFBox可调用sourceDoc.setAllSecurityToBeRemoved(true)解密;iText需在PdfReader构造时传入密码
  • 页面方向兼容性:两个库都会自动识别原页面的横竖方向,缩放后尺寸会对应调整
  • 兼容性测试:建议用包含文本、图片、表格、矢量图形的复杂PDF测试,确保所有元素正确缩放

内容的提问来源于stack exchange,提问作者coral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:00