html2pdf.js
Начнем с простенькой библиотеки для JavaScript - html2pdf.js. Принцип работы прост: размещаем контент на странице, например в div с id=element-to-print, а затем запускаем генерациюvar element = document.getElementById('element-to-print');
html2pdf(element);
Но как и в любой другой библиотеке по генерации pdf она не любую верстку может конвертировать. Очень легко сломать генерацию при помощи стилей. Стиль который в моем случае ломал все был "height:100%;". Cо стилями нужно аккуратно - любой, вроде бы самый обычный и стандартный, может все сломать (но при этом на flex не ругается, что удивительно). Есть еще один путь - создание скрина страницы и размещения его в pdf. PDF будет выглядеть как страница на сайте на 100%, независимо от верстки и языка на ней, но это картинка , а значит элементы на ней не кликабельны.
dompdf
Одна из самых популярных библиотек php - dompdf. Инструкция по установке https://github.com/dompdf/dompdf
Установка без композера
Если через composer по какой-то причине нельзя установить ее , то качаем релиз последний библиотеки данной https://github.com/dompdf/dompdf/releases , после надо подключить все связи , в библиотеке есть файл autoload.inc.php и там все связи прописаны , поэтому достаточно написать
require_once 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;
И все , теперь можно создавать экземпляр класса.Пример использования:
$dompdf = new Dompdf();
$dompdf->loadHtml('index.html');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
$dompdf->stream();
Это стандартный пример который содержимое index.html превратит в PDF .Важно: в любом файле который мы в PDF преобразуем нужно прописать стиль
body { font-family: DejaVu Sans}
Без этого шрифта все может плыть , а русские символы или любые другие кроме англ. не выведутся вообще.
Перед нами стояла задача: превратить страницу .php в pdf документ.
Пример выше работает для HTML , с php такой вариант не сработает, он не исполнит php скрипты, а просто возьмет содержимое файла .php . Чтобы php отработало как надо и вернуть HTML после его работы используется вот такая хитрость.
$dompdf = new Dompdf();
ob_start();
require("index.php");
$content = ob_get_clean();
$dompdf->loadHtml($content );
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
$dompdf->stream();
Вот теперь php отработает на index.php и вернет заполненный HTML.Но нужен был более сложный вариант: генерация HTML в index.php зависела еще и от GET параметров.
Решил данную проблему путем размещения скрипта генерации pdf внутри самого файла index.php
require_once 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;
$dompdf = new Dompdf();
ob_start();
// проводим все необходимые манипуляции с контентом и записываем html в переменную $content
$content = ob_get_clean();
$dompdf->loadHtml($content);
// Render the HTML as PDF
$dompdf->render();
$dompdf->stream();
Несколько полезных настроек
Изменение ориентации страницы на альбомную$dompdf->setPaper('A4', 'landscape');
Скачивание pdf файла без сохранения на сервере
$dompdf->stream();
Открытие pdf на странице без скачивания
$dompdf->loadHtml($content);
// Render the HTML as PDF
$dompdf->render();
$dompdf->stream($filename . ".pdf", array("Attachment" => 0));