Создавайте PDF документы в WordPress с помощью FPDF

В этом уроке я покажу вам, как создать PDF-документ, используя контент из постов в WordPress. Я буду использовать FPDF - бесплатную библиотеку PDF с открытым исходным кодом, написанную на PHP, и интегрирую ее в пользовательский плагин для управления кодом.

FPDF - это легкая библиотека PDF, написанная на PHP. Он весит менее 100 Кб, что является частью размера других библиотек, таких как MPDF (40Mb ~). Количество функций и возможностей действительно хорошее, и руководство очень понятно для подражания. Это также мощная библиотека, которую можно легко расширять, предлагая только те функции, которые вам нужны.

Комбинируя его с WordPress, можно реализовать целый ряд возможностей, например, создать документ в формате PDF из галереи изображений и создать пользовательские отчеты. Фактически, каждый бит данных внутри WordPress может быть отправлен в FPDF при необходимости.

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

Сначала загрузите FDPF из http://www.fpdf.org/ , Последняя версия на момент написания статьи - 1.81. Я разархивировал это в папку плагинов под названием atomicsmash-pdf-tutorial и создал два пустых php-файла внутри них, которые называются atomicsmash-pdf-helper-functions.php и atomicsmash-pdf-tutorial.php .

Моя структура папок теперь выглядит так:

Добавьте следующий код в atomicsmash-pdf-tutorial.php:

<? php / * * Имя плагина: Учебник по атомарному программированию на основе FPDF * Описание: Плагин, созданный для демонстрации того, как создать документ PDF из постов WordPress. * Версия: 1.0 * Автор: Энтони Хартнелл * URI автора: https://www.atomicsmash.co.uk/blog/author/anthony/ * / if (!fined ('ABSPATH'))) {выход; } include ('atomicsmash-pdf-helper-functions.php'); $ pdf = new PDF_HTML (); if (isset ($ _ POST ['generate_posts_pdf'])) {output_pdf (); } add_action ('admin_menu', 'as_fpdf_create_admin_menu'); function as_fpdf_create_admin_menu () {$ hook = add_submenu_page ('tools.php', 'Atomic Smash PDF Generator', 'Atomic Smash PDF Generator', 'manage_options', 'as-fdpf-tutorial', 'as_fpdf_create_admin_page) } function output_pdf () {$ posts = get_posts ('posts_per_page = 5'); if (! empty ($ posts)) {global $ pdf; $ title_line_height = 10; $ content_line_height = 8; $ Pdf-> AddPage (); $ pdf-> SetFont ('Arial', '', 42); $ pdf-> Write (20, «Учебник по атомному взрыву FPDF»); foreach ($ posts как $ post) {$ pdf-> AddPage (); $ pdf-> SetFont ('Arial', '', 22); $ pdf-> Write ($ title_line_height, $ post-> post_title); // Добавить разрыв строки $ pdf-> Ln (15); // Изображение $ page_width = $ pdf-> GetPageWidth () - 20; $ max_image_width = $ page_width; $ image = get_the_post_thumbnail_url ($ post-> ID); if (! empty ($ image)) {$ pdf-> Image ($ image, null, null, 100); } // Опубликовать содержимое $ pdf-> Ln (10); $ pdf-> SetFont ('Arial', '', 12); $ Pdf-> WriteHTML ($ post-> POST_CONTENT); }} $ pdf-> Output ('D', 'atomic_smash_fpdf_tutorial.pdf'); выход; } function as_fpdf_create_admin_page () {?> <div class = "wrap"> <h1> Атомный удар - Wordpress PDF Generator </ h1> <p> Нажмите ниже, чтобы сгенерировать pdf из содержимого всех сообщений Wordpress. </ p> <p> Каждое сообщение будет находиться на отдельной странице в формате pdf, содержащей заголовок и содержание сообщения. </ p> <form method = "post" id = "as-fdpf-form"> <button class = " button button-primary "type =" submit "name =" generate_posts_pdf "value =" generate "> Создать PDF из сообщений Wordpress </ button> </ form> </ div> <? php}

