Руководство по использованию PDF::API2 для начинающих

Данное руководство создавалось для PDF::API2 версии 20020226.221611 . Соответственно, описываемые
методы в других версиях модуля могут работать не корректно или не работать совсем. Данное руководство не претендует на полноту и точность изложения описания работы с модулем PDF::API2 для Perl. Скорее, оно является неким обзорным материалом, который предназначен помочь программистам Perl в практической работе, при создании PDF-документов.

  1. Введение
  2. Используемая терминология
  3. Руководство
    1. Преимущества формата PDF
    2. Основные принципы работы с PDF-документами через PDF::API2
    3. Создание PDF-документа
    4. Открытие существующего документа PDF для редактирования, импортирование данных
    5. Работа с текстовыми данными
      1. Управление шрифтами при создании PDF-документа
      2. Работа с цветом
      3. Добавление текста
    6. Графические данные в PDF - документе
      1. Вставка графических изображений в PDF - документ
      2. Импортирование PDF - документов
      3. Создание графических изображений средствами PDF::API2
    7. Вывод PDF-документа пользователю, сохранение документа
  4. Приложение к руководству
    1. Примеры кода
    2. Полезные ссылки

Введение

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

Используемая терминология

API (Application Programming Interface) - "Интерфейс прикладного программирования" -
набор ("библиотека") стандартных процедур, программных прерываний, вызовов, форматов данных и
других средств, которые должны использовать прикладные программы для реализации своих функций.

PDF (Portable Document Format) - метафайловый формат, предложенный фирмой Adobe для
графических файлов (векторных и растровых), содержащих иллюстрации и текст с большим набором шрифтов и гипертекстовыми ссылками с целью передачи их по сети в сжатом виде. Версия PDF3 позволяет сохранять все установки для выводного устройства, записанные в файле формата PostScript. Восстановление формата PDF из формата PostScript производится с использованием опции Exchange. Этим обеспечивается оперативная возможность передачи графических файлов по электронной почте. PDF позволяет не заботиться о наличии необходимых шрифтов у адресата, поскольку они подгружаются непосредственно в файл.

Особенностью формата является также возможность использования различных способов сжатия для разных типов объектов. Для работы с форматом PDF фирма Adobe выпустила пакет программ Acrobat. Входящий в этот пакет Acrobat Distiller переводит в PDF PostScript-файлы, Acrobat Exchange позволяет их редактировать (устанавливать внутренние ссылки, ссылки на внешние звуковые и видеофайлы, Web-ссылки и т.д.). Существует и ряд других графических редакторов, позволяющих создавать файлы в формате PDF.

Бесплатно распространяемую утилиту Adobe Acrobat Reader, которая позволяет читать документы и
распечатывать их на принтере (однако не дает возможности создавать или изменять их) можно получить по адресу: www. adobe.com/acrobat.

Файлы PDF используют расширение *.pdf.

Версия формата PDF/A прошла сертификацию стандартом архивирования ISO [584-586, 959, 1640].

Источник: (словари Яндекса)

Руководство

1. Преимущества формата PDF

Основные преимущества:

  • Кроссплатформенность. Просмотр PDF-файлов возможен практически на всех самых
    распространенных платформах, с помощью бесплатной программы Acrobat Reader.

  • Независимость от наличия (отсутствия) шрифтов на компьютере пользователя. Шрифты, как и
    другие данные, при создании встраиваются в PDF-документ.

  • Независимость от настроек принтера.
  • Полное соответствие внешнего вида PDF-документа на экране компьютера и распечатанного на
    принтере. Данное преимущество имеет особенно большое значение при печати финансовых и юридических
    документов.

  • Небольшой размер PDF-файлов.
  • Криптозащита, шифрование файлов, управление доступом. PDF-формат позволяет устанавливать
    ограничения на просмотр, редактирование и печать документа. Возможна защита этих действий паролем.

