PDF для друидов 80-го уровня

Как известно, у обычных пользователей есть два основных инструмента для работы с файлами формата PDF – это распространенный бесплатный Acrobat Reader и Acrobat Professional. Второй, помимо далеко не нулевой цены, отличается возможностью создания и редактирования файлов. В нем можно компоновать несколько файлов, создавать и заполнять формы, прикреплять вложения, вставлять и удалять страницы, защищать файлы паролем и проделывать много других процедур. К сожалению, когда стоимость этой программы намного больше зарплаты пользователя, приходится искать альтернативы. Об одной из них я сегодня расскажу.

Герой сегодняшней статьи, утилита PDF Toolkit, как ни странно, работает в консоли. Ее пригодность лишь для командной строки была неожиданной, так как она работает с материалом, годным для работы исключительно графическими, не текстовыми средствами. Мое знакомство с ней состоялось при попытке автоматизировать некоторые этапы работы с документами. После долгого поиска была призвана к делу старая сисадминская аксиома: «все, что можно сделать из консоли, можно автоматизировать». Утверждение оказалось верным и на этот раз. PDF – это лишь файл, его не обязательно видеть, чтобы иметь возможность открыть, обработать и сохранить.

Вот что умеет делать программа pdftk:

. извлекать метаданные PDF-файла и записывать их в текстовый файл, либо обновлять существующие по имеющимся данным в текстовом файле;
. открывать защищенный PDF, если у вас есть пароль к нему;

. задавать разрешения и пароли для созданного вами или уже существующего файла;

. шифровать защищенный файл;

. заполнять электронные формы данными из другого файла-источника;

. разрезать файлы на отдельные страницы или куски по несколько страниц;

. вставлять страницы из одного файла в другой или собирать новый файл из нескольких исходных документов;

. извлекать вложения из PDF-файла и прикреплять к нему новые;

. вставлять на страницы фон (background) и «водяные знаки» (stamp).

Даже если не сравнивать размеры Акробата (несколько сот мегабайт) и этой программы (два мегабайта), то консольная утилита во многом выигрывает. Самые важные преимущества ее использования – это возможность автоматизации и скорость работы. Согласитесь, перетащить на ярлычок несколько выделенных файлов удобнее, чем открывать их, перетаскивать кучу страниц руками, опасаясь допустить ошибку, затем выставлять нужные параметры и пересохранять. При этом время обработки исходников сокращается по крайней мере в полтора раза, только обработка данных, без учета действий пользователей в GUI программы. В реальности время на обработку множества небольших файлов сокращается в 2-4 раза. Живой пример: подготовка к печати нескольких десятков журналов с индивидуальными страницами (что-то вроде персонального школьного альбома, которые сейчас делают для выпускников учебных заведений). Исходные данные представляли собой кучу папок с пронумерованными PDF-документами внутри. В каждую был заброшен ярлычок на программу с нужными параметрами и запущен. В ручном режиме сборка заняла бы около сорока минут. В данном случае пришлось подождать 10- 15 минут, пока закроется последнее окно командной строки — и можно забирать результат. Следует учесть, что процесс замедлялся множеством параллельно работающих задач, активно пользующихся жестким диском (то есть процесс можно еще оптимизировать).

Надеюсь, мне удалось убедить вас изучить возможности этого инструмента. Давайте рассмотрим несколько задач, в которых pdftk может быть вам полезен, и разберем синтаксис командной строки этой программы.

Пример 1. Объединение файлов

Для соединения нескольких файлов служит оператор «cat». Вместе с ним в строке работает оператор «output», который задает имя файла для вывода результата. Пример:

pdftk 1.pdf 2.pdf 3.pdf cat output result.pdf

Этой строкой в текущей директории будет создан новый файл «result.pdf», который составлен из страниц трех соединенных последовательно файлов «1.pdf», «2.pdf» и «3.pdf». Помимо простого объединения можно выбирать из файлов отдельные страницы и использовать подстановочные знаки. С подстановочными знаками все просто. Следующий пример соберет все PDF-файлы из папки «C:\TEMP\» и положит результат туда же:

pdftk C:\temp\*.pdf cat output C:\temp\result.pdf

Чуть сложнее с выборкой страниц. Для нее используются ярлычки-псевдонимы, к которым привязываются исходные файлы. Пример ниже означает: взять из файла «file1.pdf» нечетные страницы из промежутка 1-10стр., взять из файла «file2.pdf» страницы с 3 по 7 в обратном порядке (т.е. с 7 по 3), взять из файла «file3.pdf» только четные страницы из промежутка 3-10стр. и добавить в конце файл «file4.pdf», кроме страниц 3 и 4, результат записать в «myfile.pdf»:

pdftk A=file1.pdf B=file2.pdf C=file3.pdf D=file4.pdf cat A1-10odd B7-3 C3-10even D1-2 D5-end output myfile.pdf

