11/18/2013

Как объединить и разбить PDF в Linux подручными средствами

В этой безблагодатной и беспросветной жизни, когда тебе в линукс присылают документы в DocX и формы в последнем Adobe Acrobat, приходится несладко. Часто заполненные с воем и рыданиями PDF-файлы приходится склеивать или, наоборот, разрезать на несколько. К счастью,деятели опенсорса иногда отвлекаются от Wayland, Mir и прочих systemd и делают годные костыли для простых страждущих.

Объединение файлов pdf в один с помощью PDFSaM

Для тех, кто не хочет перечитывать томик квантовой физики от авторов pdftk, есть вариант с рюшечками и бубенчиками под названием PDF Split and Merge (pdfsam).
Как это всегда бывает, когда что-то кажется слишком прекрасным, чтобы быть правдой, обязательно найдётся заподлянка. И pdfsam не исключение - написан он на Java, а это значит кучи exceptions по поводу и без, лютые тормоза и интерфейс из фильма ужасов.

Установка и использование PDFsam в Linux

Скачать самую свежую версию можно здесь. Запуск этого поделия командой
$ java -jar pdfsam
даёт что-то вроде:


Собственно, дальше всё довольно просто: pdfsam умеет объединять (merge), разрезать (split), поворачивать (rotate) документы PDF. Кроме того, имеет место быть режим burst, при котором из одного PDF-файла будет сделана куча одностраничных.


Например, для объединения PDF-файлов в один, просто добавляем файлы в порядке следования, выбираем новое имя файла и жмём RUN.

Из преимуществ можно отметить разве что графический, скажем так, интерфейс. Всё остальное - это типичное джава приложение: глючное, медленное и корявое (например, при split нужно указывать номер страницы, на единицу меньший той, с которой разрезание начнётся, и т.д.).

Сжатие и компрессия PDF файлов

Побочным продуктом работы pdfsam может быть раздувание PDF-файла до непричиных размеров. Этому горю можно помочь с помощью утилиты gs вот так:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Это может сжать PDF, по крайней мере в большинстве случаев.

Мастерам консоли: резка и склейка PDF файлов в pdftk

PDFtk расшифровывается как pdf tool kit, и, как и подобает настоящему набору инструментов, требует некоторого изучения. Зато работает быстро, умеет много и клацать мышью не надо.
Установка pdftk проста - он уже есть в Debian:
$ sudo apt-get install pdftk
Синтаксис pdftk можно описать примерно так:
pdftk исходный_файл.pdf ДЕЙСТВИЕ страницы output получаемый_файл.pdf
Итак, поехали....

Как разбить PDF файл на несколько

Для того, чтобы разрезать PDF-файл на несколько, нужно воспользоваться ДЕЙСТВИЕМ cat, например вот так:
$ pdftk document.pdf cat 140-142 output zz1.pdf
Эта команда выдаст файл zz1.pdf, в котором будут три страницы, а именно 140, 141 и 142. Если же нужно разбить файл с какой-то страницы до конца, делаем так:
$ pdftk foo.pdf cat 30-end output biography.pdf

Объединение нескольких файлов PDF в один с помощью PDFtk

Та же самая команда cat может склеивать PDF-файлы в один:
$ pdftk zz* cat output Issue26.pdf
служит для объединения всех файлов, содержащих zz в имени, в один Issue26.pdf
Если файлы называются по-разному, можно использовать следующую команду для объединения файлов в один:
$ pdftk 1.pdf 2.pdf ... cat output merged.pdf
будет объединён в один файл merged.pdf.

Изменение полей PDF-документа

Речь идёт о полях в PDF файле вроде автора, заголовка или времени создания:

Не раз и не два товарищи, работающие с документами повышенной важности, оставляли в этих полях значения, подставленные услужливым MS Word - и имели на этом немало проблем. Это можно поправить с помощью pdftk сравнительно легко.
Сначала достаём исходные данные (metadata):
pdftk book.pdf dump_data output report.txt
В этом файле мы увидим нечто вроде:
InfoKey: Title
InfoValue: Coders At Work
InfoKey: Author
InfoValue: Peter Seivel
InfoKey: Subject
InfoValue: Programming
Эти значения можно отредактировать в полученном текстовом файле (report.txt в этом примере) и загрузить обратно:
pdftk book.pdf update_info report.txt output bookcopy.pdf
У pdf-документов могут быть и другие поля, которые тоже можно поправить при желании.

И это ещё не всё!

Возможности pdftk весьма велики, и желающие могут припасть к официальной документации.


