Иногда в работе приходится сталкиваться с такой ситуацией, что программа или сервис формирует нужный нам документ для печати в готовом виде, например, в формате .pdf, но нам нужно еще что-то в нем добавить/убрать текстовое поле или логотип, причем сделать это быстро и незаметно, и только для распечатанного документа. Например, при печати актов из одного хорошего сервиса сервиса онлайн бухгалтерии, мне очень не хватало функционала добавления кастомного блока с адресом для возврата, при печати актов выполненных работ. Уверен, подобные ситуации далеко не редкость. Итак,
Дано: Программа или сервис, с возможностью подготовки документов для печати. Компьютер с установленной операционной системой Ubuntu (или Debian) и графической средой. Любое оборудование для печати.
Задача: Сделать возможным печать готового документа .pdf с автоматическими изменениями перед самой печатью.
Решение:
Вкратце, предлагаемая логика работы такая: мы посылаем документ на печать «в файл» (виртуальный принтер), далее при его сохранении срабатывает скрипт, который изменяет содержимое документа и отправляет уже на физическое устройство печати.
1. Начнем с установки программы, которая умеет “следить” за событиями в файловой системе и реагировать нужным нам образом.
Установим incron:
[user@ubuntu-desktop ~]$ sudo aptitude install incron
После установки, настроим программу incron
Кофигурационные файлы:
/etc/incron.conf — Главный файл конфигурации incron
/etc/incron.d/ — Директория для конфигов заданий
Добавим, новое задание для нашей задачи. Синтаксис заданий:
<directory> <file change mask> <command or action> options
например, для нашего скрипта, при создании (сохранении) нового .pdf файла
/var/www/html IN_CREATE /user/home/scripts/print_pdf.sh
Полный список возможностей и условий срабатывания incron, в man incron
2. Далее установим программу для редактирования .pdf - pdftk. Pdftk умеет работать с .pdf файлами из командной строки, это удобно для использования в скриптах. Она непростая и функционал очень объёмный, но нам нужно от нее совсем немного, а именно возможность “склеивания” двух .pdf документов (опция — background).
Установка pdftk:
[user@ubuntu-desktop ~]$ sudo aptitude install pdftk
Пример изпользования:
[user@ubuntu-desktop ~]$ pdftk in.pdf background back.pdf output out.pdf
В данном примере, программа использует начальный файл in.pdf, далее с помощью опции background и файла back.pdf делает склеивание, и на выходе получаем файл out.pdf
Полный список возможностей обработки документов в pdftk, в man pdftk
3. После того как мы смогли изменить файл с помощью pdftk, мы должны организовать его печать. Печатать будем через стандартную консольную программу lp.
Пример изпользования lp:
[user@ubuntu-desktop ~]$ lp filename
4. На финальном этапе, мы объединим все эти инструменты для автоматизации процесса печати. Создадим директорию print в домашней папке пользователя. Сделаем файл с нужным нам содержанием в формате .pdf и сохраним его в директории print под именем back.pdf. Настроим incron для слежения за директорией print, для этого добавим файл задания /etc/incron.d/print_pdf, следующего содержания:
/home/user/print IN_CREATE /home/user/print/print.sh
Теперь когда мы посылаем на печать «в файл» (виртуальный принтер, или просто сохраняем) в директорию print, срабатывает скрипт print.sh.
Пример, содержания скрипта print.sh, для печати актов выполненных работ с подстановкой адресного блока на одном из двух экземпляров:
#!/bin/bash
sleep 3
DIR=/home/user/print
/usr/bin/lp -P 1 "${DIR}"/*.pdf
/usr/bin/pdftk "${DIR}"/*.pdf background "${DIR}"/back output "${DIR}"/out
/usr/bin/lp -P 1 "${DIR}"/out
rm -f "${DIR}"/*.pdf "${DIR}"/out
Итог: Если нам нужно распечатать документ pdf с нужными дополнениями в содержании, мы просто выбираем печать (или сохранение) «в файл» и выбираем директорию print, всё остальное сделает за нас incron, pdftk и lp. Мы получили возможность печатать подготовленный документ с автоматически редактированием “на лету” не прибегая к дополнительным, долгим и сложным манипуляциям с программами для редактирования pdf.
Пример исполнения: