Php генерация pdf из html

Генерация PDF документ на PHP с помощью dompdf

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

require_once($_SERVER["DOCUMENT_ROOT"]."/dompdf/dompdf_config.inc.php");

Теперь готовим содержимое нашего будущего документа. Все делаем всем знакомой HTML разметкой, но эта HTML разметка должна быть в переменной.

Пишем содержимое HTML для генерации PDF документа

Обратите внимание, мы закладываем в документ CSS стили и даже разместим туда свою подпись.

//разбиваем изображение для подписи в base64 $path_podpis = $_SERVER["DOCUMENT_ROOT"].'/images/podpis/podpis.png'; $type = pathinfo($path_podpis, PATHINFO_EXTENSION); $data = file_get_contents($path_podpis); $podpis = 'data:image/' . $type . ';base64,' . base64_encode($data); //содержимое HTML в PDF $content ="   body < font-family: times; font-size: 11pt; >table @page .podpis_left < position: relative; display: inline-block; width: 392px; font-weight: 700; >.podpis_left img.podpis < position: absolute; right: 7%; bottom: 12px; width: 83px; >.document_number < text-align: center; font-size: 15pt; >table < border-spacing: 0; border-collapse: collapse; >table th < border: 1px solid #ddd; padding: 5px; font-size: 10pt; >table td "; $content .= '  
Продавец

Иванов Иван Иванович

ИНН: 593315450321
КПП: 590334434
р/c: 40817810749771710380
к/с: 30101810900000000603
БИК: 042202603
Банк: Волго-вятский БАНК ПАО Сбербанк
Покупатель

'; $content .= '

'.$company["company"].'

ИНН: инн_компании
КПП: кпп_компании
ОГРН: огрн_компании
р/c: рс
к/с: кс
БИК: бик
Банк: банк
'; $content .= '

Счет №31 от '.date("d.m.Y").'

'; $content .= '
Наименование Ед. изм. Кол-во Цена (руб.) Сумма (руб.)
1 Услуги по договору №02/10/2021 на создание сайта шт. 1 25 000,00 25 000,00
Итого: 25 000,00
Всего к оплате: 25 000,00
Сумма прописью: двадцать пять тысяч рублей 00 копеек

Иванов Иван Иванович ____________________
';

Генерация PDF документа и скачивание

$html = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'); $dompdf = new DOMPDF();// Создаем обьект $dompdf->load_html($html, 'UTF-8'); // Загружаем в него наш html код $dompdf->render(); // Создаем из HTML PDF // $dompdf->stream('mypdf.pdf'); // Выводим результат (скачивание) $output = $dompdf->output();

Или сохраняем наш PDF на сервере

//папка куда сохроняем $img_Dir_Str = "invoice/"; $img_Dir = $_SERVER['DOCUMENT_ROOT']."/". $img_Dir_Str; @mkdir($img_Dir, 0777); //сохранение pdf на сервере $file = "Сгенерированный PDF документ на PHP.pdf"; file_put_contents($img_Dir.$file, $output); 

Собственно все! Пользуйтесь!

Можно конечно еще улучшить скрипт

  1. Загнать сумму в переменную и выводить ее прописью (из 25000 в двадцать пять тысяч рублей 00 коп.)
  2. Сформировать в догонку акт выполненных работ
  3. А еще до кучи какой-нибудь договор

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

Пишите в комментариях, если нужно дописать функцию перевода числа в прописной вид.

Источник

Конвертируем HTML в PDF при помощи Dompdf

PDF — формат, ставший уже стандартом. Он был изначально создан Adobe для представления текста и изображений в документе с фиксированной структурой. Давно не редкость для веб-приложений, поддерживающих скачку данных, таких как счета или отчеты, отдавать их в PDF формате. Так что в этой статье мы пройдем простую генерацию PDF документов используя PHP.

Dompdf — это отличная библиотека, способная генерировать PDF из HTML-разметки и CSS-стилей (в большинстве случаев это стили, совместимые с CSS 2.1 с поддержкой некоторых свойств CSS3). Мы можем определить, как наше содержимое должно выглядеть, используя эти знакомые технологии, и после легко конвертировать его в фиксированный документ. Также эта библиотека имеет и другие полезные и интересные функции.

Приступаем к работе

Dompdf доступен на GitHub и может быть установлен используя Composer. Установка через Composer без каких-либо ошибок часто вызывает трудности, поэтому я рекомендую просто использовать Git для установки Dompdf.

Библиотека требует PHP >= 5.0 с активированными расширениями mbstring и DOM. Также она требует несколько шрифтов, которые обычно доступны на большинстве компьютеров.

Перейдите в директорию, куда собираетесь установить библиотеку и выполните в командной строке:

git clone https://github.com/dompdf/dompdf.git git submodule init git submodule update 

Как только мы скачали Dompdf, давайте напишем короткий пример, который сгенерирует простой PDF документ:

  

Hello Dompdf

ENDHTML; $dompdf->load_html($html); $dompdf->render(); $dompdf->stream("hello.pdf");

Для того, чтобы использовать библиотеку в проекте, мы сначала подтягиваем файл dompdf_config.inc.php, который содержит большую часть конфигурации Dompdf. Он также загружает autoloader и пользовательский файл конфигурации в котором мы можем переопределить параметры по умолчанию.

HTML-разметка передается как строка в метод load_html(). Альтернативно мы можем загрузить разметку из файла или URL, используя метод load_html_file(). Он принимает имя файла или URL веб-страницы в качестве аргумента.

