Статьи

Генерация счетов с Zend_Pdf

Формат PDF в настоящее время является наиболее используемым форматом для обмена документами. Если вы предоставляете пользователям своего веб-сайта печатные версии счетов-фактур, билетов на мероприятия и других подобных документов, вы, скорее всего, захотите создать их в формате PDF на лету. В этой статье вы увидите, как вы можете использовать Zend_Pdf для автоматической генерации счетов в формате PDF.

Начиная

Zend_Pdf позволяет создавать новые документы PDF или загружать существующие и изменять их. Хотя создание нового документа не так сложно, имеет смысл создать шаблон счета с информацией, которая не меняется (название компании, адрес, логотип и т. Д.). Лучше оформить свой счет в такой программе, как Microsoft Word или LibreOffice Writer, и экспортировать его в PDF. Затем вы можете обновить PDF с помощью Zend_Pdf, указав информацию о клиенте и транзакции. Вы сэкономите время написания кода, потому что вам не нужно позиционировать каждый элемент, и для генерации PDF потребуется меньше времени.

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

шаблон счета

Если вы используете Zend Framework впервые, загрузите последнюю версию с www.zendframework.com , загрузите и распакуйте сжатый файл на свой сервер и используйте следующие строки в верхней части своего скрипта для настройки автозагрузчика класса , Автозагрузчик позволит вам создавать новые объекты без необходимости явно включать все необходимые файлы в ваш код.

<?php define("ZF_PATH", realpath("/path/to/zf/library/")); set_include_path(get_include_path() . PATH_SEPARATOR . ZF_PATH); require_once "Zend/Loader/Autoloader.php"; $loader = Zend_Loader_Autoloader::getInstance(); 

Не забудьте изменить значение константы ZF_PATH на путь, по которому вы загрузили копию библиотеки Zend Framework.

Примечание редактора, 14 октября 2012 г .: сопровождающий код на GitHub был обновлен для использования Composer для установки Zend Framework. Поскольку ZF2 не имеет обратной совместимости с ZF1, версия была заблокирована в 1.11.11. Пожалуйста, обратитесь к коду для подходящего ZF_PATH.

Загрузка шаблона PDF

Zend_Pdf позволяет загружать существующий документ PDF с помощью метода static load() .

 <?php // load the invoice $invoice = Zend_Pdf::load("/path/to/invoice-template.pdf"); 

Метод load() читает файл по заданному пути и возвращает экземпляр объекта Zend_Pdf который управляет всем, что связано с PDF.

Zend_Pdf представляет каждую страницу PDF как экземпляр объекта Zend_Pdf_Page . Его открытые поля pages представляют собой массив объектов в том же порядке, в котором страницы находятся в документе. Вы можете извлечь выгоду из этого поведения, если у вас есть документ PDF с большим количеством страниц, и вы хотите изменить порядок его страниц; В любом порядке объекты Zend_Pdf_Page находятся в массиве pages , то есть порядок отображения страниц в конечном документе.

 <?php // access the first page $page = $invoice->pages[0]; 

Указание шрифтов и цветов

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

Есть два способа загрузить шрифт. Первый — использовать статический метод fontWithName() и предоставить одну из следующих констант, представляющих 14 стандартных шрифтов, которые поддерживаются всеми программами просмотра PDF:

  • Zend_Pdf_Font::FONT_COURIER ( _BOLD , _ITALIC , _BOLD_ITALIC )
  • Zend_Pdf_Font::FONT_HELVETICA ( _BOLD , _ITALIC , _BOLD_ITALIC )
  • Zend_Pdf_Font::FONT_TIMES ( _BOLD , _ITALIC , _BOLD_ITALIC )
  • Zend_Pdf_Font::FONT_SYMBOL
  • Zend_Pdf_Font::FONT_ZAPFDINGBATS

Второй способ — fontWithPath() путь к файлу шрифта, который находится в вашей файловой системе, к статическому методу fontWithPath() . Убедитесь, что шрифт является шрифтом TrueType, иначе fontWithPath() выдаст Zend_Pdf_Exception .

 <?php //loading a font by its name $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES_BOLD); //load font from file system $font = Zend_Pdf_Font::fontWithPath("/path/to/myfont.ttf"); 

Ресурс шрифта затем передается в setFont() экземпляра setFont() Zend_Pdf_Page в качестве первого параметра, а размер шрифта измеряется в точках в качестве второго параметра (1 точка = 1/72 дюйма). Представленный шрифт будет использоваться всякий раз, когда на эту страницу выводится текст.

 <?php $page->setFont($font, 12); 