Еще одно преимущество, актуальное при использовании PDF-документов в интернете:

  • Простота генерации многостраничных документов (данная возможность с трудом реализуется для
    обычных html-документов, и поддерживается ограниченным числом браузеров)

2 Основные принципы работы с PDF-документами через PDF::API2

Модуль PDF::API2 не дает возможностей для редактирования существующих pdf-документов, с поиском в них текста, рисунков и их последующей заменой. В основном, он предназначен для создания новых
документов.

Основные типы объектов, которые могут использоваться на странице PDF-документа: контуры (path
object), текст (text object) и растр (image object). Для описания объектов используется язык, по функциям аналогичный PostScript.

Система координат является двумерной, и имеет начало в левом нижнем углу листа. Ось X направлена
вправо, ось Y - вверх. Единицей измерения является 1/72 дюйма. Геометрическая плоскость, на которой
расположена система координат - бесконечна.

Ограничение документа происходит с помощью указания физических границ страницы (MediaBox). Также можно задать страницам документа границы видимой области (CropBox).

3 Создание документа PDF

Подключаем модуль PDF::API2

Создаем новый объект PDF::API2 - документ в формате PDF. Каждый созданный объект позволяет
работать только с одним документом

При вызове $pdf->page($page) происходит создание новой страницы PDF-документа. По умолчанию, новая страница добавляется в конец документа. Для добавления страницы в середину документа или в начало, нужно указать номер создаваемой страницы.

Если указать в качестве номера "-1" - страница будет вставлена перед последней страницей. Если $page = 1; вставка будет производиться в начало документа, перед первой страницей.

MediaBox определяет границы физической страницы. CropBox - границы видимой
области. Если параметры CropBox не указаны, он принимается равным MediaBox. CropBox лучше задавать с помощью 4х параметров: $page->cropbox($llx, $lly, $urx, $ury);. С помощью CropBox удобно задавать поля страницы.

4 Открытие существующего документа PDF для редактирования, импортирование данных

Иногда возникает необходимость предоставить клиенту заполненную квитанцию, бланк и т.д. В подобных ситуациях будет проще не создавать квитанцию с нуля, а просто открыть готовый документ и добавить в него нужную информацию.

$pdf = PDF::API2->open($FILE_NAME); - открывает существующий PDF-документ для редактирования. Стоит отметить, что PDF::API2 не предоставляет возможность отредактировать содержащиеся в документе данные. Можно только дополнить файл новой информацией. $page = $pdf->openpage($page_number); - создает объект для редактирования страницы с номером $page_number открытого ранее документа.

Можно также создать новый документ и импортировать в него страницу(ы) из созданного ранее
документа.

$pageobj = $pdf->importpage($sourcepdf, $sourceindex, $targetindex) - импортирует страницу с номером $sourceindex из документа $sourcepdf, на место страницы с номером $targetindex в текущий документ.

Если $sourceindex или $targetindex принимают значение "-1" или "0" - будут производиться операции
с последней страницей документа.

Еще один вариант импортирования страниц из строннего PDF-документа описан в п.6.2. данного руководства.

5 Работа с текстовыми данными

5.1 Управление шрифтами при создании PDF-документа

Как уже было сказано, все объявленные (даже если шрифт не использовался) при создании PDF-документа шрифты, во время сохранения будут подгружены непосредственно в файл.

PDF::API2 позволяет работать со шрифтами типа:

  • corefont - набор основных шрифтов, которые Adobe позволяет разработчикам использовать бесплатно. В эту группу также входят некоторые шрифты от компании Microsoft. Шрифты предоставляются модулем PDF::API2, и не требуют дополнительной установки.
  • psfont - шрифты Post Script.

    Дополнительная информация (Источник: www.paratype.ru):
    Язык программирования PostScript был разработан фирмой Adobe Systems для описания сложных графические объектов. За неимением реальных альтернатив в 80-90-х годах язык PostScript широко использовался при подготовке печатных изданий, и его интерпретаторы были встроены во многие принтеры и устройства отображения графической информации. Хотя этот формат и основывается на использовании языка PostScript для описания печатной страницы документа, он не требует для печати обязательного применения принтеров семейства PostScript. При использовании принтеров PostScript шрифт просто загружается в память принтера, а применение обычных принтеров требует выполнения операции растрирования шрифта (то есть преобразования в набор отдельных точек) и последующей посылки на принтер растрового образа страницы.

    Наиболее известная и распространенная сегодня реализация языка PostScript - формат документов PDF, поддерживаемый продуктами серии Acrobat. Почти что все, что может быть сделано в PostScript может быть реализовано в PDF.

    Когда мы говорим шрифты PostScript, мы обычно имеем ввиду шрифты PostScript Type 1. Это общепринятый стандарт для цифровых шрифтов (ISO 9541). Шрифт формата Type 1 - специальная форма программы PostScript и особый формат файла, который ориентирован на описание шрифта. В языке PostScript существуют и другие стандарты описания шрифтов - Type 0, Type 2, Type 3, ..., однако сейчас они почти не используются или используются для специальных целей. В последние годы язык PostScript был расширен, чтобы обеспечить поддержку шрифтовых возможностей стандартов TrueType и OpenType. Новые устройства с языком Adobe PostScript сейчас поддерживают все 3 шрифтовых стандарта.

    Шрифт PostScript состоит из нескольких файлов: Шрифт PostScript для Windows может состоять из 2-х, 3-х или 4-х файлов. Набор из 3 файлов состоит из файла с расширением PFB (Print Font Binary), который содержит информацию о контурах; файла с расширением AFM (Adobe Font Metrics), содержащего информацию о ширинах символов и кернинге; INF файла, содержащего дополнительную информацию,
    которая требуется для инсталляции. В процессе инсталляции Windows генерирует PFM файл (Print Font Metrics), в основе которого лежит информация из AFM и INF файлов. Далее используется только PFB и PFM файлы. Некоторые производители генерируют PFM файлы самостоятельно и поставляют своим клиентам
    только два этих файла. Этого достаточно для нормального использования. Некоторые так же добавляют AFM файлы, а некоторые поставляют все 4 файла.

    Шрифт PostScript для Macintosh состоит из файла-чемодана (suitcase) и принтерного файла. Если вы купили гарнитуру, а не одно начертание, то у вас может быть один чемодан на всю семью и несколько принтерных файлов, по одному для каждого начертания - Нормального (Regular), Курсивного (Italic), Жирного (Bold) и Жирного Курсивного (Bold Italic). Другой подход предполагает комплектацию каждого начертания отдельным файлом-чемоданом. В этом случае семья из 4 шрифтов будет состоять из 8 файлов. Гарнитуры могут поставляться с "совмещенными начертаниями" или с "разделенными начертаниями". Одна гарнитура может содержать до 4 начертаний, но иногда она содержит только Нормальное и Жирное, или Нормальное и Курсивное начертание.

  • ttfont - шрифты TrueType.

    Дополнительная информация (Источник: www.paratype.ru):
    Шрифты TrueType были придуманы специалистами компании Apple Computer в ходе конкурентной борьбы
    с технологией PostScript. Позднее лицензия на шрифты TrueType была приобретена фирмой Microsoft с целью включения их в свои операционные системы. В отличие от шрифтов PostScript, шрифты TrueType не используют специального языка для описания формата печатной страницы. Шрифты TrueType могут содержать до 65000 символов, расположенных в порядке, определенном стандартом Unicode. В действительности, не все шрифты содержат расширенные наборы символов, большинство европейских изготовителей ограничиваются стандартной комплектацией западноевропейской
    кодировки (т.н. Latin 1).

    Шрифт в формате TrueType - это один файл. В системе Windows он имеет расширение TTF, а в Mac OS это файл-чемодан (suitcase) с ресурсом SFNT. В Mac OS X встроен шрифтовой процессор нового поколения, который кроме шрифтов с ресурсом SFNT, поддерживает и файлы TTF, созданные для Windows. Так что файл с расширением TTF можно использовать на обеих операционных платформах.

