Как заменить текст в pdf с помощью java

Я пытаюсь заменить текст в файле pdf. У меня такой код:

PdfReader reader = new PdfReader("test.pdf");

PdfDictionary dict = reader.getPageN(1);
PdfObject object = dict.getDirectObject(PdfName.CONTENTS);

if (object instanceof PRStream)
{
    PRStream stream = (PRStream) object;
    byte[] data = PdfReader.getStreamBytes(stream);
    System.out.println(new String(data));
    stream.setData(new String(data).replace("application", "HELLO WORLD").getBytes());
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("test-output.pdf"));
stamper.close();
reader.close();

Когда я пытаюсь распечатать, чтобы увидеть данные (System.out.println (новая строка (данные))), «заявление» отображается как «ап) -4 (плика) -3 (тион», это причина, по которой мне не удалось заменить текст, любую идею или другой метод, который может достичь того, чего я пытаюсь достичь?

PDF описывает графическое содержание страницы. Он должен быть в «окончательной форме». В зависимости от генерируемой программы текст не всегда хранится в легкодоступном виде. Например, вы видите информацию о кернинге. Вы мало что можете с этим поделать.

Henry 15.10.2018 05:31

Здесь уже есть много вопросов по теме замены текста при переполнении стека. Если вы поищете их, вы увидите в ответах, что ваша проблема иллюстрирует одну из проблем, которые могут быть у вас.

mkl 15.10.2018 06:18

Вы пробовали использовать Apache PDFBox? (я использовал его один раз, но только для создания PDF-файлов)

zealvault 15.10.2018 06:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 340
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не сможете сделать это с помощью iText.

Поверьте, это одно из самых разочаровывающих открытий в отношении PDF-файлов: вы можете создавать их с помощью iText, но вы не можете вернуться позже и заменить текст чем-то другим, как в вашем примере.

Вы действительно мало что можете с этим поделать. Когда текст есть, вы не можете его изменить.


Несмотря на все это, вы обычно можете ДОБАВИТЬ нового содержимого (текст, изображения и т. д.) В существующий PDF. Итак ... если вы можете немного изменить вселенную и создать PDF-файл с пустым пространством правильного размера, вы можете вернуться позже и использовать класс PdfStamper для «штамповки» на другом слое графического содержимого.

Подробнее об этом можно найти в Документация iText и в этом прекрасном вопросе:

Как добавить контент в PDF с помощью iText PdfStamper

«Вы не сможете сделать это с помощью iText». - не только с itext. Помимо некоторых тривиальных случаев, вы не найдете удовлетворительного решения ни в одной библиотеке pdf.
mkl 15.10.2018 06:20

Иногда вы также можете встретить деловых людей (некоторые на уровне директора), которые спросят: «Что вы имеете в виду, что вы не можете изменять PDF-файлы? Мы занимаемся редактированием PDF-файлов в течение долгого времени!». А потом вы обнаружите, что они действительно использовали документы Microsoft Word, экспортированные и открытые с помощью бесплатного Adobe Reader. * Вздох *

JonathanDavidArndt 30.10.2018 14:06

Другие вопросы по теме