Документы в формате PDF последнее время пользуются большой популярностью у пользователей и все чаще входят в повседневную жизнь. В связи с чем иногда возникает необходимость генерировать PDF файл непосредственно на стороне сервера. Это может понадобится например для выставления счета в интернет-магазине, создания отчета или выведения какой-либо информации для дальнейшей распечатки на принтере.
Чтобы не создавать вручную всю структуру PDF файла, было бы неплохо взять за основу html разметку и конвертировать ее в PDF документ. Для решения этой задачи на языке PHP нам понадобится библиотека под названием TCPDF.
Скачиваем архив, распаковываем и закачиваем все файлы на сервер. Также на сервере создадим файл demo.php в котором мы будем генерировать PDF файл. Чтобы начать работу с библиотекой необходимо подключить ее в наш php скрипт.
require_once 'tcpdf/tcpdf.php';
Создадим переменную $html, в которую поместим html разметку. В дальнейшем из этой переменной мы будем генерировать PDF.
$html = '<div style="text-align: right;">Приложение №2 к Агентскому договору<br>от 21.03.2018 г.</div>';
$html .= '<br>';
$html .= '<div style="text-align: center;"><b>ЗАЯВКА №34/235 ООО "РОМАШКА"<br>на авиаперевозку</b></div>';
$html .= '<br><br>';
$html .= '<table cellspacing="0" cellpadding="3" border="1" style="width: 100%; font-size: 9px;">';
$html .= ' <tr>';
$html .= ' <td style="text-align: center; width: 6%;"><b>№</b></td>';
$html .= ' <td style="text-align: left; width: 50%;"><b>Пассажир</b></td>';
$html .= ' <td style="text-align: center; width: 30%;"><b>Маршрут</b></td>';
$html .= ' <td style="text-align: center; width: 14%;"><b>Стоимость</b></td>';
$html .= ' </tr>';
$html .= ' <tr>';
$html .= ' <td style="text-align: center;">1</td>';
$html .= ' <td style="text-align: left;">Иванов Иван Иванович</td>';
$html .= ' <td style="text-align: center;">Москва - Сочи</td>';
$html .= ' <td style="text-align: center;">20000 руб.</td>';
$html .= ' </tr>';
$html .= ' <tr>';
$html .= ' <td style="text-align: center;">2</td>';
$html .= ' <td style="text-align: left;">Петров Петр Петрович</td>';
$html .= ' <td style="text-align: center;">Самара - СПБ</td>';
$html .= ' <td style="text-align: center;">17000 руб.</td>';
$html .= ' </tr>';
$html .= ' <tr>';
$html .= ' <td style="text-align: center;">3</td>';
$html .= ' <td style="text-align: left;">Александров Александр Александрович</td>';
$html .= ' <td style="text-align: center;">СПБ - Москва</td>';
$html .= ' <td style="text-align: center;">7000 руб.</td>';
$html .= ' </tr>';
$html .= ' <tr>';
$html .= ' <td style="text-align: center;">4</td>';
$html .= ' <td style="text-align: left;">Семенов Семен Семенович</td>';
$html .= ' <td style="text-align: center;">Москва - Волгоград</td>';
$html .= ' <td style="text-align: center;">10000 руб.</td>';
$html .= ' </tr>';
$html .= ' <tr>';
$html .= ' <td style="text-align: center;">4</td>';
$html .= ' <td style="text-align: left;">Борисов Борис Борисович</td>';
$html .= ' <td style="text-align: center;">Екатеринбург - Москва</td>';
$html .= ' <td style="text-align: center;">14000 руб.</td>';
$html .= ' </tr>';
$html .= '</table>';
$html .= '<br><br>';
$html .= '<div style="text-align: right;"><i>Итого: 68000 руб.</i></div>';
$html .= '<br><br>';
$html .= '<div style="text-align: justify; font-family: Times New Roman; font-size: 8px;">Оформление авиабилетов производится в строгом соблюдении правил, установленных авиакомпанией. Авиабилеты, правилами которых не предусмотрено долгосрочное бронирование (от 1 суток и более), оформляются только после полной оплаты либо наличными, либо кредитной картой. Корпоративные клиенты, имеющие договор с нашим агентством, обслуживаются в соответствии с условиями контракта. Иные условия оплаты и оформления авиабилетов оговариваются с Вами по телефону после получения уведомления о произведенном бронировании.</div>';
$html .= '<div style="text-align: justify; font-family: Times New Roman; font-size: 8px;">Возврат авиабилетов, независимо от того, каким образом билеты были забронированы, производится в соответствии с правилами авиакомпаний. Сборы агентства при добровольном возврате клиента не возвращаются. Сборы агентства при вынужденном возврате при письменном подтверждении причины вынужденного возврата возвращаются полностью. В случае возврата авиабилетов Вам необходимо как можно раньше уведомить об этом нашего оператора с тем, чтобы можно было аннулировать билет с наименьшими потерями.</div>';
$html .= '<br><br>';
$html .= '<img src="https://info-less.ru/article/4/resources/art.jpg"/>';
$html .= '<br><br><br>';
$html .= '<table cellspacing="0" cellpadding="3" border="0" style="font-size: 9px;">';
$html .= ' <tr>';
$html .= ' <td style="width: 54px;"><br><br>Подпись:</td>';
$html .= ' <td style="width: 90px;"><img src="https://info-less.ru/article/4/resources/ver.png" style="width: 80px;"/></td>';
$html .= ' <td style="width: 150px;"><br><br>Генеральный директор<br>Сидоров А.И.</td>';
$html .= ' </tr>';
$html .= '</table>';
Затем создадим новый объект TCPDF. При создании укажем следующие параметры:
P - Ориентация листов (книжная)
mm - Используемая единица измерения (миллиметры)
A4 - Формат страниц в документе (А4)
true - Использование unicode
UTF-8 - Кодировка текста
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8');
Уберем верхние и нижние колонтитулы чтобы они не мешали при построении документа:
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
Установим отступы от краев документа 20 мм.:
$pdf->SetMargins(20, 20, 20); // Слева, сверху, справа
Добавим первую страницу в наш PDF документ:
$pdf->AddPage();
Применим шрифт Arial 11 размера, который будет использоваться по умолчанию. Также шрифт и размер можно указать непосредственно в HTML разметке с помощью стиля font-family и font-size соответственно.
$pdf->setFont('Arial', '', 11); // Шрифт, стиль, размер
Применим метод который сконвертирует нашу html разметку из переменной $html в формат PDF:
$pdf->writeHTML($html, true, false, false, false, '');
Для просмотра результата работы библиотеки tcpdf выведем полученные документ прямо в браузер:
$pdf->Output('test.pdf');
В результате мы получим готовой PDF документ следующего содержания: