Работа с PDF в Linux

Все, кто пытается освоить издательскую деятельность в Linux сталкиваются с вопросом, как тут делать спуск полос. В этой статье я хочу обобщить всё то, что мне удалось найти в интернете.
Отдельной программы, которая бы делала все необходимые манипуляции с PDF в Linux пока нет (или я не нашёл). Но все операции легко выполняются специализированными утилитами (пролистайте статью до конца, чтобы некоторые из них увидеть). Под некоторые задачи можно найти графические приложения (очень полезные PdfShuffler, BookletImposer, Pdfbooklet и Boomaga рассмотрены в конце статьи), другие можно выполнить через консоль. Чтобы не вспоминать каждый раз необходимые утилиты и их параметры, приведу тут примеры Bash-скриптов для нескольких основных операций в подготовке PDF к печати.
Всё операции буду приводить на примере документа rusgpl.pdf (с русским переводом текста лицензии GPLv3) - исходный формат страниц А4, количество страниц 19, ориентация книжная.

Спуск полос под переплёт на скобу или клеевой переплёт для тиражирования на ризографе

В этом случае у нас исходные страницы должны встать по две на каждой стороне листа. Причём так, чтобы напечатав одну сторону листа и перевернув, можно напечатать сразу оборот этого листа. То есть можно запустить на печать сразу нужный тираж первого листа (первая и последняя страницы книги), потом перевернуть пачку и отпечатать оборот на весь тираж (вторая и предпоследняя) и так далее по всем листам книги. После печати и подбора листов, можно всё согнуть и посадить на скобу, либо разрезать и сделать клеевой переплёт.
Исходные листы (формата А4):

Здесь и далее снимки с демонстрацией раскладки страниц получены из полезной программы PdfShuffler.
Открываем текстовый редактор (я в Fedora с GNOME 3 нажимаю Alt+F2 и ввожу "gedit"), вставляем в него текст Bash-скрипта (он будет располагать исходные страницы А4 по две на итоговых страницах А3):

#!/bin/bash
pdftops $1 - | psbook | \
psnup -pa3 -Pa4 -m0 -2 | \
ps2pdf -sPAPERSIZE=a3 - `echo $1 | \
sed -e "s/\.\(\w*\)/_imposed.\1/g"`;
Сохраняем в той же директории, где и наш PDF-файл (я назвал файл makebook_2.sh). Сделаем файл исполняемым (либо в свойствах файла, либо в консоли: chmod +x makebook_2.sh). Запускать скрипт так:

./makebook_2 rusgpl.pdf
В результате создаётся файл rusgpl_imposed.pdf:
Как видно, исходные страницы встали по две. Итоговый формат стал А3. Но ориентация осталась книжной, что неудобно - логичнее было бы видеть итоговую ориентацию альбомной (позже исправим). Не знаю почему, но так получается не всегда - чаще ориентация становится правильной.
Недостающая страница стала просто белой (видно на первом листе). Последовательность стала такой: первая, последняя; предпоследняя, вторая и т.д. Самые важные параметры в нашем небольшом скрипте: -Pa4 - формат исходных страниц; -pa3 и sPAPERSIZE=a3 - желаемый итоговый формат; -m0 - оставить поля как в исходных страницах; -2 - по сколько исходных страниц нужно разместить на одной итоговой странице.
Меняя в данном скрипте лишь форматы страниц можно охватить все самые распространённые случаи спуска полос для мягкого переплёта. Например, если есть исходные страницы А4, а их нужно уменьшить до А5 и расположить по две на итоговых страницах А4, то все три параметра нужно установить на А4.
Скрипт делает перевод из PDF в Postscript, переформировывает страницы и затем конвертирует обратно в PDF. Теоретически могут вознинуть проблемы с не встроенными шрифтами. Практически - надо проверять. Информацию по шрифтам в PDF-файле легко узнать в консоли, например, так:

pdffonts rusgpl.pdf

Спуск полос под клеевой переплёт для тиражирования на принтере

В этом случае у нас исходные страницы должны встать по две на каждой стороне листа. Причём на каждой стороне листа по копии соответствующей страницы исходного файла по принципу: 1-1, оборот 2-2. Так, напечатав одну сторону листа и перевернув (или печать дуплексом на принтере), можно напечатать сразу оборот этого листа. То есть можно запустить на печать дуплексом сразу весь файл, потом разрезать пачку пополам и получить две книги. После печати можно делать клеевой переплёт.
Сохранять и запускать скрипт аналогично предыдущему примеру.

