У меня есть PDF-файл, который я скачал по этой ссылке:

https://invoicetemplates.com/wp-content/uploads/freelance-writer-invoice-template.pdf

И я использую pdf tk для распаковки pdf

Pdftk file.pdf вывод без сжатия. pdf распаковать

Когда я пытаюсь заменить, используя sed, он работает.

Однако, когда я использую Java, изображения логотипа и текста внутри PDF исчезают.

Не знаю почему - пожалуйста, помогите мне.

Это мой код в оболочке:

sed -e "s/ORIGINALSTRING/NEWSTRING/g" <uncompressed.pdf >modified.pdf

И это мой код с использованием Groovy:

(new File('uncox3.pdf')).write(    new File('uncompressed.pdf').getText().replaceAll(/ORIGINALSTRING/,"NEWSTRING")) 

enter image description here enter image description here

0
mightguy 12 Мар 2018 в 20:57

2 ответа

Лучший ответ

Я публикую решение, полученное от моего другого вопроса

Большое спасибо всем за помощь

   def s = new File("uncompressed.pdf").getText("ISO-8859-1").replaceAll("ORIGINALSTRING", "NEWSTRING")

    def bb = s.getBytes("ISO-8859-1")

    new File("uncox3.pdf").setBytes(bb)
0
mightguy 13 Мар 2018 в 16:00

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

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

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

При этом причина того, что ваш отличный код более заметно повреждает PDF-файл, вероятно, заключается в явном преобразовании двоичного кода в текст с использованием getText и неявном преобразовании текста в двоичное в write.

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

Между тем, здесь предполагается стандартная кодировка Utf-8, а для utf-8 действительно существует много байтовых последовательностей, не имеющих смысла.

Явное использование кодировки вроде Latin-1 может привести к тому, что ваш Java-код будет работать аналогично вашей команде sed.

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

2
mkl 13 Мар 2018 в 08:53