Сей журнал создан для технических записок, касающихся моей работы и интересов в сфере ПО и ЭВМ. Все записи по возможности обновляются.

вторник, 9 марта 2010 г.

Причесываем pdf

Иногда статьи и книги в pdf сверстаны достаточно неэкономично, с большими полями и пустыми страницами. Читать такие пдфки не очень удобно, особенно на экране недобука или планшета. Тем более, печатать. Но все это исправимо. Поставим задачу так. Требуется: 1) обрезать поля, 2) изъять "лишние" страницы, 3) сверстать новый pdf, расположив по две страницы на одной стороне листа. Маньяки или читеры, готовящие шпоры на экзамен, могут верстать и по 4, и по 6 страниц на лист =)

Есть три замечательных опенсорсных утилиты: pdfcrop, pdftk и pdfnup. Первая представляет из себя скрипт на перле, вторая — достаточно массивная программа, написанная на Java и C++, а последняя и вовсе shell-скрипт из состава pdfjam. Как раз все три утилиты делают ровно то, что нам нужно.
Сначала устанавливаем нужные пакеты. В gentoo это app-text/texlive-core, app-text/pdftk и app-text/pdfjam. pdftk потребует gcc с включенным USE-флагом gcj и будет очень долго компилироваться.

Итак, три команды:

pdftk doc.pdf cat 1-2 4-end output doc_cat.pdf
pdfcrop --clip --margin 5 doc.pdf doc_crop.pdf
pdfnup --nup 2x1 doc_crop.pdf
pdftk имеет простой и понятный синтаксис: указывается файл на входе, диапазон страниц и файл на выходе. Думаю, смысл управляющих слов понятен. Надо заметить, что имена файлов, содержащие "-", утилитой не воспринимаются. Будьте бдительны!
В pdfcrop важно указывать размер оставляемого поля: --margin n. Кстати, даже значения 5 иногда недостаточно: следите за ним, иначе вы рискуете напечатать края документа не на бумаге, а на валиках принтера ;)
pdfnup нужно указать формат вывода в виде значений количества листов по горизонтали и по вертикали. Название результирующего файла будет таким же, как и его родитель, с окончанием в виде тех самых параметров, которые мы указали.

Кстати, есть замечательная заметка про способы обрезания полей документов. Первый из способов - это как раз pdfcrop, остальные два — это растеризация в ImageMagick (что в случае математических формул довольно сурово) и PDFedit. С последним у меня как-то не сложилось: несмотря на подробнейшую инструкцию, программа отказалась делать то, что от нее хотят. Ко всему прочему, библиотека Qt 3-й версии в Gentoo будет удалена 15-го марта, а PDFedit как раз ее и использует.

Можно пойти дальше и разбить документ на четные и нечетные страницы, чтобы печатать с двух сторон листа. Тут нам поможет эта заметка, сводящаяся к использованию psnup, psselect для ps-файлов и того же набора утилит pdfjam для pdf.
Можно воспользоваться и другими возможностями pdftk: они описаны в статье Manipulating PDFs with the PDF Toolkit. Это не только склеивание и разбиение pdf-файла постранично, но и изменение метаданых pdf-файла, добавление к документу приложений и заполнение форм.

Раз уж такая пьянка пошла, упомяну тут модуль для Python pyPdf. По ссылке приведены примеры использования, вот пример по конвертации pdf в текст.

Кто такой

Моя фотография
Москва, Москва, Russia
Дипломированный астроном, закончил аспирантуру Специальной Астрофизической Обсерватории РАН. Москвич

Ярлыки