【问题标题】:PDFBox - convert image to PDF, PDF resolutionPDFBox - 将图像转换为 PDF,PDF 分辨率
【发布时间】:2017-02-18 07:40:45
【问题描述】:

我正在使用 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 阅读器中的默认大小显示为较小的值(如 15% 或 24%,附有屏幕截图)。尽管它覆盖了 100% 的屏幕(15% 的人暗示我看到的图像要小得多,但事实并非如此)。当我将大小更改为 100% 时,我看到一个比实际图像大得多的高度模糊图像,我必须向左/向右和向上/向下滚动才能看到完整的图像。

这两个观察结果都让我觉得,由于某种原因,生成的 PDF 的分辨率比应有的要高得多。这会是一个公平的说法吗?如果是这样,我该如何纠正?

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

【问题讨论】:

  • 请分享有问题的图片以重现问题。
  • new PDPage(new PDRectangle(width, height)) 不是一个好主意,尺寸以页面为单位,1 个单位 = 1/72 英寸。
  • 谢谢@TilmanHausherr,那我应该改用什么?
  • 我附上了一个示例 JPG 图片
  • @kayasa 我已经删除了我之前的评论,它更复杂,我现在自己也很困惑。我无法真正回答,但现在我认为,页面大小和图像比例应该分开看。 IE。 1) 确定页面大小,2) 确定图像显示的比例以使其适合。对于您的示例,出于某种原因,除以 3 并将图像缩放 3 效果很好。对于 A4 纸张大小,使用 new PDPage()contentStream.drawImage(img, 0, 0, width / 6, height / 6); 会留下一些空白区域。

标签: java pdf-generation pdfbox acrobat


【解决方案1】:

有一个重载的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;

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2018-03-22
    相关资源
    最近更新 更多