#!/bin/bash
pdftk A=$1 B=$1 cat A Bend-1 output out.pdf;
pdftops out.pdf - | psbook | \
psnup -pa4 -Pa5 -m0 -2 | \
ps2pdf -sPAPERSIZE=a4 - `echo $1 | \
sed -e "s/\.\(\w*\)/_imposed.\1/g"`;
rm -f out.pdf;

Переворачиваем страницы в документе PDF

Открываем текстовый редактор и вставляем в него текст Bash-скрипта:

#!/bin/bash
pdftk $1 cat 1-endE output $2;
Сохраняем, например, с именем rotate_book.sh. Делаем исполняемым. Запускаем так:

./rotate_book.sh rusgpl_imposed.pdf rusgpl_imp_rot.pdf
Первый параметр - имя нужного файла, второй параметр - имя итогового файла, который хотим получить. В итоге уже наша книга выглядит совсем как надо. Остаётся только посылать на печать.

Спуск полос под твёрдый переплёт

Для твёрдого переплёта годятся книги от 92 листов и больше. Отпечатаные листы для таких толстых книг не сгибаются просто пополам, как в первом случае. Для толстых книг делается спуск полос, где формируются тетрадки, например, по 16 страниц. Для этого сделаем ещё один скрипт (makebook_16.sh):

#!/bin/bash
pdftops $1 - | psbook -s$2 | \
psnup -pa4 -Pa5 -m0 -2 | \
ps2pdf -sPAPERSIZE=a4 - `echo $1 | \
sed -e "s/\.\(w*\)/_book./g"`
pdftops `echo $1 | sed -e "s/\.\(w*\)/_book./g"` temp.ps
rm temp.ps
Здесь уже многие параметры знакомы. Добавляется параметр -s$2, который как раз и выполняет всю работу по формированию тетрадок по количеству страниц, указанному во втором параметре команды запуска. Например:

./makebook_16.sh rusgpl.pdf 16
Ничего хорошего в нашем случае не получится, т.к. не совпадают форматы, но если исправить скрипт на наши учебные a4 и a3, то получится вот так:
Обилие звёздочек означает что многие страницы были дополнены пустыми (до полной тетрадки из 16 страниц). В настоящем случае нужно все полные тетрадки сформировать этим скриптом, а оставшиеся - первым скриптом. Для этого можно либо написать расширеный Bash-скрипт (объединяющий два подхода), либо из копии рабочего файла удалить "лишние страницы" (например, воспользовавшись программой pdfshuffler) и прогнать через имеющиеся скрипты. Для 92 страниц "лишними" являются страницы больше 5*16=80 (т.е. 81, 81, 83,.. 91, 92).

Объединение файлов PDF

Когда создаём спуск полос для твёрдого переплёта указанным выше способом, нужно правильно обработать последнюю неполную тетрадь книги. В программе pdfshuffler можно с зажатой клавишей Shift выделить сразу несколько страниц. Таким образом, сначала удаляем страницы последней неполной тетрадки (и сохраняем оставшееся в отдельный документ), потом удаляем все страницы на полные тетрадки (и сохраняем в отдельный документ). С полными тетрадками делаем спуск полос как на твёрдый переплёт (см. выше), с неполной тетрадкой делаем спуск полос как на клеевой переплёт (см. выше). После этого оба документа можно объединить в один. В этом нам поможет программа PDF Chain:
Тут выбираем нужные файлы, выстраиваем их в правильной последовательности (если требуется, поворачиваем) и нажимаем "Сохранить как".

Обрезка полей

Иногда на полях документа PDF имеются ненужные пометки. Чтобы их убрать, нужно сначала подрезать поля на нужный размер, а затем восстановить исходный размер листа (например, А4).
Обрезка полей осуществляется в неких точках. 72 точки = 1 дюйм = (примерно) 25,4 миллиметра. Так формат А4 (210х297 мм) = 595х842 (595,276х841,89) точки. В примере ниже обрезаются слева и сверху по 36 точек из файла test.pdf с сохранением в файл cropped.pdf:

gs -o cropped.pdf -sDEVICE=pdfwrite -c \
"[/CropBox [36 36 559 806] /PAGES pdfmark" -f test.pdf
Узнать количество точек в нужном документе PDF можно с помощью утилиты pdfinfo:

pdfinfo test.pdf
или постранично (в примере с 1 по 5 страницу):

pdfinfo -f 1 -l 5 test.pdf | grep "Page"
Вот такой Bash-скрипт добавит поля до формата А4:

#!/bin/bash
pdftops $1 - | ps2pdf -sPAPERSIZE=a4 - `echo $1 | \
sed -e "s/\.\(\w*\)/_a4.\1/g"`;
Эти же операции (обрезка и наращивание) можно сделать в графическом интерфейсе через программу PDFEdit (функция "Изменить метрики страницы"):


Ещё одно удобное графическое приложение для обрезки PDF-листов - Krop:

Изменить формат листов в документе PDF

Например, необходимо из исходного формата страниц А4 получить документ со страницами формата А5. Команда для консоли будет такая:

gs -o rusgpl_a5.pdf -sDEVICE=pdfwrite \
-sPAPERSIZE=a5 -dFIXEDMEDIA -dPDFFitPage \
-dCompatibilityLevel=1.4 rusgpl.pdf
Превратить исходные страницы А4 в А3 можно аналогично:

gs -o rusgpl_a3.pdf -sDEVICE=pdfwrite \
-sPAPERSIZE=a3 -dFIXEDMEDIA -dPDFFitPage \
-dCompatibilityLevel=1.4 rusgpl.pdf

Склеить разные PDF в один


pdftk *.pdf cat output output.pdf

Разные полезные примеры использования pdftk

http://www.pdflabs.com/docs/pdftk-cli-examples/

Склеить картинки в PDF

После сканирования могут получиться отдельные файлы-картинки. Иногда их требуется объединить в один PDF-документ. Сделать в консоли это можно так:

convert *.png -background white -page a4 dogovor.pdf
Тут подгоняется всё под формат А4.

Графические программы для подготовки к печати на принтере и ризографе

BookletImposer

Некоторые виды спуска полос можно получить из графической утилиты BookletImposer
Программа BookletImposer не имела перевод на русский язык, - я его добавил. Ссылка на PO файл ru_RU.po. Перед установкой приложения (как указано в инструкции на сайте разработчика или в файле README) скопируйте файл перевода в каталог po (он находится сразу в корневом каталоге программы).

Boomaga

Очень полезное приложение нашлось на просторах KDE-aps.org - Boomaga. Тут уже можно делать спуск полос и для мягкого, и для твёрдого переплёта; для принтеров с дуплексной печатью и без. Плюс можно настроить приложение так, что оно будет выступать в роли виртуального принтера (т.е. печатать можно что угодно - не только PDF).
Так, для твёрдого переплёта, переключатель "Расположение" (слева) устанавливаем в "Книгой", в настройках ставим количество листов в тетради 6 (у нас тетрадки будут по 24 страницы), взводим переключатель "Печатать с разбивкой на тетради" и нажимаем [Файл/Сохранить как...]. Результат получаем мгновенно. Программа очень удобная и приятная, - просто находка для типографии!
К сожалению, для моей операционной системы (Fedora 21) не было установочного файла, - я его сделал сам (вот, как это было). Ссылка на RPM пакет boomaga-0.7.0-1.fc21.R.x86_64.rpm.

Pdfbooklet

Довольно широкие возможности по спуску полос и приятный интерфейс имеет программа Pdfbooklet. Если её нет в ваших репозиторях (в Mint, например нет), то на их странице http://sourceforge.net/projects/pdfbooklet/files/ можно скачать установочные пакеты различных типов.

Уменьшить размер PDF с картинками внутри

Задача возникает часто после сканирования документов в PDF - онлайн сервисы ограничивают объём файлов. Приходится ужимать существующие сканы, чтобы уложиться в лимиты. Вот как это сделать в командной строке:
convert -density 200x200 -quality 60 -compress jpeg input.pdf output.pdf
Если команда отвалится с ошибкой:
convert-im6.q16: not authorized `input.pdf' @ error/constitute.c/ReadImage/412.
convert-im6.q16: no images defined `output.pdf' @ error/convert.c/ConvertImageCommand/3258.
Значит настройки ImageMagick запрещают такую обработку PDF. Можно разрешить, отредактировав настройки в файле /etc/ImageMagick-6/policy.xml. Строку:
<policy domain="coder" rights="none" pattern="PDF" />
Заменить на:
<policy domain="coder" rights="read | write" pattern="PDF" /> 

Комментарии

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа