PDFBox - 将图像转换为PDF,PDF分辨率

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

我正在使用PDFBox v2将jpg图像转换为PDF。 JPG图像已经存在于文件系统中,所以我只需将其取出并将其转换为PDF。以下是我的代码

public void convertImgToPDF(String imagePath, String fileName, String destDir) throws IOException {
        PDDocument document = new PDDocument();
        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));
        document.addPage(page);
        PDImageXObject img = PDImageXObject.createFromFile(imagePath, document);
        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        contentStream.drawImage(img, 0, 0);
        contentStream.close();
        in.close();
        document.save(destDir + "/" + fileName + ".pdf");
        document.close();
    }

这段代码完成转换就好了。但是,我在转换的PDF中观察到以下内容

  1. 当我打开转换后的PDF时,打开速度非常慢(在Acrobat阅读器中)。似乎PDF正逐像素地打开。如果我打开任何其他PDF,它打开就好了。
  2. 对于转换的PDF,acrobat reader中的默认大小显示为较小的值(如15%或24%,附带屏幕截图)。尽管它覆盖了100%的屏幕(15%表示我看到的图像要小得多,但事实并非如此)。当我将大小更改为100%时,我看到高度模糊的图像比实际图像大得多,我必须向左/向右和向上/向下滚动才能看到完整的图像。

这两个观察结果都让我觉得,由于某些原因,生成的PDF分辨率远高于应有的分辨率。这是一个公平的陈述吗?如果是这样,我该如何纠正?

PDF size

编辑附加正在转换为PDF的JPG图像。当我打开PDF时,它显示的大小为25.9%。这张图片是在iPad上点击的。

Image to be converted to PDF

java pdf-generation pdfbox acrobat
1个回答
0
投票

有一个重载的drawImage()方法来做到这一点

contentStream.drawImage(PDImageXObject, float x, float y)
contentStream.drawImage(PDImageXObject, float x, float y, float height, float width)

通过在contentStream.drawImage()上指定显式宽度和高度,可以实现这一点。例如,如果您想要将图像显示小4倍但仍保持相同的分辨率,则可以使用

scaleDownRatio = 0.25;
pageSize = PDRectangle.A4;

# this will draw image at bottom left corner
PDImageXObject pageImageXObject = LosslessFactory.createFromImage(document, bitmap);
contentStream.drawImage(pageImageXObject, 0, 0, bitmap.getWidth() * ratio, bitmap.getHeight() * ratio)

# to center it you can use something like
contentStream.drawImage(pageImageXObject, (pageSize.getWidth() - bitmap.getWidth() * ratio) / 2, (pageSize.getHeight() - bitmap.getHeight() * ratio) / 2, bitmap.getWidth() * ratio, bitmap.getHeight() * ratio)

注意:在您的情况下,即使将图像缩放到四分之一大小,图像仍然不适合;你可以得到比例因子

float widthRatio = bitmap.getWidth() / pageSize.getWidth();
float heightRatio = bitmap.getHeight() / pageSize.getHeight();
scaleDownRatio = (widthRatio<heightRatio)? widthratio:heightRatio;
© www.soinside.com 2019 - 2024. All rights reserved.