Нашел замечательный инструмент для конвертирования HTML страниц в PDF И IMG. Использую эту утилиту в PHP. Раньше, чем только не пытался работать. Это и TcPDF (Долгий и тормознутый) и JASPER REPORTS (тяжело ставить и юзать).

Называется эта находка wkhtmltopdf.

Сразу опишу достоинства:

  • Open source (LGPL), т.е. бесплатный
  • Работает ОЧЕНЬ быстро
  • Рендер основан на движке WebKit, а значит выполняет JS и всё прочее, как браузер
  • Имеет кучу настроек, которые можно передавать параметрами при вызове программы
  • Есть версии для Windows, Linux, Mac OS, а так же исходники
  • Умеет тянуть страницы прям из Интернет по URL
  • Умеет делать из страницы изображение, а не только PDF

Скачать wkhtmltopdf можно тут

Как видите, конвертер сделал полноценную копию внешнего вида, с рекламой и социальными кнопками под статьеё. JS работает.

Вы можете выделить текст статьи в PDF версии, что говорит о том, что это реальный PDF документ, а не картинка вставленная в PDF.

Формат использования:

wkhtmltopdf что куда

Например в консоли Винды

C:\Users\Anton\Desktop>"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe" http://linux26.ru linux.pdf

Linux [user@anart ~]# wkhtmltopdf http://linux26.ru linux.pdf

Как я его юзаю в одном из своих Yii проектов

Алгоритм таков: создаю html страницу, сохраняю её в файл. с помощью exec() вызываю утилиту с параметрами, где указываю путь к этому html файлу и куда сохранить результат. После генерации PDF файл html страницы удаляется.

При создании HTML страницы, нужно учесть, что все пути к файлам стилей, изображениям и скриптам можно указать двумя способами. 1 - указывать через http://домен…style.css, 2 - указывать локальный путь к файлу file:///path…style.css. Второй способ предпочтительнее, т.к. файл читается напрямую из файловой системы.

<?php

// Рендерим HTML файл и кладем его в runtime

$page = "<html><head>..."; // Обычно это контент вьюхи после renderPartial()

file_put_contents($path.$htmlTemplate.'.html', $page);

// Так как разработка на винде с XAMPP, то указываем путь к wkhtmltopdf как показано ниже
exec('"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe" '.$path.$htmlTemplate.'.html '.$path.$htmlTemplate.'.pdf');

// Удаляем html страницу, она нам больше не нужна
@unlink($path.$htmlTemplate.'.html');

// Отдаем заголовки и сам PDF файл
$file = $path.$htmlTemplate.'.pdf';
header("Content-type: application/pdf");
header("Content-Disposition: filename=Putevoi_".$model->id);
readfile($file);
@unlink($file);
exit;

Разбивать HTML на страницы можно так

Бла бла бла
Страница 1
<div style="page-break-after: always;"></div>
Страница 2
Бла бла бла