Конвертировать PDF в PNG - Java 10 дает другой результат, чем Java 8 - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу конвертировать PDF в файл PNG. Но по некоторым причинам Java 10 дает другой PNG, чем Java 8

private static void writeImageToPath(String sourcePath, String path, int pageWidth, int pageHeight) throws IOException 
{

    File sourceFile = new File(sourcePath);
    PDDocument document = PDDocument.load(sourceFile);
    PDFRenderer renderer = new PDFRenderer(document);
    BufferedImage buff= renderer.renderImage(0, 1, ImageType.ARGB);
    File outputfile = new File(path);
    Image image = buff.getScaledInstance(pageWidth, pageHeight, Image.SCALE_SMOOTH);
    BufferedImage bufferedImage = new BufferedImage(pageWidth, pageHeight, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2d = bufferedImage.createGraphics();
    g2d.drawImage(image, 0, 0, null);
    g2d.setColor(Color.BLACK);
    g2d.dispose();
    ImageIO.write(bufferedImage, "png", outputfile);
}

Я прочитал, что настройки сжатия изменились в Java 9 PNG Writer, поэтому может быть, поэтому я вижу другие результаты из Java 8. https://github.com/gredler/jdk9-png-writer-backport

Вы знаете, как я могу преодолеть эту проблему?

Заранее спасибо !!

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Это было одной из причин, почему я перешел на pngj . Поскольку эта библиотека стабильна (если я не обновляю или не изменяю что-то), я получаю стабильные результаты. И он на ~ 100% быстрее, чем старый PNGWriter, и все же на ~ 20% быстрее, чем версия PNGWriter с бэкпортом. Я уже говорил с Тилманом, чтобы добавить этот код в pdfbox, но у меня еще не было времени сделать это.

Интересно, что я сам обнаружил проблему с imageIO PNGWriter и подумал о ее исправлении, но потом увидел вашу ссылку на версию с бэкпортом и интеграцию в java9. Так что кто-то еще был быстрее: -)

0 голосов
/ 08 ноября 2018

TL; др: принять его.

Часто есть небольшие различия в рендеринге между версиями jdk. Для jdk8 рекомендуется использовать систему управления цветом Kodak CMS (см. Начало работы ), поскольку новая LittleCMS была очень медленной, а Kodak CMS больше не доступна в jdk10, поэтому теперь используется Little CMS. Результат рендеринга немного отличается (обычно лучше) цветов Рисунок кривой также может немного отличаться.

Я годами проводил тесты разницы в пикселях в PDFBox (для выявления регрессий), и я привык к небольшим различиям. См. TestPDFToImage.java в исходном коде ... значения разности пикселей до 3 игнорируются.

Несмотря на это, есть небольшие различия, которые затрудняют регрессионные тесты. Когда я тестирую PDFBox с новой версией Java (чтобы увидеть, есть ли что-то, что требует внимания), я делаю визуальный осмотр файлов визуальных различий. Это занимает много времени (эти тесты проводятся на более чем 1000 PDF-файлах).

Существуют также визуальные различия между разными ОС или даже разными компьютерами с одинаковой ОС из-за разных установленных шрифтов.

...