3

使用 PDFBox 创建 PDF 并向其绘制 PDJpeg 时,在将 PDJpeg 绘制到 PDF 之前调整其大小时,图像的颜色会发生更改/反转。此问题仅在使用 Adob​​e Reader 等的 Windows XP 和 Windows 7 上可见。Mac 上的预览或 Windows 8 中的新 PDF 预览版本在某种程度上不受此影响。

样品:

Adobe Reader 中的 PDF 屏幕截图
Mac 预览中的相同 PDF

这就是我在代码中所做的:

  • 创建 PDDocument
  • 创建 PDJpeg 的 HashMap(用于缓存目的):
    • 通过 ImageIO.read() 初始化的 BufferedImage 创建 PDJpegs
    • 通过在 PDJpegs 上调用 setHeight() 和 setWidth() 来调整 PDJpegs 的大小
    • 将 PDJpeg 添加到 HashMap
  • 创建 PDPage 并将其添加到 PDDocument
  • 创建 PDPageContentStream
  • 在 PDPage 上绘制一些 PDJpeg
  • 关闭 PDPageContentStream
  • 保存 PDDocument
  • 关闭 PDDocument

调整 PDJpeg 大小的方法:

private void preparePDFIconCache(List<AbstractDataItem> list) throws IOException {

    iconCache = new HashMap<String, PDJpeg>();

    for (AbstractDataItem item : list) {
        String iconResourcePath = "/com/graphics/icons/" + item.getIconName();
        URL iconURL = this.getClass().getResource(iconResourcePath);

        BufferedImage icon = null;
        if (iconURL != null) {

            icon = ImageIO.read(iconURL);

        } else {

            String myIconResourcePath = SettingsDataModel.getInstance().getMyIconsPath() + File.separator + item.getIconName();

            File iconFile = new File(myIconResourcePath);
            if (iconFile.exists()) {

                URL myIconURL = iconFile.toURI().toURL();

                if (myIconURL != null) {

                    icon = ImageIO.read(myIconURL);
                }
            }

        }
        if (icon != null) {

            PDJpeg pdfIcon = new PDJpeg(currentDocument, icon);

            pdfIcon.setHeight(iconWidthXHeight);
            pdfIcon.setWidth(iconWidthXHeight);

            iconCache.put(item.getIconName(), pdfIcon);
        }
    }
}

如果在初始化 PDJpeg 之前调整 BufferedImages 的大小,则一切正常,但它们看起来并不那么清晰。

有没有人有好的解决方案或遇到过同样的问题?

4

1 回答 1

1

使用 PDPageContentStream#drawXObject 绘制图像并在此方法中设置高度宽度解决了该问题。

于 2013-04-13T13:15:56.797 回答