我正在使用Apache PDFBox 2.0.8。我的目标是将PDF转换为图像并放大画布并将内容放在中心,以便我可以在剩余空间中放置一些页眉和页脚。 我的问题是画布越来越大,但内容没有居中,它们坚持到底。 p>
public class PDFRescale {
public static void main(String[] args) {
try {
String pdfFilename = "/MuhimbiPOC/Templates/Source_doc_withheaderfooter.pdf";
PDDocument document = PDDocument.load(new File(pdfFilename));
PDFRenderer pdfRenderer = new PDFRenderer(document);
PDPage pge = new PDPage();
PDFRescale ps = new PDFRescale();
int pageCounter = 0;
for (PDPage page : document.getPages())
{
final PDRectangle mediaBox = pge.getMediaBox();
mediaBox.setUpperRightX((float) (mediaBox.getUpperRightX()));
mediaBox.setUpperRightY((float) (mediaBox.getUpperRightY() * 1.5));
mediaBox.setLowerLeftY((float) (mediaBox.getLowerLeftY() * 1.5));
// note that the page number parameter is zero based
page.setMediaBox(mediaBox);
BufferedImage bim = pdfRenderer.renderImageWithDPI(pageCounter, 140, ImageType.RGB);
// suffix in filename will be used as the file format
ImageIOUtil.writeImage(bim, pdfFilename + "-" + (pageCounter++) + ".png", 140);
}
System.out.println("Task Completed ... ");
document.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
我的问题是画布正在放大但内容没有居中,它们坚持到底。 p>
对于mediaBox.getLowerLeftY()
为0
的PDF网页,这是您的问题。虽然这很常见,但并不是必需的。如果您使用了更通用的PDF选项,那么您已经看到您的问题是前者的内容最终可以在任何地方,甚至是屏幕外的!
原因是你做了
mediaBox.setUpperRightY((float) (mediaBox.getUpperRightY() * 1.5));
mediaBox.setLowerLeftY((float) (mediaBox.getLowerLeftY() * 1.5));
仅当原点位于水平中间轴的某个位置时,这才有效。
而是使用像
这样的东西mediaBox.setUpperRightY(mediaBox.getUpperRightY() + mediaBox.getHeight() * 0.5f);
mediaBox.setLowerLeftY(mediaBox.getLowerLeftY() - mediaBox.getHeight() * 0.5f);
您的代码的另一个问题:您只需设置 MediaBox 并忽略 CropBox 。另一方面,pdfRenderer.renderImageWithDPI
使用 CropBox 。仅对于没有明确 CropBox 的PDF页面,您的代码会放大页面区域。对于通用解决方案,您还应该调整 CropBox 。