PDFBox: PDJpeg рисуется неправильными цветами при изменении размера - > Adobe Reader - > Windows XP & 7


При создании PDF с помощью PDFBox и рисовании PDJpegs к нему цвета изображений изменяются / инвертируются при изменении размера PDJpeg(ов) перед их рисованием в PDF. Эта проблема видна только в Windows XP и Windows 7 с помощью, например, Adobe Reader. Предварительный просмотр на Mac или новая сборка предварительного просмотра PDF в Windows 8 каким-то образом не затрагиваются этим.

Примеры:

Скриншот PDF в Adobe Reader
тот же PDF в Mac Preview

Вот что я хочу сказать. сделайте в коде:

  • Создать PDDocument
  • создать хэш-карту PDJpegs (для кэширования):
    • создайте PDJpegs с помощью BufferedImage, инициализированного через ImageIO.read ()
    • измените размер PDJpegs, вызвав setHeight() и setWidth() на PDJpegs
    • добавление PDJpeg в HashMap
  • создайте PDPage и добавьте его в PDDocument
  • Создать PDPageContentStream
  • нарисуйте несколько PDJpegs на странице PDPage
  • закрыть PDPageContentStream
  • Сохранить PDDocument
  • Закрыть PDDocument

Метод изменения размера PDJpegs:

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);
        }
    }
}

Если размер буферных изображений изменяется до инициализации PDJpegs, все работает нормально, но они не выглядят такими четкими.

Есть ли у кого-нибудь хорошее решение или испытал ту же проблему?

1 2

1 ответ:

Рисование изображения с помощью PDPageContentStream#drawXObject и установка ширины в высоту в этом методе решили проблему.