(861) 244 20 15

Печать документа .pdf с изменениями «на лету»

Иногда в работе приходится сталкиваться с такой ситуацией, что программа или сервис формирует нужный нам документ для печати в готовом виде, например, в формате .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.

 
Пример исполнения:






Контакты 350058, г. Краснодар, ул.Старокубанская, д. 114, лит. Б, оф. 4 (861) 244-20-15