Як переглянути та відредагувати код файлу 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 шукати символів у бінарному вмісті? Чи сім спочатку кодує символи запиту перед пошуком? (2) В останній команді, що робить !, \bі gзначить? Чи можна це зробити без перла, лише з sed?
Тім

1
@Tim (1) Sed завантажує дані в пам'ять, оперує ними та роздруковує їх. Навіщо потрібно було що-небудь кодувати? (2) gозначає замінити всі події на кожному рядку, як sed, так і perl. !- роздільник; ви можете вибрати (майже) будь-який символ як роздільник для sкоманди (це йде і в sed, і в perl). \bозначає межу слова; він існує в perl, але не в sed.
Жил 'ТАК - перестань бути злим'

Про (1), тому що символи, які ви даєте 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, які, можливо, більше не зможуть відкрити його, так як PDF - файли внутрішньої ToC пошкоджена, який заснований на байти зміщення розрахунків. Просто замінити Fitна XYZрядках повинні йти нормально, хоча ...)


1
Ви також можете додавати або видаляти текст. Коли довжина потоку об'єкта змінюється, зміщення байтів може бути перераховано за допомогою fix-qdfпрограми, що входить до qpdf. Ти все ж повинен бути трохи обережним. Дивіться qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H.

@ H.Rittich: Thx для коментаря ... Яким чином, на вашу думку, це відкриває нову перспективу проблеми? Ви думали, що ми не знаємо, що можемо додавати або видаляти текст таким чином?
Курт Пфайфл

@KursPfeifle: Я не роблю припущень щодо того, що ви знаєте. У відповіді зазначається, що таким чином редагуючи PDF потрібно зберегти зміщення байтів об'єктів у файлі. Однак можливо змінити зміщення байтів при подальшому виправленні їх за допомогою fix-qdf. Отже, якщо ви хочете замінити рядок рядком різної довжини, це можливо, але вам потрібно скористатися fix-qdfінструментом. Я б сказав, що це корисне доповнення до відповіді.
Х.

@ H.Rittich: Thx для надання вашої перспективи. Коли я наголошував на необхідності збереження зміщення байтів об'єктів, я не хотів порадити людям щодо того, ЯК вони повинні це робити. Якби ви сформулювали ваш коментар трохи інакше, я швидше зрозумів би намір вашого коментаря.
Курт Пфайфл

1

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

Крім того, і Emacs (GNU і XEmacs), і vim безперешкодно відкривають файли PDF. Звичайно, це не дуже симпатично, оскільки це змішаний текст та двійковий текст, але цього достатньо для ваших цілей редагування.
Існує плагін Pdftk для vim, який полегшує все, завантажте тут (zip-файл).
Як ви, напевно, знаєте, обидва вище редактори мають потужні можливості пошуку та заміни.

Крім того, перетворення PDF в режим QDF перед тим, як зробити редагування файлів PDF дійсно простим.


Ви також можете спробувати редагувати за sedдопомогою -bперемикача. якщо це працює, я додам це до своєї відповіді.
Філомат

@Tim: що ти маєш на увазі під "нічого не показує", просто порожній? будь-яке повідомлення про помилку? Також ви можете спробувати з XEmacs? (усі троє працювали на мене).
Філомат

Незважаючи на -bце, це цигуін специфічно.
Філомат

Emacs каже: "Файл 1.pdf великий (9 МБ), дійсно відкритий? (У чи п)". Я вибрав "у", і тоді нічого там немає.
Тім

Швидше за все, проблема Emacs, у вас є XEmacs? (Я щойно відкрив 31 Мб PDF без проблем).
Філомат

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. Однак у багатьох випадках він все-таки може бути корисним інструментом для всіх тих, хто не має кращих засобів.
Курт Пфайфл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.