<分区>
在应用程序中,用户可以上传任何尺寸为 8.46"x 10.97"的 pdf 文件。根据我们的应用尺寸应为 8.5"x 11"。问题是,如何调整现有 pdf 页面大小以设置 8.5"x 11"?我必须通过代码来修复,而不是手动或命令行或外部软件。请让我知道哪个 java 支持 jar(免费版)提供了实现此功能的功能,或者通过简单的 java 修复也可以。
<分区>
在应用程序中,用户可以上传任何尺寸为 8.46"x 10.97"的 pdf 文件。根据我们的应用尺寸应为 8.5"x 11"。问题是,如何调整现有 pdf 页面大小以设置 8.5"x 11"?我必须通过代码来修复,而不是手动或命令行或外部软件。请让我知道哪个 java 支持 jar(免费版)提供了实现此功能的功能,或者通过简单的 java 修复也可以。
最佳答案
使用 iText 你可以做这样的事情:
float width = 8.5f * 72;
float height = 11f * 72;
float tolerance = 1f;
PdfReader reader = new PdfReader("source.pdf");
for (int i = 1; i <= reader.getNumberOfPages(); i++)
{
Rectangle cropBox = reader.getCropBox(i);
float widthToAdd = width - cropBox.getWidth();
float heightToAdd = height - cropBox.getHeight();
if (Math.abs(widthToAdd) > tolerance || Math.abs(heightToAdd) > tolerance)
{
float[] newBoxValues = new float[] {
cropBox.getLeft() - widthToAdd / 2,
cropBox.getBottom() - heightToAdd / 2,
cropBox.getRight() + widthToAdd / 2,
cropBox.getTop() + heightToAdd / 2
};
PdfArray newBox = new PdfArray(newBoxValues);
PdfDictionary pageDict = reader.getPageN(i);
pageDict.put(PdfName.CROPBOX, newBox);
pageDict.put(PdfName.MEDIABOX, newBox);
}
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("target.pdf"));
stamper.close();
我引入容差是因为您可能不希望更改大小只有很小一部分的页面。
此外,您可能还想计入页面的 UserUnit 值,即使它几乎从未被使用过。
任何通用的 PDF 库都可能允许这样的事情,要么通过提供一个显式的方法来调整大小,要么通过允许直接访问,如这里使用的那样。
关于您的要求免费版本,您在评论中澄清了免费意味着无需购买;只要您遵守 AGPL,就可以在不购买许可的情况下使用 iText。
关于java - 如何调整现有 pdf 页面大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21375150/