使用PDFBOX将jpg转换为pdf,但我无法设置dpi

时间:2016-08-24 11:05:35

标签: pdf pdfbox

我使用PDFBOX 2.0.2将PDF拆分为jpg图像 起初,我只是编码为样本 那样的。

BufferedImage image = pdfRenderer.renderImageWithDPI(pageCounter,300,ImageType.RGB);

现在,我想将此图像转换为PDF。 但是图像dpi太大了。

我真的想减少dpi。 所以我试着这个代码。

PDImageXObject pdImageXObject = JPEGFactory.createFromImage(doc,bimg,0.5f,100);

但也没有工作。

如何减少dpi?

这是完整的来源。

            InputStream in = new FileInputStream(imagePath);
            BufferedImage bimg = ImageIO.read(in);

            float width = bimg.getWidth() ;
            float height = bimg.getHeight();
            PDPage page = new PDPage(new PDRectangle(width, height));

            doc.addPage(page);
            //PDStream stream = new PDStream(doc, in);

            PDImageXObject  pdImageXObject = JPEGFactory.createFromImage(doc, bimg, 0.5f, 10);

            PDPageContentStream contentStream = new PDPageContentStream(doc, page);

            contentStream.drawImage(pdImageXObject, 0, 0);

            contentStream.close();
        }
    }
    finally
    {   
        System.out.println("ddd");
        doc.save(pdfPath);
        doc.close();
    }
}

2 个答案:

答案 0 :(得分:1)

有两个问题:

1)页面大小。它不是以像素为单位,而是以页面为单位。 1个单位= 1/72英寸。所以你的矩形会像这样计算:

PDPage page = new PDPage(new PDRectangle(width / 300 * 72, height / 300 * 72));

2)比例图像。在300dpi时,它必须缩放72/300,因为1:1是72 dpi。

float scale = 72 / 300;
contentStream.drawImage(pdImage, 0, 0, pdImage.getWidth()*scale, pdImage.getHeight()*scale);

使用JPEGFactory不是一个好主意,因为某些质量会丢失。请改用LosslessFactory。

关于您对JPEGFactory的dpi参数的使用 - 这只是元数据。它不会扩展任何东西。

如果你真的想要“降低dpi”,那么以72 dpi而不是300 dpi渲染PDF,那么在创建新PDF时就不需要缩放。

答案 1 :(得分:1)

我遇到了类似的问题,并使用以下方法解决了该问题:

PDPage page = new PDPage(PDRectangle.A4);
PDImageXObject pdImage = PDImageXObject.createFromFile(imgFile, doc);
PDPageContentStream contents = new PDPageContentStream(doc, page, false, false);   
contents.drawImage(pdImage, 0, 0, PDRectangle.A4.getWidth(), PDRectangle.A4.getHeight());