Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将pdf的内容放在ApachePDFBox画布的中心_Java_Apache_Pdfbox - Fatal编程技术网

Java 将pdf的内容放在ApachePDFBox画布的中心

Java 将pdf的内容放在ApachePDFBox画布的中心,java,apache,pdfbox,Java,Apache,Pdfbox,我正在使用ApachePDFBOx2.0.8。我的目标是将PDF转换成图像,放大画布,将内容放在中间,这样我就可以在剩余的空间中放置一些页眉和页脚。 我的问题是画布正在扩大,但内容没有居中,而是粘在底部 public class PDFRescale { public static void main(String[] args) { try { String pdfFilename = "/MuhimbiPOC/Templates/Source_doc_withheaderf

我正在使用ApachePDFBOx2.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();
    }
}
我的问题是画布正在扩大,但内容没有居中,而是粘在底部

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();
    }
}
这是您对其
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。另一方面,使用DPI进行渲染
使用CropBox。仅对于没有显式CropBox的PDF页面,您的代码会放大页面区域。对于通用解决方案,您还应调整CropBox

是否有任何方法可以在不将PDF转换为图像的情况下重新缩放PDF@PrashantChaudhary“有没有办法在不转换为图像的情况下重新缩放PDF?”-是:可以在每个页面的内容流(数组)的开头插入缩放指令。注意:这只会更改页面内容,而不会更改批注。如果你的PDF也有注释(如AcroForm表单字段),你也必须缩放它们的Rect条目。有没有办法在不转换为图像的情况下重新缩放PDF?