Особенности $pdf->ttfont

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

При стандартном использовании переменная $lazy, как правило, опускается. Однако, если
установить ей значение, равное "1" - указанный в $pdf->ttfont($ttfile, $lazy) шрифт не будет встроен в pdf-документ.

Преимущества данного подхода:

  • т.к. шрифт не встраивается, соответственно размер файла конечного PDF-документа уменьшается
  • программисту нет необходимости беспокоиться о поиске (покупке) необходимых шрифтов, запоминании их месторасположения, названий и т.п. Достаточно использовать стандартные обозначения шрифтов:
    • arial arialbold arialitalic arialbolditalic arialblack
    • comicsansms comicsansmsbold
    • couriernew couriernewbold couriernewitalic couriernewbolditalic
    • tahoma tahomabold
    • timesnewroman timesnewromanbold timesnewromanitalic timesnewromanbolditalic
    • verdana verdanabold verdanaitalic verdanabolditalic
    • wingdings
  • Дополнительное удобство для пользователей Acrobat Reader версии 5 и старше: возможен поиск и замена шрифтов.

Недостатки:

  • Созданный подобным образом документ, смогут прочитать только пользователи Windows OC.
  • Возможно, что ОС клиента не поддерживает русский (или любой другой, отличный от английского) язык и отображение русскоязычных документов будет происходит в искаженном виде.

5.2 Работа с цветом

