Как обрезать поля PDF с помощью pdftk и / MediaBox - PullRequest
7 голосов
/ 15 марта 2011

Я использовал pdftk, чтобы распаковать PDF, а затем открыл его как текстовый файл.
Я хочу отредактировать поле / MediaBox , которое в моем случае

/MediaBox [0 0 612 792]

Я хотел бы уменьшить поля, например

/MediaBox [100 0 512 792]

К сожалению, это не работает. Я могу изменить 0 на 2 или 9, но я не могу поставить 100, например.

Есть идеи, почему?

Ответы [ 3 ]

14 голосов
/ 25 февраля 2013

В строке 100 есть еще два числа, кроме 0. Когда вы используете текстовый редактор и добавляете символы, это делает файл длиннее.Вот почему замена на 9 или 2 или любую другую однозначную цифру работает нормально.Хотя текстовый редактор теоретически можно использовать для редактирования PDF, это не просто, и вы должны уважать внутреннюю структуру файла.Таблица внешних ссылок - это таблица в конце PDF-файла, которая сообщает читателю, где именно находится каждый объект.Его нужно менять всякий раз, когда изменяется длина или местоположение чего-либо.

Причина, по которой вышеописанный ручной метод pdftk не работает, заключается в том, что вы добавляете два байта в центр файла.Это ломает таблицу xref.Если вы вручную обновите все xref s, это будет работать, но это потенциально очень утомительно.Использование sed или любого другого инструмента для редактирования текста не решит проблему.podofo выполняет для вас xref расчет.

9 голосов
/ 06 апреля 2012

используйте sed для замены любой вхождение

sed 's/MediaBox \[0 0 612 792*/MediaBox \[100 0 512 792]/g'<in.pdf >out.pdf

или podofobox (внутри утилиты podofo )

без необходимости распаковка потоков PDFсначала (при необходимости с pdftk)

podofobox in.pdf out.pdf media 10000 0 51200 79200

, как вы можете видеть, podofobox использует значения MediaBox, умноженные на 100, так как его масштаб является кратным, поэтому вам нужно просто добавитьдва нуля ( 00 ) для значений, которые вы можете прочитать в поле MediaBox

5 голосов
/ 06 апреля 2012

Есть лучшие способы изменить поле PDF:

надеюсь, что вы нашли ответ на этот вопрос после публикации: -)

...