В этой безблагодатной и беспросветной жизни, когда тебе в линукс
присылают документы в 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Эти значения можно отредактировать в полученном текстовом файле (report.txt в этом примере) и загрузить обратно:
InfoValue: Coders At Work
InfoKey: Author
InfoValue: Peter Seivel
InfoKey: Subject
InfoValue: Programming
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, который от него, собственно, и ждёшь.
16 комментариев: |высказаться!| RSS-лента дискуссии.|
Совсем не понимаю, почему не удостоена вниманием библиотека Poppler, с замечательными утилитами pdfseparate и pdfunite? А еще, богатые возможности GhostScript? Вместо этого какие-то поделки на Java и Tcl.
Ещё есть один проект PDF-Shuffler:
http://sourceforge.net/projects/pdfshuffler/
Для обычной склейки pdf, удаления страниц обычно вполне хватает.
В последнее время каждая заметка превращается в плач Ярославны и смачный пинок под зад линуксу. Если работа в Linux у автора сопряжена с воем и рыданием, что мешает поставить ОС проприетарную? Конечно, не факт, что воя и рыданий там будет меньше.
Важная информация собранная в одном месте и искрометный юмор.
Получил массу удовольствия от вашей статьи!
Большое спасибо!
Кстати, вопрос:
Приходилось ли вам встречать программу (решение, велосипед, волшебную фразу) для заполнения кириллицей pdf с полями для ввода текста?
Для конвертирования eps в pdf всё время пользовался утилитой epstopdf, у которой всё в порядке с BoundingBox. Статья подвигла меня выяснить, из какого-таки пакета родом это чудо (раз, по-видимому, в стандартных его нет); оказалось, что из texlive-font-utils.
Так уж случилось, что texlive я все время ставил на всю катушку, и соответственно, epstopdf была всегда под рукой, а косяка в ps2pdf не замечал. А косяк, да, отвратительный.
Ну а за статью спасибо.
к pdftk есть графические фронтэнды
@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, но никогда этим не пользовался. Я уж как-нибудь по-старинке, вприсядку :-)
@riedel комментирует...
Для конвертирования eps в pdf всё время пользовался утилитой epstopdf, у которой всё в порядке с BoundingBox.
Хммм, это интересно. Я про эту утилиту, если честно, не знал. Или забыл. Она в моём дебиане тут:
texlive-font-utils
что, конечно, сразу очевидно :-)
Статья подвигла меня выяснить, из какого-таки пакета родом это чудо
Ну да, оно не в самом видном месте, скажем так. Просто мой шеф любит pdflatex, и всегда меня долго и громко благодарит на испанском за то, что у меня какие-то eps. Я как-то прошёлся ps2eps14 по постскриптам, сконпелировал и обомлел. Найти волшебный ключик -dEPSCrop стоило, скажем мягко, усилий, что и послужило причиной эмоциональной реакции в посте.
А косяк, да, отвратительный.
Я бы мог отнестись с бОльшим пониманием, если бы сохранение размеров было по умолчанию, а вклейка в пустой А4 файл - опцией. Но я и авторы ps2pdf курим разные шишки :-)
Ну а за статью спасибо.
Пожалуйста. А вам спасибо за epstopdf. Век живи - век учись...
@dimio комментирует...
к pdftk есть графические фронтэнды
А можно ссылок в студию? А то у меня только pdftk и ничего больше.
@virens комментирует...
В моём дебиане этого нет. А pdftk есть
Это требует Tcl/Tk, у меня этого нет. Так что о годности софта будем судить по тому, требуется ли ввести "apt-get install" или нет?
Под линукс? Нет, конечно: там и выделенный текст-то в PDF-файлах вытаскивается с воем и рыданиями
Я уже давал ссылку на свой репозиторий, но похоже, что не в того коня корм. Зато разводить плачи Ярославны это так по-мужски.
И особых подвижек в сторону большего количества нормального софта я не вижу: как стоял у меня ВиртуальныйЯщик с виндовым софтом, так и стоит.
Так и есть, и будет всегда. Потому что Linux - среда для программистов, это ни плохо ни хорошо, это просто факт. Почитай Спольски на эту тему, я с ним абсолютно согласен.
У меня уже были мысли прикрыть эту лавку... но я просто хочу взять тайм-аут.
Может, тебе стоит составить такой же список "Я не перестану вести этот блог, потому что…" для себя?
Я бы мог отнестись с бОльшим пониманием, если бы сохранение размеров было по умолчанию, а вклейка в пустой А4 файл - опцией. Но я и авторы ps2pdf курим разные шишки :-)
Михаил, ты не понимаешь разницы между PS и EPS, а начинаешь опять про вселенский заговор против пользователей линукса. BoundingBox входит в стандарт EPS, термин "Encapsulated" на это недвусмысленно намекает. PostScript, напротив, не поддерживает размер изображения, это там просто нет. Выучи матчасть наконец. То есть, только epstopdf. Есть и у нее заморочки, например, если в рисунке подписи выполнены LaTeX-шрифтом, то BoundingBox определяется некорректно, но это уже проблемы самого шрифта, для которого заранее нельзя определить размер символов.
Что-то совсем не похоже на подручные средства. Все эти программы надо устанавливать.
Спасибо за статью, как раз сегодня понадобилось.
Сравнил варианты с использованием gs и pdftk, последний работает гораздо быстрее (3m38.926s и 11.654s, соответственно). При этом gs выполняет оптимизацию получившегося документа (размер склеенного pdf меньше суммарного размера исходных файлов), а pdftk - нет, размеры совпадают.
@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.
Я обычно вот эту штуку использую: http://jpdftweak.sourceforge.net/
«Склейка в буклет» по-научному называется спуск полос. Истинный путь этого в линупсе — при помощи ghostscript и psutils, скрипт в одну строчку.
Самая простая склейка JPG в PDF:
convert *.jpg 1.pdf
Можно еще бесплатный онлайн конвертер использовать, например http://pdfburger.com/combine-to-pdf
Отправить комментарий