Формат 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 перемещает положение вверх.
Обычно вы извлекаете и вычисляете информацию для выставления счета из базы данных, но для примера я пришел к следующему:
<?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