Как извлечь PRStream из PDF со встроенной кодировкой с использованием itext? - PullRequest
0 голосов
/ 16 марта 2020

Мне нужно заменить текст в оригинальном pdf и создать новый. Для этого я использую библиотеку itext в java. До сих пор у меня были только PDF-файлы с кодировкой ANSI. Поэтому я бы запустил следующие строки:

            PdfReader reader = new PdfReader(SOURCE_PDF);
            PdfDictionary page = reader.getPageN(1);
            byte[] pageContentInput = ContentByteUtils.getContentBytesForPage(reader, 1);
            String dd = new String(pageContentInput, BaseFont.CP1252);

BaseFont.CP1252 помог мне расшифровать кодировку, и я получил бы текст в строке "dd". Если я использую CP1252 , результат будет примерно таким же, как у Tj, который в случае ANSI равен Tj

. Кроме того, мне требуется не только текст со страницы, но и полное форматирование, т. Е. С Tj, Tf et c. так что я могу создать новый PDF с тем же форматированием. Вот почему я использую getContentBytesForPage.

Как я могу получить текстовый поток PDF из PDF со встроенной кодировкой?

1 Ответ

0 голосов
/ 19 марта 2020

Как уже упоминалось в комментариях, вы не используете одну кодировку для декодирования всего байтового массива, потому что каждый строковый объект в нем может быть закодирован по-разному.

Вы должны анализировать инструкцию байтового массива по инструкции, отслеживать, какой шрифт выбран в настоящий момент, и когда вы сталкиваетесь с инструкцией рисования текста, его строковые аргументы должны быть декодированы в соответствии со свойствами этого текущего шрифта.

Используемыми свойствами могут быть его Кодировка , ее 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-файлы по-разному.

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

...