Метод render() отображает HTML в PDF, и мы готовы к отдаче файла. Метод stream() отправляет результирующий PDF как вложение в браузер. Этот метод имеет необязательный второй параметр, массив опций:

  • Accept-Rangesboolean, отсылает заголовок “Accept-Ranges” (по умолчанию false).
  • Attachmentboolean, отсылает заголовок “Content-Disposition: attachment” заставляя браузер отображать запрос на сохранение (по умолчанию true).
  • compressboolean, включает сжатие содержимого (по умолчанию true).

Только что мы сгенерировали очень простой PDF, но это не совсем практично. В реальности мы часто имеем требования к размеру листа, ориентации страницы, кодировке символов и т.д. Есть целый набор опций, которые мы можем установить, чтобы сделать Dompdf более подходящим для наших реальных потребностей. Все они перечислены и объяснены в файле dompdf_config.inc.php, который устанавливает им значения по умолчанию. Вы можете менять эти значения, обновляя файл пользовательской конфигурации dompdf_config.custom.inc.php. Вот некоторые из важных настроек:

  • DOMPDF_DEFAULT_PAPER_SIZE – устанавливает размер листа по умолчанию для PDF-документа. Поддерживаемые размеры листов вы можете найти в файле include/cpdf_adapter.cls.php (значение по умолчанию — “letter”).
  • DOMPDF_TEMP_DIR – указывает временную папку, используемую Dompdf. Убедитесь, что эта директория доступна на запись согласно настройкам вашего веб-сервера.
  • DOMPDF_UNICODE_ENABLED – устанавливает, будет ли PDF использовать шрифты Unicode (по-умолчанию true).
  • DOMPDF_ENABLE_REMOTE – активирует включение изображений или CSS-стилей из удалённых сайтов (по-умолчанию false).
  • DEBUG_LAYOUT – устанавливает, будет ли отображена граница вокруг каждого HTML блока в PDF файле. Очень удобно для отладки макета (по умолчанию false).

Продвинутое использование

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

load_html($html); $dompdf->render(); $output = $dompdf->output(); file_put_contents("/path/to/file.pdf", $output); 

Вместо вызова stream(), как в прошлом примере, мы используем output(), который возвращает PDF как строку. Этот метод также принимает массив опций, но доступна лишь одна — compress (по умолчанию true).

Dompdf также позволяет нам добавлять хедер и футер к сгенерированному PDF, встраивая PHP-скрипт прямо в HTML, который он отображает. Но из-за того, что обработка произвольного кода может представлять из себя угрозу безопасности, значение конфигурации, которое отвечает за эту функциональность, по умолчанию выключено. Нам необходимо для начала установить опцию DOMPDF_ENABLE_PHP как true.

Как только мы включили выполнение встроенного PHP, объект PDF станет доступным внутри скрипта и мы сможем использовать его для манипуляций со страницей. Мы можем добавлять текст, линии, изображения, прямоугольники и т.д.

$html =    

Hello Dompdf

ENDHTML;

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

Затем мы получаем реальную ширину и высоту страницы, чтобы посчитать координаты футера, который мы собираемся добавить. Также нам требуется предоставить обьект шрифта, поскольку мы добавляем текстовое содержимое. Font_Metrics::get_font() позволяет создать объект, который нам необходим. Мы также берем высоту данного шрифта из его размера используя get_font_height(), чтобы посчитать позиционирование содержимого футера. Метод get_font_width() возвращает ширину нашего текста для данного шрифта и размера, которую мы также используем в наших вычислениях.

Метод line() рисует линию из точки (X1,Y1) в точку (X2,Y2). Обратите внимание, значение цвета подставляется не совсем в RGB. Основной PDF-класс требует значения между 0 и 1, так что мы конвертируем значения RGB в эти новые значения. Чтобы получить лучшее приближение (approximation), вы можете поделить их на 255.

Мы добавляем номер для каждой страницы, используя метод page_text(), которой принимает координаты X и Y, а также текст, который будет добавлен, объект шрифта, размер шрифта и цвет. Dompdf автоматически заменяет значения для и на каждой странице, и делает $pdf доступным для нас.

Также мы можем не использовать встроенный PHP и достигать аналогичного эффекта прямо из PHP, примерно так:

set_paper("A4"); // load the html content $dompdf->load_html($html); $dompdf->render(); $canvas = $dompdf->get_canvas(); $font = Font_Metrics::get_font("helvetica", "bold"); $canvas->page_text(16, 800, "Page: of ", $font, 8, array(0,0,0)); $dompdf->stream("sample.pdf",array("Attachment"=>0)); 

Обратите внимание, мы размещаем код после вызова $dompdf->render() потому что мы, по существу, редактируем уже созданный PDF.

Подведем итоги

В этой статье мы обсудили простой способ конвертировать HTML в PDF используя Dompdf. Несмотря на то, что Dompdf отличная библиотека, она не является полностью универсальным решением для генерации PDF документов; она все же имеет определенные ограничения и проблемы. Dompdf не очень терпимо относится к плохо оформленному HTML и большие таблицы могут легко привести к переполнению памяти. Некоторые базовые функции CSS, такие как float не полностью поддерживаются. И вообще, поддержка CSS3 очень ограничена. Если вам необходимы функции, которые не поддерживаются в Dompdf, вам может помочь к примеру wkhtmltopdf. Тем не менее, Dompdf является очень простым и удобным инструментом для решения большинства задач по экспорту PDF.

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

Источник

Читайте также:  Bitrix файл section php
Оцените статью