Я работаю над инструментом для автоматического создания файлов PDF на основе файла шаблона и других исходных данных. Я использую Mac OS 10.14.4, Java 1.8 и PDFBox версии 2.0.15.
В качестве базового теста я сократил код открытия и сохранения до двух строк, что имеет очевидную проблему для одного конкретного PDF-файла и более тонкие проблемы для всех других PDF-файлов, которые я пробовал:
PDDocument targetPDF = PDDocument.load(new File(templatePath));
targetPDF.save(targetFileName)
Наблюдаемая проблема для одного конкретного PDF заключается в том, что неожиданные символы вставляются вверху первой страницы. (Похоже, они написаны алфавитом, который иначе не используется, и обрезаются.) Другие PDF-файлы визуально похожи, но сильно отличаются, когда я запускаю их через diff
. Это что-то хитрое, я должен сделать, чтобы сохранить файлы? Это проблема с этим одним файлом? PDFBox делает что-то странное?
Я искал похожие отчеты и нашел несколько, которые касаются размера выходных файлов: Почему в PDFBox размер файла становится чрезвычайно большим после сохранения? и Разделить и объединение PDF-файлов с использованием PDFBOX создает большой файл Я вижу заметное увеличение размера файла, но не так сильно, как сообщают эти вопросы. В случае one входные и выходные файлы визуально различаются. В других случаях diff -y --text template.pdf target.pdf
сообщает о больших различиях, но я не вижу различий одним глазом. (Во встроенной программе просмотра документов «Предварительный просмотр» в Mac. В Adobe Acrobat создается взломанный файл «template.pdf». Я не знаю о неразрывных файлах.)
После сравнения с https://issues.apache.org/jira/browse/PDFBOX-2690 и http://useof.org/java-open-source/org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject Я попытался добавить targetPDF.close()
после targetPDF.save()
, но это не имело значения.
https://pdfbox.apache.org/2.0/faq.html предлагает закрыть контент stream перед сохранением файла, но я не знаю, как это сделать. (Сам по себе File
не имеет метода close()
. Ни один из методов в PDDocument не имеет отношения к потокам или их закрытию, кроме самого PDDocument.close()
, который препятствует сохранению.)
Я бы вставил сюда некоторые файлы журналов, но я не получаю никаких сообщений от классов PDFBox ....