Как уже упоминалось в комментариях, вы не используете одну кодировку для декодирования всего байтового массива, потому что каждый строковый объект в нем может быть закодирован по-разному.
Вы должны анализировать инструкцию байтового массива по инструкции, отслеживать, какой шрифт выбран в настоящий момент, и когда вы сталкиваетесь с инструкцией рисования текста, его строковые аргументы должны быть декодированы в соответствии со свойствами этого текущего шрифта.
Используемыми свойствами могут быть его Кодировка , ее ToUnicode карта, информация из основного файла шрифта, ... в зависимости от того, какой тип шрифта это и какая дополнительная информация предоставляется.
Но даже после выполнения таким образом, вы не можете просто заменить текст в оригинальном pdf , этот ответ (на аналогичный вопрос в контексте библиотеки PDFBox) иллюстрирует ряд препятствий, в частности шрифты ( который может быть только вложенным в подмножество), не содержащий необходимых глифов и неясного расположения Ионы.
Чтобы понять, как решать прежние проблемы, взгляните на следующие ответы:
- Этот ответ , который дает
PdfContentStreamEditor
классы для Java и C#, которые могут служить базовыми классами для редактирования инструкций потока контента; в частности, эти классы также отслеживают графическое состояние, включая текущие параметры состояния текста. - Этот ответ (ОП, к сожалению, удалил вопрос, поэтому вам нужна репутация, чтобы иметь разрешение на чтение ответ) использует этот класс
PdfContentStreamEditor
Java для реализации средства удаления текста для текста с указанным c шрифтом и еще одного для текста с большим размером шрифта. - Этот ответ использует этот класс
PdfContentStreamEditor
C# для реализации BigTextRemover
, который распознает текст по размеру шрифта и удаляет его. - Этот ответ описывает, что нужно сделать, чтобы предотвратить
PdfContentStreamEditor
проблемы с повернутыми документами. - В этом ответе также описывается, что делать, чтобы предотвратить
PdfContentStreamEditor
проблемы с повернутыми документами, и дополнительно исправляется ошибка в PdfContentStreamEditor
. - Этот ответ использует этот класс
PdfContentStreamEditor
Java для реализации редактора, который меняет цвет черного текста на зеленый. - Этот ответ предоставляет порт * 105 5 * для iText 7 / Java как
PdfCanvasEditor
и показывает пример использования удаления текста по имени или размеру шрифта и перекрашивания черного текста в зеленый. - В этом ответе используется этот
PdfContentStreamEditor
C# класс для реализации TextRemover
удаления всех инструкций рисования текста. - Этот ответ использует этот класс
PdfContentStreamEditor
Java для реализации SimpleTextRemover
, который распознает поиск текста в текстовых инструкциях по рисованию, удаляет его и возвращает позиции, в которых текст был удален (с некоторыми ограничениями, объясненными там). На этих позициях можно нарисовать новый текст.
Изучая PdfContentStreamEditor
из первого ответа (с исправлением из пятого ответа) и SimpleTextRemover
, вы получите представление о том, как найти текст , Другие ответы могут быть интересны в целом, если вы хотите редактировать PDF-файлы по-разному.
Что касается замены , учтите, что шрифты могут быть неполными, и поэтому, как правило, вы не можете просто замените содержимое строковых аргументов инструкций рисования текста, но вместо этого, возможно, придется добавить новый шрифт и переключить шрифты для замены инструкции рисования текста.