Не обязательно устанавливать цвет для текста перед его рисованием; черный будет использоваться по умолчанию, если ничего не указано. Но если вы хотите использовать определенный цвет, вы можете указать его с одним из объектов Zend_Pdf_Color* . Zend_Pdf поддерживает три разных цветовых пространства; Вы можете использовать шкалу серого, RGB или CMYK. Также вы можете указать цвета, используя нотацию в стиле HTML.

 <?php // Gray Scale colors range from 0.0 (black) to 1.0 (white) $color = new Zend_Pdf_Color_GrayScale(0.7); // RGB uses 3 float values from 0.0 to 1.0 for each color component $color = new Zend_Pdf_Color_Rgb($r,$g,$b); // CMYK uses 4 float values from 0.0 to 1.0 for each color component $color = new Zend_Pdf_Color_Cmyk($c,$m,$y,$k); // HTML uses any valid color name or hex notation $color = new Zend_Pdf_Color_HTML("blue"); $color = new Zend_Pdf_Color_HTML("#FF52ED"); 

Затем цвет передается setFillColor() экземпляра Zend_Pdf_Page .

 <?php $page->setFillColor($color) 

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

Рисование текста на странице выполняется с использованием метода экземпляра drawText() Zend_Pdf_Page . Он принимает строку текста и координаты X и Y, где вы хотите разместить текст. Координаты измеряются в точках, а начало координат 0,0 размещается в левом нижнем углу страницы. Увеличение значения X перемещает положение вправо, а увеличение значения Y перемещает положение вверх.

PDF X, Y координаты

Обычно вы извлекаете и вычисляете информацию для выставления счета из базы данных, но для примера я пришел к следующему:

 <?php $customerName = "Angelina Jolie"; $invoiceId = "DF-00025786423"; // items in the array are product description, // quantity purchased, unit price, and total price $items = array(array("Golden Globe Polish", 1, 25.50, 25.50), array("Trophy Shelf", 2, 180.00, 360.00), array("DIY Tattoo Kit", 1, 149.99, 149.99)); $subtotal = 535.49; $discount = 10; $amountDue = 481.94; 

Самое сложное — найти правильное место для размещения текста на странице, и вам может потребоваться пробная версия и ошибка, даже если вы тщательно измеряли свои расстояния. Хорошей новостью является то, что, поскольку элементы шаблона являются статическими, если вы знаете, какие координаты использовать, они не изменятся.

 <?php // specify font $fontBold = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES_BOLD); $page->setFont($fontBold, 12); // specify color $color = new Zend_Pdf_Color_HTML("navy"); $page->setFillColor($color); $page->drawText($customerName, 110,641); // another font $fontNormal = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_TIMES); $page->setFont($fontNormal, 12); // invoice information $page->drawText($invoiceId, 420,642); $page->drawText(date("M d, Y"), 420,628); $page->drawText('$' . number_format($subtotal, 2), 510,143); $page->drawText($discount . "%", 510,123); $page->drawText('$' . number_format($amountDue, 2), 510,103); // purchase items $posY = 560; foreach ($itmes as $item) { $page->drawText($item[0], 50, $posY); $page->drawText($item[1], 350, $posY); $page->drawText(number_format($item[2], 2), 430, $posY); $page->drawText(number_format($item[3], 2), 510, $posY); $posY -= 22.7; } 

Рендеринг счета

После добавления информации в шаблон вы можете либо сохранить ее в другом файле (будьте осторожны, чтобы не перезаписать свой шаблон!), Либо отправить ее в браузер. Чтобы сохранить его, вы используете Zend_Pdf экземпляра Zend_Pdf save() .

 <?php $invoice->save($pathToFile); 

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

 <?php // instruct browser to download the PDF header("Content-Type: application/x-pdf"); header("Content-Disposition: attachment; filename=invoice-". date("YmdHi") . ".pdf"); header("Cache-Control: no-cache, must-revalidate"); // output the PDF echo $invoice->render(); 

Резюме

Теперь вы знаете основы использования Zend_PDF для создания PDF-документов, хотя все еще доступно гораздо больше возможностей, чем те, о которых я упоминал в этой статье. Исходный код этой статьи доступен на GitHub, если вы хотите клонировать его и поэкспериментировать. И, конечно же, не стесняйтесь оставлять комментарии о любых проблемах, с которыми вы сталкиваетесь.

Изображение через Кристина ДеРиддер / Shutterstock