После сохранения перейдите на страницу плагинов и вы увидите ее в списке:

После активации вы увидите ссылку на страницу администрирования плагина в меню Сервис:

В строке 14 я включаю php-файл, который будет содержать некоторые вспомогательные функции FPDF. По умолчанию FPDF не интерпретирует HTML-теги или внешние ссылки, поэтому мы должны расширить библиотеку дополнительным кодом. Этот код содержит класс PDF_HTML, который расширяет стандартный класс FPDF - вы можете увидеть, что он создается в строке 15 и хранится в переменной $ pdf. Вспомогательные функции будут добавлены в конце.

В строке 17 я проверяю, есть ли у запроса $ _POST, содержащего ключ generate_posts_pdf , значение, которое установлено, а не пусто. Это отправляется с помощью кнопки «Отправить» в html-странице администратора в строке 82. Значение отправляется только в том случае, если кнопка нажата, по сути, это простой способ добавления взаимодействия к плагину для запуска функции.

Функция output_pdf использует get_posts и просматривает каждый из них, чтобы добавить содержимое в PDF с помощью некоторых просто названных функций, называемых AddPage и Write . Документация написана очень хорошо и в основном говорит сама за себя, но вывод post_content не будет работать без добавления вспомогательных функций.

Вы можете быть удивлены, почему библиотека FPDF не может интерпретировать теги HTML. Я считаю, что это то, что делает библиотеку такой маленькой с самого начала. Их учебные пособия демонстрируют, что вам предлагается расширять функциональность библиотеки и добавлять функции, где это необходимо. Это делает его более настраиваемым.

В строке 66 я использую функцию WriteHTML, и она включена в код, который должен находиться в файле atomicsmash-pdf-helper-functions.php . Код, который я модифицировал, можно найти здесь: http://www.fpdf.org/en/script/script42.php ,

Введите следующий код в atomicsmash-pdf-helper-functions.php :