Склейка страниц PDF файла в буклет с помощью LaTeX pdfpage

Отличная иллюстрация мощи пакета pdfpages была найдена на tex.stackexchange.com. Идея сводится к тому, что сначала мы создаём исходный документ, а потом ещё один, в который вставляются PDF-страницы в нужном порядке.

Например, у нас есть документ под формат А6, созданный в ЛаТеХе (назовём его mya6doc.pdf:

\documentclass{book}
\usepackage[english]{babel}%
\usepackage[a6paper]{geometry}% http://ctan.org/pkg/geometry
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\begin{document}
\chapter{First chapter} \lipsum[1-10]
\chapter{Second chapter} \lipsum[11-20]
\chapter{Third chapter} \lipsum[21-30]
\chapter{Final chapter} \lipsum[31-40]
\end{document}

Теперь создаём ещё один документ (назовём его mya4doc):

\documentclass{article}
\usepackage[english]{babel}%
\usepackage[a4paper]{geometry}% http://ctan.org/pkg/geometry
\usepackage{pdfpages}% http://ctan.org/pkg/pdfpages
\begin{document}
\includepdf[pages=-,nup=2x2,frame,noautoscale]{mya6doc}%
\end{document}

Скомпилировать его нужно с помощью pdflatex. Это позволит получить все страницы (pages=-) в 2x2 страницы на одной (nup=2x2) с прорисованной границей вокруг каждой страницы (frame).

Это означает, что pdfpages воспринимает вставляемые страницы как изображения, так что можно дополнительно задать поля для обрезки:

\includepdf[pages=1,landscape,clip,trim=1cm 2cm 3cm 4cm,frame,noautoscale,fitpaper=false]{AllTheMyGTDinOneScheme}

то есть страница будет обрезана на 1, 2, 3, 4 сантиметра слева, снизу, справа и сверху. Опция clip=true обрежет страницу.

Путь джедая: склеивание PDF документов с помощью gs

Как многие джедаи уже в курсе, gs это GhostScript, свободный как Столлман интерпретатор postscript и, соответственно, PDF. Командой gs можно не только орехи колоть, но и соединять документы. Соединять документы с помощью Ghostscript можно вот так:
$ gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file1.pdf file2.pdf
Теперь что это всё значит:

-dBATCH -- после окончания пакетной обработки, GS прекращает работу (без этой опции он будет продолжать имитировать бурную деятельность)
-dNOPAUSE -- обрабатывать каждую страницу без пауз между ними
-q -- тихий режим, без выдачи сообщений
-sDEVICE=pdfwrite -- использовать встроенный обработчик PDF
-sOutputFile=finished.pdf -- записать выхлоп в файл finished.pdf
 
Преимущество такого джедайства в том, что Ghostscript входит во все дистрибутивы Linux и часто уже установлен в системе. И не нужно тащить килотонны джавы.

Сохранение размеров EPS файлов при конвертировании в PDF

Не совсем в тему, но тем не менее про PDF. Дело в том, что при конвертировании файлов EPS в PDF разными поделками вроде ps2pdf вы получаете PDF в виде пустой страницы A4 с картинкой EPS где-то в углу. То есть поделка ps2pdf просто игнорирует выставленный BoundingBox при использовании по умолчанию:
 
$ ps2pdf letterhead.eps
Я не буду говорить о вменяемости авторов ps2pdf, но всякий разработчик с IQ выше комнатной температуры должен понимать, что подобные WTF-моменты в пользовательском опыте в конечном итоге приводят к тому, год линупсов на десктопе уезжает в голубую даль. И это происходит именно из-за таких вот казусов, коих в ёпенсорце год от года становится только больше из-за набегающих леннартов поттерингов и прочих ковбоев, склонных к тяжёлому велосипедостроению там, где этого абсолютно не требуется.
Так как ps2pdf принимает те же аргументы, что и Ghostscript, имеющий 900 газиллионов опций, среди которых должна быть возможность сохранять BoundingBox. И таки да, чудо случилось:

$ ps2pdf -dEPSCrop letterhead.eps

который даёт тот самый PDF, который от него, собственно, и ждёшь.

Заключение

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

16 комментариев:

  1. Совсем не понимаю, почему не удостоена вниманием библиотека Poppler, с замечательными утилитами pdfseparate и pdfunite? А еще, богатые возможности GhostScript? Вместо этого какие-то поделки на Java и Tcl.

    ОтветитьУдалить
  2. Ещё есть один проект PDF-Shuffler:
    http://sourceforge.net/projects/pdfshuffler/
    Для обычной склейки pdf, удаления страниц обычно вполне хватает.

    ОтветитьУдалить
  3. В последнее время каждая заметка превращается в плач Ярославны и смачный пинок под зад линуксу. Если работа в Linux у автора сопряжена с воем и рыданием, что мешает поставить ОС проприетарную? Конечно, не факт, что воя и рыданий там будет меньше.

    ОтветитьУдалить
  4. Важная информация собранная в одном месте и искрометный юмор.
    Получил массу удовольствия от вашей статьи!
    Большое спасибо!
    Кстати, вопрос:
    Приходилось ли вам встречать программу (решение, велосипед, волшебную фразу) для заполнения кириллицей pdf с полями для ввода текста?

    ОтветитьУдалить
  5. Для конвертирования eps в pdf всё время пользовался утилитой epstopdf, у которой всё в порядке с BoundingBox. Статья подвигла меня выяснить, из какого-таки пакета родом это чудо (раз, по-видимому, в стандартных его нет); оказалось, что из texlive-font-utils.
    Так уж случилось, что texlive я все время ставил на всю катушку, и соответственно, epstopdf была всегда под рукой, а косяка в ps2pdf не замечал. А косяк, да, отвратительный.
    Ну а за статью спасибо.

    ОтветитьУдалить
  6. к pdftk есть графические фронтэнды

    ОтветитьУдалить
  7. @iv_vl комментирует...

    Совсем не понимаю, почему не удостоена вниманием библиотека Poppler, с замечательными утилитами pdfseparate и pdfunite?

    В моём дебиане этого нет. А pdftk есть - у него, кстати, один из самых вменяемых командных интерфейсов.

    А еще, богатые возможности GhostScript?
    В гробу я их видал, эти "богатые возможности", особенно вот это:

    ps2pdf -dEPSCrop letterhead.eps

    В посте я про это уже сказал, что так делают только полные [цензура].

    Вместо этого какие-то поделки на Java и Tcl.
    Главное, Володя, что они работают, а то мне надо было отправлять заявку на грант, а оно просит ОДИН большой PDF-файл, а не пару мелких. Мне ехать, а не шашечки.


    @Viktor Yu. Kovalskiy комментирует...
    Ещё есть один проект PDF-Shuffler:
    Виктор, есть проблема:

    PDF-Shuffler is a small python-gtk application

    python-gtk application

    У меня уже стоит пистон2.4 для старых скриптов, пистон 2.6 для почти всего, а на днях пионэр-автор ReTeXt перешёл на пистон3. Как бы это помягче выразиться, но я не стану превращать свой ноутбук в гадюшник.

    @redVi комментирует...
    В последнее время каждая заметка превращается в плач Ярославны и смачный пинок под зад линуксу.
    Возможно потому, что время идёт, Андроид занимает 80% рынка мобильников, а десктопный линукс где был, там и остаётся. И особых подвижек в сторону большего количества нормального софта я не вижу: как стоял у меня ВиртуальныйЯщик с виндовым софтом, так и стоит.

    А возможно, мне нужно взять перекур с блогом. У меня уже были мысли прикрыть эту лавку... но я просто хочу взять тайм-аут. Тем более, что у меня на носу переезд в другой университет.

    Если работа в Linux у автора сопряжена с воем и рыданием, что мешает поставить ОС проприетарную?
    Я пристально смотрю на Мак, но там свои косяки, самый главный из которых - мне навязывают макинтошный стиль работы. А это deal-braker.

    @inickto комментирует...
    Важная информация собранная в одном месте и искрометный юмор.
    Насчёт последнего автор не уверен, а про информацию - это да, долго собирал.

    Приходилось ли вам встречать программу (решение, велосипед, волшебную фразу) для заполнения кириллицей pdf с полями для ввода текста?

    Под линукс? Нет, конечно: там и выделенный текст-то в PDF-файлах вытаскивается с воем и рыданиями, а тут такой хайтек.

    Всё, что я слышал, это то, что есть FDF-toolkit, но никогда этим не пользовался. Я уж как-нибудь по-старинке, вприсядку :-)

    ОтветитьУдалить
  8. @riedel комментирует...
    Для конвертирования eps в pdf всё время пользовался утилитой epstopdf, у которой всё в порядке с BoundingBox.

    Хммм, это интересно. Я про эту утилиту, если честно, не знал. Или забыл. Она в моём дебиане тут:

    texlive-font-utils

    что, конечно, сразу очевидно :-)

    Статья подвигла меня выяснить, из какого-таки пакета родом это чудо
    Ну да, оно не в самом видном месте, скажем так. Просто мой шеф любит pdflatex, и всегда меня долго и громко благодарит на испанском за то, что у меня какие-то eps. Я как-то прошёлся ps2eps14 по постскриптам, сконпелировал и обомлел. Найти волшебный ключик -dEPSCrop стоило, скажем мягко, усилий, что и послужило причиной эмоциональной реакции в посте.

    А косяк, да, отвратительный.
    Я бы мог отнестись с бОльшим пониманием, если бы сохранение размеров было по умолчанию, а вклейка в пустой А4 файл - опцией. Но я и авторы ps2pdf курим разные шишки :-)

    Ну а за статью спасибо.
    Пожалуйста. А вам спасибо за epstopdf. Век живи - век учись...


    @dimio комментирует...
    к pdftk есть графические фронтэнды
    А можно ссылок в студию? А то у меня только pdftk и ничего больше.

    ОтветитьУдалить
  9. @virens комментирует...
    В моём дебиане этого нет. А pdftk есть
    Это требует Tcl/Tk, у меня этого нет. Так что о годности софта будем судить по тому, требуется ли ввести "apt-get install" или нет?

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

    И особых подвижек в сторону большего количества нормального софта я не вижу: как стоял у меня ВиртуальныйЯщик с виндовым софтом, так и стоит.
    Так и есть, и будет всегда. Потому что Linux - среда для программистов, это ни плохо ни хорошо, это просто факт. Почитай Спольски на эту тему, я с ним абсолютно согласен.

    У меня уже были мысли прикрыть эту лавку... но я просто хочу взять тайм-аут.
    Может, тебе стоит составить такой же список "Я не перестану вести этот блог, потому что…" для себя?

    Я бы мог отнестись с бОльшим пониманием, если бы сохранение размеров было по умолчанию, а вклейка в пустой А4 файл - опцией. Но я и авторы ps2pdf курим разные шишки :-)
    Михаил, ты не понимаешь разницы между PS и EPS, а начинаешь опять про вселенский заговор против пользователей линукса. BoundingBox входит в стандарт EPS, термин "Encapsulated" на это недвусмысленно намекает. PostScript, напротив, не поддерживает размер изображения, это там просто нет. Выучи матчасть наконец. То есть, только epstopdf. Есть и у нее заморочки, например, если в рисунке подписи выполнены LaTeX-шрифтом, то BoundingBox определяется некорректно, но это уже проблемы самого шрифта, для которого заранее нельзя определить размер символов.

    ОтветитьУдалить
  10. Что-то совсем не похоже на подручные средства. Все эти программы надо устанавливать.

    ОтветитьУдалить
  11. Спасибо за статью, как раз сегодня понадобилось.

    Сравнил варианты с использованием gs и pdftk, последний работает гораздо быстрее (3m38.926s и 11.654s, соответственно). При этом gs выполняет оптимизацию получившегося документа (размер склеенного pdf меньше суммарного размера исходных файлов), а pdftk - нет, размеры совпадают.

    ОтветитьУдалить
  12. @virens

    Не критики ради, а просто в качестве уточнения:

    1. ps2pdf -- это и есть GhostScript. Все эти утилиты (ps2pdf*) являются sh-скринтами обёртками к gs с параметром -sDEVICE=pdfwrite. В этом легко убедиться сделав "less /usr/bin/ps2pdfwr"

    2. Более "продвинутые" sh-обёртки, вроде eps2pdf, можно взять здесь:
    http://www.few.vu.nl/~wkager/tools.htm

    3. epstopdf -- это тоже обёртка вокруг gs, но на этот раз на Perl'е

    4. Вот здесь http://pdfchain.sourceforge.net/links.html неплохой набор ссылок на программы для работы с pdf.

    ОтветитьУдалить
  13. Я обычно вот эту штуку использую: http://jpdftweak.sourceforge.net/

    ОтветитьУдалить
  14. «Склейка в буклет» по-научному называется спуск полос. Истинный путь этого в линупсе — при помощи ghostscript и psutils, скрипт в одну строчку.

    ОтветитьУдалить
  15. Самая простая склейка JPG в PDF:
    convert *.jpg 1.pdf

    ОтветитьУдалить
  16. Можно еще бесплатный онлайн конвертер использовать, например http://pdfburger.com/combine-to-pdf

    ОтветитьУдалить