Как просмотреть и отредактировать код файла PDF

12

Мне было интересно, как просмотреть и редактировать код файла PDF?

  1. При просмотре я не хочу видеть двоичный формат, поэтому я думаю, что hexdumpэто не то, что я хочу. Я пытался gedit, но никакой метод кодирования не может быть использован для декодирования содержимого PDF.

  2. Редактируя, я хотел бы найти /Fitи изменить их /XYZ, например, на sed. Но моя команда, sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfпохоже, не меняет внешний вид моего PDF, как я ожидал, хотя и не сообщает об ошибке. Мне было интересно, sedможет ли на самом деле работать с файлами PDF, как если бы они были простым текстом?

Контекст моих вопросов можно узнать из этого вопроса . Моя ОС - Ubuntu 10.10.

Тим
источник

Ответы:

9

Вы можете использовать sedс двоичными файлами (по крайней мере, GNU sed; некоторые реализации могут иметь проблемы с файлами, содержащими нулевые символы или не заканчивающимися символом новой строки). Но команда, которую вы использовали, заменяет только первое вхождение в /Fitкаждой строке, и строки в PDF-файле практически не имеют смысла. Вам необходимо заменить все вхождения:

 sed s/\/Fit/\/XYZ/g

Это будет более надежной заменой только в том /Fitслучае, если за ней не следует слово, составляющее слово (например, не заменяет /Fitness; я не знаю, содержит ли ваш файл случаи, /Fitкоторые могут вызвать проблемы). Вот один из способов:

perl -pe 's!/Fit\b!/XYZ!g'
Жиль "ТАК - прекрати быть злым"
источник
Спасибо! Теперь это работает! (1) Мне было интересно, как sed ищет символы в двоичном контенте? Кодирует ли sed в первую очередь символы запроса перед поиском? (2) В последней команде, что делает !, \bи gзначит? Можно ли это сделать без perl только с помощью sed?
Тим
1
@Tim (1) Sed загружает данные в память, обрабатывает их и распечатывает. Зачем это нужно что-то кодировать? (2) gозначает заменить все вхождения в каждой строке, как в sed, так и в perl. !является разделителем; Вы можете выбрать (почти) любой символ в качестве разделителя для sкоманды (это относится как к sed, так и к perl). \bозначает границу слова; он существует в perl, но не в sed.
Жиль "ТАК - перестань быть злым"
О (1), потому что символы, которые вы задаете для sed в команде, удобочитаемы. Если содержимое для поиска полностью двоичное, как sed может найти слово запроса там?
Тим
@Tim Text - это двоичные данные, которые читаются человеком.
Жиль "ТАК - перестань быть злым"
1
@Tim Да, вы можете передавать двоичные данные в запросе. Вам придется буквально вставлять символы в исходный код sed или shell.
Жиль "ТАК - перестань быть злым"
17

Относительно вашего первого вопроса («просмотр исходного кода, но не двоичного кода»): у вас есть несколько вариантов, чтобы распаковать внутренние двоичные потоки, которые прикреплены ко многим объектам.

Мой любимый инструмент для этого - QPDF , доступный на всех основных платформах ОС. Следующая команда распаковывает все потоки и все потоки объектов:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

Теперь вы можете открыть свой PDF в любом текстовом редакторе. (Там все еще могут быть некоторые двоичные объекты: например, файлы шрифтов и профили ICC, которые не имеют смысла расширять QPDF).

Для того, чтобы повторно сжатьexpanded.pdf снова после редактирования, вы можете запустить:

 qpdf expanded.pdf orig2.pdf

(Осторожно при ручном редактировании PDF-файлов! Вам нужно много знать об их внутреннем синтаксисе, чтобы сделать это правильно. Как только вы добавите или удалите один байт, вы можете получить сообщения об ошибках от читателей PDF, которые больше не смогут откройте его, потому что внутренний ToC PDF-файлов поврежден, что основано на вычислениях смещения байтов. Просто замена Fitна XYZстроки должна проходить нормально, хотя ...)