<? php include ('fpdf181 / fpdf.php'); / ** * Изменено с http://www.fpdf.org/en/script/script42.php * / // function hex2dec // возвращает ассоциативный массив (ключи: R, G, B) из // шестнадцатеричного html функция кода (например, # 3FE5AA) hex2dec ($ color = "# 000000") {$ R = substr ($ color, 1, 2); $ rouge = hexdec ($ R); $ V = substr ($ color, 3, 2); $ vert = hexdec ($ V); $ B = substr ($ color, 5, 2); $ bleu = hexdec ($ B); $ tbl_color = array (); $ Tbl_color [ 'R'] = $ красный; $ Tbl_color [ 'G'] = $ зеленый; $ Tbl_color [ 'B'] = $ синим; вернуть $ tbl_color; } // преобразование пикселей -> миллиметр при 72 dpi, функция px2mm ($ px) {return $ px * 25.4 / 72; } function txtentities ($ html) {$ trans = get_html_translation_table (HTML_ENTITIES); $ trans = array_flip ($ trans); return strtr ($ html, $ trans); } //////////////////////////////////// класс PDF_HTML расширяет FPDF {// переменные защищенного парсера html $ B; защищенный $ I; защищенный $ U; защищенный $ HREF; защищенный $ fontList; защищенный $ issetfont; защищенный $ issetcolor; function __construct ($ direction = 'P', $ unit = 'mm', $ format = 'A4') {// Вызов родительского конструктора parent :: __ construct ($ direction, $ unit, $ format); // Инициализация $ this-> B = 0; $ This-> I = 0; $ This-> U = 0; $ This-> HREF = ''; $ this-> fontlist = array ('arial', 'times', 'courier', 'helvetica', 'symbol'); $ This-> issetfont = ложь; $ This-> issetcolor = ложь; } function WriteHTML ($ html) {// HTML-анализатор $ html = strip_tags ($ html, "<b> <u> <i> <a> <img> <p> <br> <strong> <em> <font > <TR> <BLOCKQUOTE> "); $ html = str_replace ("\ n", '', $ html); $ А = preg_split ( '/<(.*)>/ U', $ HTML, -1, PREG_SPLIT_DELIM_CAPTURE); foreach ($ a as $ i => $ e) {if ($ i% 2 == 0) {// Текст if ($ this-> HREF) $ this-> PutLink ($ this-> HREF, $ e) ; иначе $ this-> Write (5, полоски (txtentities ($ e))); } else {// Пометить if ($ e [0] == '/') $ this-> CloseTag (strtoupper (substr ($ e, 1))); else {// Извлечение атрибутов $ a2 = explode ('', $ e); $ Тег = strtoupper (array_shift ($ a2)); $ Атр = массив (); foreach ($ a2 as $ v) {if (preg_match ('/ ([^ =] *) = ["\']? ([^" \ '] *) /', $ v, $ a3)) $ attr [strtoupper ($ а3 [1])] = $ а3 [2]; } $ this-> OpenTag ($ tag, $ attr); }}}} function OpenTag ($ tag, $ attr) {// Открытие переключателя тега ($ tag) {case 'STRONG': $ this-> SetStyle ('B', true); перерыв; case 'EM': $ this-> SetStyle ('I', true); перерыв; case 'B': case 'I': case 'U': $ this-> SetStyle ($ tag, true); перерыв; case 'A': $ this-> HREF = $ attr ['HREF']; перерыв; case 'IMG': if (isset ($ attr ['SRC']) && (isset ($ attr ['WIDTH']) || isset ($ attr ['HEIGHT']))) {if (! isset ($ attr ['WIDTH'])) $ attr ['WIDTH'] = 0; if (! isset ($ attr ['HEIGHT'])) $ attr ['HEIGHT'] = 0; $ this-> Image ($ attr ['SRC'], $ this-> GetX (), $ this-> GetY (), px2mm ($ attr ['WIDTH']), px2mm ($ attr ['HEIGHT'] )); } перерыв; case 'TR': case 'BLOCKQUOTE': case 'BR': $ this-> Ln (5); перерыв; case 'P': $ this-> Ln (10); перерыв; case 'FONT': if (isset ($ attr ['COLOR']) && $ attr ['COLOR']! = '') {$ color = hex2dec ($ attr ['COLOR']); $ Этом-> SetTextColor ($ цвет [ 'R'], $ цвет [ 'G'], $ цвет [ 'B']); $ This-> issetcolor = истина; } if (isset ($ attr ['FACE']) && in_array (strtolower ($ attr ['FACE']), $ this-> fontlist)) {$ this-> SetFont (strtolower ($ attr ['FACE']) )); $ This-> issetfont = истина; } перерыв; }} function CloseTag ($ tag) {// Закрытие тега if ($ tag == 'STRONG') $ tag = 'B'; if ($ tag == 'EM') $ tag = 'I'; if ($ tag == 'B' || $ tag == 'I' || $ tag == 'U') $ this-> SetStyle ($ tag, false); if ($ tag == 'A') $ this-> HREF = ''; if ($ tag == 'FONT') {if ($ this-> issetcolor == true) {$ this-> SetTextColor (0); } if ($ this-> issetfont) {$ this-> SetFont ('arial'); $ This-> issetfont = ложь; }}} function SetStyle ($ tag, $ enable) {// Изменить стиль и выбрать соответствующий шрифт $ this -> $ tag + = ($ enable? 1: -1); $ Стиль = ''; foreach (массив ('B', 'I', 'U') как $ s) {if ($ this -> $ s> 0) $ style. = $ s; } $ this-> SetFont ('', $ style); } function PutLink ($ URL, $ txt) {// Поместить гиперссылку $ this-> SetTextColor (0,0,255); $ This-> SetStyle ( 'U', правда); $ This-> Write (5, $ .txt, $ URL); $ This-> SetStyle ( 'U', ложь); $ This-> SetTextColor (0); }} // конец класса

После нажатия Tools> Atomic Smash PDF Generator вы должны увидеть страницу администратора следующим образом:

Нажмите на кнопку, чтобы загрузить файл PDF, который должен выглядеть примерно так, как показано ниже:

Если вы попробуете это, пожалуйста, не стесняйтесь оставлять любые комментарии или предложения ниже.

Enable?