java - 如何使用 PdfBox 缩放 pdf 文件
问题描述
我正在尝试缩放 pdf 文件,例如复印机中的缩放功能,可以按百分比缩放文档(如下所示:https ://inspectapedia.com/graphics/Safari_Page_Setup.jpg ),我正在使用 pdfbox 来管理我的 pdf文件。我已经尝试过这段代码,但为什么它不起作用?代码中没有错误。
void Scale(){
try
{
PDDocument doc = PDDocument.load(new File(filePath));
for (int p = 0; p < doc.getNumberOfPages(); ++p)
{
PDRectangle mediaBox = doc.getPage(p).getMediaBox();
mediaBox.transform(Matrix.getScaleInstance(0.5f, 0.5f));
doc.getPage(p).setMediaBox(mediaBox);
}
doc.save(new File(filePathEdited));
} catch (Exception e) {
e.printStackTrace();
}
}
有谁知道为什么该代码不起作用?
编辑
我需要它在 API 16 上工作
解决方案
首先,
mediaBox.transform(Matrix.getScaleInstance(0.5f, 0.5f));
不会将其更改为mediaBox
原来大小的一半。相反,它返回代表缩放矩形的路径;当您忽略该表达式的返回值时,这行代码本质上是 NOP(无操作)。
如果您考虑一下,您会发现该transform
方法显然无法将矩形更改为变换的结果,因为任意仿射变换的结果不再需要是矩形,特别是不再平行于页面边缘。
话虽如此,即使您的代码缩放了媒体框,结果仍然不是您想要的,结果 pdf 将仅显示原始页面的一部分,因为您只会缩放画布的可见部分而不是其内容。
因此,除了实际缩放媒体框外,您还必须缩放内容。即,您必须在页面内容之前添加一个额外的内容流,并通过缩放转换来更改当前的转换矩阵。
推荐阅读
- vba - 根据另一个单元格中的值自动填充 x 行的代码
- java - “InputMismatchException”错误,计算文件中的行数
- powershell - 如何在不使用 SMB 共享的情况下使用 Powershell 远程列出文件(仅限 winRM 端口)?
- c++ - C ++ 11类中放置枚举类的重载运算符
- keras - 将输入与 keras 中的常量向量连接起来。如何定义batch_size
- azure-devops - 将 PFX 添加到 VSTS 上的强名称 CSP
- office-js - 在 Windows Server 上加载 Word 加载项
- docker - 詹金斯:从奴隶推送到 ECR
- node.js - 如何下载部署在 Google Cloud 上的 Node.js 项目
- c# - How to restore a SQL Server backup in .NET Core