Введение.
Всем доброго времени суток. Надеюсь, что эта статья будет для кого-то полезной. Она посвящена созданию PDF файлов, посредством PHP скриптов. Знаю, что реализовать нечто подобное существуют десятки способов, но мой, поверьте, особенный. У него есть по крайней мере 2 преимущества над другими:
а)Не требуется никаких расширений для интерпретатора и библиотек. Все, что нужно, это залить на сервер несколько PHP файлов и подключить их include`ом.
б)Мы будем генерировать PDF страницы, практически с лету. Т.е. не будет никаких сохранений дополнительных файлов на ЖД и.т.д. PDF файл будет формироваться скриптом так же, как и HTML страница.
Итак, начнем.
Предыстория.
На днях я столкнулся с задачей реализации интернет-магазина для туристического агенства. Суть была такова: клиент заходит на сайт, вводит параметры (дата заезда, кол-во человек итд), нажимает кнопку "Печать" и печатается подробное описание тура. Казалось, что может быть проще? Но подводные камни существуют)) Весь результирующий файл выглядел, как таблица в две колонки. Слева - фотографии. Справа - текст. Из-за этого при выводе на печать, если файл не помещался на странице (а он не помещался)), то он резался на части в буквальном смысле слова. Наблюдалось не только деление фотографий на части, но и деление текста. То есть верхняя половина буквы могла быть на одной странице, а нижняя на другой. Средства для работы с принтером CSS и JS предоставляют просто жалкие. Нужно было что-то более мощное. Так я и пришел к выводу, что нужен PDF.
mPDF.
mPDF - это ряд PHP файлов, содержащих реализацию нужных нам функций. Проще говоря, mPDF - это то, что нам надо залить на сервер и подключить include`ом. Взять архив можно здесь:
http://www.mpdf1.com/mpdf/ в разделе "Download". mPDF представляет собой ZIP архив, который надо распаковать и залить на сервер.
Первый PDF.
Ниже приведен код, генерирующий PDF документ с надписью "Hallo, world".
include("../MPDF54/mpdf.php");
$mpdf = new mPDF('blank', 'A4', '8', 'Arial', 15, 5, 7, 7, 10, 10);
$mpdf->charset_in = 'cp1251';
$mpdf->WriteHTML('Hallo, World!', 0);
$mpdf->Output('mpdf.pdf', 'I');
Первая строка - это подключение mPDF к скрипту. Ес-но вместо "../MPDF54/mpdf.php" должен быть путь к файлу mpdf.php.
Вторая строка создает PDF документ, сохраняя его дескриптор в переменной $mpdf. С файлами работали? Вот это примерно тоже, что и fopen(), только параметров побольше. А параметры тут такие:
1)Режим работы. Понятия не имею, что это такое, но во всех исходниках пишут blank))
2)Формат бумаги
3)Размер шрифта "По умолчанию". Задается в пунктах (pt).
4)Шрифт "По умолчанию".
5)Отступ слева (ММ).
5)Отступ справа (ММ).
5)Отступ сверху (ММ).
5)Отступ снизу (ММ).
5)Отступ от заголовка (ММ).
5)Отступ от подвала (ММ).
Третья строка - кодировка. Указываем родную koi-8 для кириллических символов.
Пятая строка заканчивает работу.
Теперь сохраните скрипт и запустите. Вместо HTML странички Вы увидите PDF документ с знаменитой фразой. Вместо Hallo, world! можно выводить абсолютно любые HTML теги и CSS атрибуты. Ну или почти все.
Подводные камни.
К сожалению, и они тоже есть. Я нашел лишь часть. Найдете еще - пишите в комментариях.
1)Не обрабатывается атрибут align у картинок.
2)Таблицы переносятся построчно (т.е.по tr).
3)Если что-то не помещается на странице, то оно сжимается, чтоб поместиться)))
4)Отбитые систем мер приводят к неожиданным результатам.
Заключение.