(Вспомогательный источник: http://search.cpan.org/~areibens/PDF-API2-0.69/lib/PDF/API2/Lite.pm PDF/API2/Lite.pm)

Задаем цвет текста. По умолчанию используется черный.

PDF::API2 позволяет использовать для определения цвета шрифта различные форматы.

Самый простой вариант - указать наименование цвета.

Возможно использование следующих наименований:

Определение цвета в формате RGB:

Определение цвета в формате CMYK (cyan, magenta, yellow, black):

Задание цвета для начертания линий или заливки цветом графического объекта происходит аналогичным образом.

5.3 Добавление текста

PDF-файлы выстраивают "снизу вверх". Элементы (текст, картинки, линии и т.д.), добавленные позднее, будут перекрывать собой элементы опубликованные ранее. Так, если мы сначала добавим в документ текстовую строку, а потом нарисуем в той же области большой прямоугольник - строка окажется под прямоугольником и не будет видна, либо видна только частично.

Выбираем шрифт для вывода текста, и определяем его размер:

Можно задать межсимвольный интервал и интервал между словами:

Указываем координаты для размещения текста, отступ от левого и нижнего краев страницы в выбранной
единице измерения (в данном случае - px).

Выводим текст.

Для вывода и одновременного выравнивания текста по правому краю страницы, можно использовать

$txt->text_right($row);

Выравнивание по центру: $txt->text_center($row);

Удобна для использования функция textln. Она позволяет выводить на печать массив строк. Отступы между строками реализуются использованием: $txt->lead(14); - каждая новая строка начинается на 14 px ниже предыдущей. Использование отрицательного значения для lead (например, $txt->lead(-14);) приводит к выводу строк таким образом, что каждая следующая строка располагается выше предыдущей на 14px.

Однако, несмотря на удобство, метод textln (как и text), имеет недостаток: отсутствие
автоматического переноса строк, по достижении ими границ документа. Слишком длинная строка может выйти за границы документа. Чтобы этого избежать, рекомендуется использование функции paragraph. Рaragraph - выводит текст в виде абзаца, при необходимости выполняя автоматический перенос строк, и возвращает $t - отступ от левой границы обозначенного текстового блока в px, позиция вывода последнего символа абзаца; $y2 - позиция курсора относительно вертикальной оси координат на момент окончания вывода текста в px. Текстовые данные функции следует передавать в виде массива слов.

6 Графические данные в PDF - документе

6.1 Вставка графических изображений в PDF - документ

Определяем изображение, указываем URL к нему и размеры. Метод image может работать с файлами
формата: .jpeg, .png, .pnm.

Выбираем изображение, подлежащее выводу, и указываем координаты размещения.

Следует отметить, что по умолчанию, для вывода изображений на странице используется разрешение
72 dpi. Чтобы вывести изображение с разрешением 150 или 300 dpi, можно указать масштаб 72/150 (или 72/300) или назначить требуемую высоту и ширину изображения:

Примечание: DPI - (англ. dots per inch) - количество пикселей на дюйм. Указание DPI позволяет "привязать" изображение, размеры которого задаются в относительных единицах (пикселях) к физическим - дюймам. DPI используется при работе с разрешением принтера или сканера. Для указания разрешения монитора традиционно используют пиксели.

Источник: http://ru.wikipedia.org/wiki/DPI

Прорисовываем изображение в документе, с учетом всех выше указанных инструкции.

6.2 Импортирование PDF - документов

Импортирует указанную страницу из стороннего pdf-документа, и позволяет ее использовать аналогично импортируемым в создаваемый документ картинкам.

6.3 Создание графических изображений средствами PDF::API2

Рисуем прямоугольник

Создаем новый графический объект:

Определяем цвет заливки прямоугольника. Как и при использовании шрифтов, данные о цветовой настройке встраиваются непосредственно в документ. Цвет будет встроен в документ, даже если он определен, но не используется в дальнейшем.

Строим прямоугольник. Для этого указываем координаты X (отсчет слева) и Y (отсчет снизу) расположения прямоугольника, а также его ширину и высоту соответственно.

Разворачиваем прямоугольник на 45 градусов.

Ранее мы только "настраивали" параметры будущего прямоугольника. Теперь добавляем его в наш PDF-документ. Метод stroke прорисовывает контуры геометрической фигуры. Метод fill выполняет заливку объекта выбранным цветом.

Рисование линии

Создаем новый графический объект:

Определяем цвет и толщину будущей линии соответственно.

Устанавливаем "курсор" в требуемое место страницы.

Из определенной с помощью move позиции, проводим линию до точки, задаваемой командой line.

Эту команду можно выполнять несколько раз подряд, тогда начало каждой новой линии будет исходить
из точки, где заканчивается линия предыдущая.

hline(X) - проводит горизонтальную линию из установленной командой move (или ранее выполненными командами hline, vline, line) точки. Х - координата точки на оси координат X. Аналогично функционирует команда vline(Y) - проводит вертикальную линию до точки Y на вертикальной оси системы координат.

Итак, линия определена, но еще не прорисована. Выводим линию, используя заданный цвет:

Другие геометрические объекты

По аналогии с прямоугольником можно нарисовать следующие геометрические фигуры:

7 Вывод PDF-документа пользователю, сохранение документа

Сохранение документа под указанным именем.

Возвращаем документ как строку символов. Stringify удобно использовать при динамической генерации
pdf-документов по запросу пользователя и их незамедлительной передаче клиенту.

Приложение к руководству

1. Примеры кода

Создание документа и вывод текста с помощью paragraph и text

Открытие существующего документа PDF для редактирования

Импортирование страниц из ранее созданного PDF-документа

Публикация изображения

Использование textln для вывода текста

Рисуем линию

2. Полезные ссылки

EN

Документация PDF::API2 на search.cpan.org
Официальные спецификации формата PDF
PDF::API2. Tutorial. Rick Measham

RU

Создание сайтов с возможностью печати PDF на примере PDF::API2 (www.opennet.ru)
Валентин Синицын. Статья. Работаем с PDF из Perl. Системный администратор, N3. Март, 2006.