Если ваш документ не лежит на жестком диске, а формируется сервером, вы можете использовать URL как аргумент командной строки. Например, нам нужно создать документ из сформированного на сервере отчета, только поменять обложку на свою:

pdftk A=http://example.com/pdfgenerator.php?id=1&user=me B=myFile.pdf cat B1 A2-end output MyNewFile.pdf

Вместо имен файлов можно указать слово PROMPT, тогда программа запросит у вас названия во время выполнения задачи.

Пример 2. Извлечение страниц

Самый простой вариант извлечения страниц – воспользоваться описанным выше оператором «cat», задав в качестве диапазона одну нужную страницу. Если вам нужны все листы документа, будет проще воспользоваться оператором «burst», разделяющим файл на отдельные странички и сохраняющим их под разными именами. Имя задается шаблоном, в котором должна присутствовать строка «%0Nd», где N – это количество цифр в номере файла. Поскольку шаблон используется при именовании готовых файлов, он должен записываться после оператора «output»:

pdftk "мой большой файл.pdf" burst output PAGE-%04d.pdf

При использовании оператора «burst» в текущей директории также будет сохранен текстовый файл «doc_data.txt» с данными об исходном файле.

Пример 3. Использование паролей и шифрование

В Интернете часто можно встретить PDF-документы, возможности которых полностью или частично урезаны. Иногда отключается возможность модификации, реже – возможность печати. В отдельных случаях документ может даже не открыться без пароля. Обычно так «запирают» информацию для ограниченного круга лиц, например, техническую документацию по ремонту оборудования для сервисных инженеров.

Если вы хотите защитить таким образом pdf-файл, нужно будет задать для него разрешения и один либо два пароля (пароли пользователя и владельца файла). Разрешения задаются только для пользователя, так как владелец, разумеется, может делать все что угодно. Пример команды – шифрование файла с разрешением пользователю только низкокачественной печати, длинный пароль для владельца и короткий – для пользователя.

pdftk source.pdf output result.pdf owner_pw my_very_long_password user_pw tinypass allow Degraded-Printing

Не факт, что паролями будете распоряжаться только вы. Вполне вероятно, что придется выступить в роли пользователя. Если пароль вам известен, pdftk сможет им воспользоваться. Пример команды – объединение двух файлов, один из которых зашифрован:

pdftk A=alpha.pdf bravo.pdf input_pw A=mypassword cat charlie.pdf

Пример 4. Присоединение и извлечение файлов

PDF – очень универсальный формат, пригодный не только для хранения текста и иллюстраций. В него можно вставлять звук, Flash, трехмерную графику, таблицы для расчетов, электронные формы и другие интерактивные элементы. В PDF можно сделать презентацию, специфичный клиент для связи с сервером, даже компьютерную игру (хотя тут придется воспользоваться еще несколькими программами). Впрочем, мы отвлеклись.

Помимо других неочевидных применений, PDF может быть контейнером для файлов. В Acrobat все решается просто – открыть панель вложений и мышкой перетащить нужный файл в окно документа. В командной строке pdftk для этого используются операторы attach_files и unpack_files. Пример: присоединение файлов к PDF-документу:

pdftk container.pdf attach_files data.zip readme.txt to_page 2

Если параметр «to_page» не указать, то файлы будут приложены к файлу, иначе они будут прикреплены к заданной вами странице документа-контейнера.
Извлечение прикрепленных файлов требует только указать имя документа PDF и папку, в которую будут происходить запись:

pdftk container.pdf output c:\temp\

Кстати, служебное слово PROMPT можно использовать не только при задании исходных файлов. Оно годится практически везде: например, если вы не укажете имя папки (или, для других операторов, имя файлов) в операторе «output», а поставите там PROMPT, программа запросит их у вас во время исполнения.

Пример 5. Добавление «Водяных знаков»

Для данной задачи служит оператор «background». Задавать нужно только один исходный файл, остальные все равно не будут обработаны. В качестве водяных знаков используется другой PDF-документ, который будет растянут или сжат для полного заполнения страницы вашего документа:

pdftk mydocument.pdf background bg.pdf output PROMT

Как видите, ничего сложного в использовании этой программы нет. Вам нет смысла использовать ее, если применение PDF сводится к чтению документов в Reader, но для ежедневного перелопачивания горы исходных материалов для печати или рассылки вам вряд ли удастся найти что-то более подходящее. Сейчас на вашем рабочем столе или под ним гудит мощь, многократно превышающая вычислительные силы НАСА во время первого полета на Луну. Облегчить работу человека дальше можно, но не нарастив очередные гигагерцы, а используя имеющиеся. Например, из старой доброй командной строки.

Александр Поляков


Компьютерная газета. Статья была опубликована в номере 30 за 2010 год в рубрике soft

©1997-2024 Компьютерная газета