将pdf的内容放在Apache PDFBox中的画布中心

问题描述 投票:1回答:1

我正在使用Apache PDFBox 2.0.8。我的目标是将PDF转换为图像并放大画布并将内容放在中心,以便我可以在剩余空间中放置一些页眉和页脚。我的问题是画布越来越大,但内容没有集中,它们坚持到底。

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();
    }
}
java apache pdfbox
1个回答
1
投票

我的问题是画布越来越大,但内容没有集中,它们坚持到底。

对于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。

© www.soinside.com 2019 - 2024. All rights reserved.