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
相关产品推荐
相关产品推荐

