Ваш код полностью нарушает PDF, ср.вывод Adobe Preflight:
Причина очевидна: ваш код
PDResources resources = new PDResources();
PDFont font = PDType0Font.load(document, new File("arial-unicode-ms.ttf"));
resources.add(font);
page.setResources(resources);
отбрасывает ранее существующую страницу Ресурсы и ваша замена содержит только один шрифт, имя которого вы позволяете PDFBox выбирать произвольно.
Вы не должны удалять существующие ресурсы, поскольку они используются в вашем документе.
При проверке содержимого вашей страницы PDF становится очевидным, что кодировка первоначально используемых шрифтов T1_0 и T1_1 либо является однобайтовой кодировкой, либосмешанное однобайтовое кодирование;младшие однобайтовые значения выглядят как ASCII-подобные.
Я бы предположил, что кодировка WinAnsiEncoding или ее подмножество.Как следствие, ваша задача
прочитать строки из PDF-файла и заменить его текстом Unicode
не может быть реализована как простая замена, по крайней мере, с произвольнойНужно помнить код Unicode.
Вместо этого вы можете реализовать:
- Сначала запустите исходный PDF-файл через специальный инструмент для удаления текста, который вместо извлечения простого текста ищетваши строки заменить и вернуть свои позиции.Здесь есть множество вопросов и ответов, которые показывают вам, как определить координаты строк в подклассах стриппера текста, в последнее время этот .
- Затем удалите эти оригинальные строки из вашего PDF.В вашем случае подход, аналогичный исходному коду выше (очевидно, без удаления ресурса), замена строк одинаково длинными строками пробелов может сработать, даже если это грязный хак.
- Наконец добавьте свои замены вопределенные позиции, используя
PDFContentStream
в режиме добавления;для этого добавьте ваш новый шрифт к существующим ресурсам.
Однако имейте в виду, что PDF не предназначен для такого использования.Шаблоны PDF можно использовать в качестве фона для нового контента, но попытка заменить контент в нем обычно является плохим дизайном, приводящим к неприятностям.Если вам нужно пометить позиции в шаблоне, используйте аннотации, которые можно легко удалить во время заполнения.Или используйте для начала формы AcroForm, встроенную технологию PDF-форм.