Курт Пфайфл
источник
1
Вы также можете добавить или удалить текст. Когда длина потока объекта изменяется, смещения байтов могут быть пересчитаны с использованием fix-qdfпрограммы, которая является частью qpdf. Вы все еще должны быть немного осторожны, хотя. См. Qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
Х. Риттих
@ H.Rittich: Спасибо за комментарий ... Как, по-вашему, это открывает новый взгляд на проблему? Вы думаете, мы не знаем, что мы можем добавить или удалить текст таким образом?
Курт Пфайфл
@KursPfeifle: Я не делаю никаких предположений о том, что вы знаете. В ответе говорится, что редактирование PDF таким способом должно сохранить смещения байтов объектов в файле. Однако возможно изменить смещения байтов при последующем их исправлении с помощью fix-qdf. Следовательно, если вы хотите заменить строку на строку другой длины, это возможно, но вам нужно использовать fix-qdfинструмент. Я бы сказал, что это полезное дополнение к ответу.
Х. Риттих
@ H.Rittich: Спасибо за вашу точку зрения. Когда я подчеркивал необходимость сохранения смещений байтов объектов, я не хотел советовать людям, КАК им следует это делать. Если бы вы сформулировали свой комментарий немного иначе, я бы понял смысл вашего комментария быстрее.
Курт Пфайфл
1

sedориентирован на строки, что делает его не очень подходящим для двоичных файлов, которые структурированы как блоки, а не как строки.
Попробуйте использовать bbe (bbe-.sourceforge.net).

Кроме того, Emacs (GNU и XEmacs) и vim без проблем открывают PDF-файлы. Конечно, это не очень красиво напечатано, так как это смешанный текст и двоичный файл, но этого достаточно для ваших целей редактирования.
Существует плагин Pdftk для Vim, который делает все проще, скачать здесь (ZIP-файл).
Как вы, наверное, знаете, оба вышеуказанных редактора имеют мощные возможности поиска и замены.

Кроме того, преобразование PDF в режим QDF до этого делает редактирование PDF-файлов действительно простым.

человек, любящий учиться
источник
Вы также можете попробовать редактировать с sedпомощью -bпереключателя. если это сработает, я добавлю это к своему ответу.
Филомат
@Tim: что вы подразумеваете под "ничего не показывает", просто пусто? любое сообщение об ошибке? Кроме того, вы можете попробовать с XEmacs? (все трое работали на меня).
Филомат
Не берите в голову -b, это специфично для Cygwin.
Филомат
Emacs говорит: «Файл 1.pdf большой (9 МБ), действительно открыт? (Y или n)». Я выбрал «у», и тогда ничего нет.
Тим
Скорее всего проблема Emacs, у вас есть XEmacs? (Я просто без проблем открыл PDF файл размером 31 МБ).
Филомат
0

Используйте LibreOffice или OpenOffice, чтобы открыть PDF-файл, просмотреть его, заменить, написать новый PDF-файл и т. Д. Я думаю, что вы даже можете использовать его из командной строки или программно, если нужно обработать много документов.

Обратите внимание, что PDF-файлы из некоторых источников, например, сканеров, часто содержат страницы в виде изображений, а не в виде текста, поэтому вам не повезет с ними при использовании поиска и замены.

Стив Барнс
источник
3
(1/2) Помните о следующем факте: LibreOffice не является встроенным редактором PDF. Когда он открывает PDF, он преобразует все страницы в векторное изображение (которое может сохранить растровые части из исходного PDF в качестве растровых частей) и открывает его в части LibreOffice Draw пакета LibreOffice. Затем, когда он сохранит отредактированный файл PDF, это будет файл PDF, который был экспортирован из собственного формата LibreOffice Draw (с суффиксом .odg ) в PDF.
Курт Пфайфл
3
(2/2) Этот рабочий процесс может иметь неожиданные побочные эффекты. Более того, приложение LibreOffice Draw может не в состоянии правильно импортировать все элементы из исходного PDF. Тем не менее, во многих случаях это все еще может быть полезным инструментом для всех тех людей, которые не имеют более доступных средств.
Курт Пфайфл