Как генерировать PDF файлы из текста средствами PHP
Создание PDF из текста в PHP
Наиболее эффективным и гибким способом создания PDF из текста в PHP остается использование библиотеки mpdf. Она позволяет преобразовывать HTML-разметку в PDF с поддержкой UTF-8, CSS-стилей, изображений и сложной верстки. Установка выполняется через Composer:
composer require mpdf/mpdfText php pdf (создать pdf из текста в php)
Базовый пример создания PDF из простого текста:
<?php
require 'vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML('<h1>Привет, мир!</h1><p>Это PDF создан из текста.</p>');
$mpdf->Output('document.pdf', 'F');
?>
Файл document.pdf будет сохранен в текущей директории.
Библиотека автоматически подбирает базовые шрифты, но для корректного отображения кириллицы рекомендуется подключить шрифты через настройки. Типичные проблемы: нехватка памяти при больших документах (решение - увеличение лимита memory_limit) или ошибки с кодировкой (проверять исходный текст в UTF-8).
Возможные ошибки и их решения
- Ошибка "mPDF library is not compatible with PHP 8.x" - обновите mpdf до версии 8.1+.
- Пустые страницы или отсутствие текста - проверьте, что HTML содержит разметку внутри <body>.
- Медленная генерация - используйте режим fastCompression или кеширование.
Как создать PDF из текста с помощью библиотеки FPDF?
FPDF - классическая библиотека без зависимостей, проста в установке (скачать fpdf.php). Подходит для создания простых PDF из текста, но требует ручной работы с координатами.
<?php
require('fpdf.php');
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(40, 10, 'Привет, мир!');
$pdf->Output('F', 'sample.pdf');
?>
Создается файл sample.pdf с текстом.
Проблема: FPDF не поддерживает UTF-8 «из коробки». Для кириллицы необходимо добавлять шрифты через AddFont() или использовать Unifont. Кодировку строки нужно преобразовывать в Windows-1251.
Как использовать TCPDF для создания PDF из текста?
TCPDF - более мощная библиотека, поддерживает UTF-8, разметку через HTML, но требует больше ресурсов. Установка: composer require tecnickcom/tcpdf.
<?php
require 'vendor/autoload.php';
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->AddPage();
$pdf->SetFont('dejavusans', '', 14);
$pdf->Write(0, 'Привет, мир! Текст из TCPDF.');
$pdf->Output('example.pdf', 'F');
?>
Ошибка "Undefined constant PDF_PAGE_ORIENTATION" - необходимо предварительно подключить конфигурационные файлы tcpdf_config.php. Также возможна путаница с версиями PHP - используйте TCPDF 6.6+ для PHP 8.
Как преобразовать HTML в PDF с помощью Dompdf?
Dompdf отлично справляется с HTML/CSS, но плохо поддерживает сложные таблицы и большие объемы данных. Установка: composer require dompdf/dompdf.
<?php
require 'vendor/autoload.php';
use Dompdf\Dompdf;
$dompdf = new Dompdf();
$dompdf->loadHtml('<h1>Заголовок</h1><p>Текст внутри PDF.</p>');
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream('document.pdf', array('Attachment' => 0));
?>
Типичная проблема: не отображаются изображения с относительными путями - используйте абсолютные URL или опцию 'isRemoteEnabled'. Для кириллицы может потребоваться подключение шрифтов через CSS.
Как создать PDF через командную строку с помощью wkhtmltopdf?
Это внешний инструмент, вызываемый из PHP через exec(). Идеален для сложной верстки с JavaScript.
<?php
$html = '<h1>Заголовок</h1>';
file_put_contents('temp.html', $html);
exec('wkhtmltopdf temp.html result.pdf 2>&1', $output, $return_var);
?>
Проблемы: wkhtmltopdf не всегда установлен на сервере, требует прав на запуск shell-команд, возможны проблемы с путями. Рекомендуется использовать абсолютный путь к исполняемому файлу.
Расширенные примеры создания PDF из текста
1. Многостраничный документ с колонтитулами (mpdf)
<?php
require 'vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf([
'margin_top' => 20,
'margin_bottom' => 20,
]);
$html = '<h1>Глава 1</h1><p>Текст первой страницы...</p><pagebreak/><h1>Глава 2</h1><p>Текст второй страницы...</p>';
$mpdf->SetHeader('Мой заголовок||{PAGENO}');
$mpdf->SetFooter('|Номер страницы {PAGENO}|');
$mpdf->WriteHTML($html);
$mpdf->Output('multipage.pdf', 'F');
?>
Создается PDF из двух страниц с колонтитулами.
2. Таблица с данными и стилями (mpdf)
<?php
$mpdf = new \Mpdf\Mpdf();
$html = '
<style>
table { border-collapse: collapse; width: 100%; }
td, th { border: 1px solid black; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
<table>
<thead><tr><th>ID</th><th>Имя</th></tr></thead>
<tbody>
<tr><td>1</td><td>Анна</td></tr>
<tr><td>2</td><td>Борис</td></tr>
</tbody>
</table>';
$mpdf->WriteHTML($html);
$mpdf->Output('table.pdf', 'F');
?>
PDF-документ с красивой таблицей.
3. Вставка изображения и QR-кода (mpdf)
<?php
$mpdf = new \Mpdf\Mpdf();
$html = '<h2>Сертификат</h2><img src="http://example.com/logo.png" width="100" /><br/>';
$html .= '<barcode code="https://example.com" type="QR" size="30" error="M" />';
$mpdf->WriteHTML($html);
$mpdf->Output('cert.pdf', 'F');
?>
PDF содержит логотип и QR-код.
4. Использование пользовательского шрифта для кириллицы (TCPDF)
<?php
require 'vendor/autoload.php';
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->AddPage();
// Добавить шрифт DejaVu Sans (встроен в TCPDF)
$pdf->SetFont('dejavusans', '', 12);
$pdf->Write(0, 'Русский текст: Привет, мир!');
$pdf->Output('cyrillic.pdf', 'I');
?>
Текст отображается корректно благодаря шрифту DejaVu Sans.
5. Создание PDF из длинного текста с автопереносом (FPDF)
<?php
require('fpdf.php');
$pdf = new FPDF();
$pdf->AddPage();
$pdf->AddFont('DejaVu', '', 'DejaVuSans.php'); // предварительно загрузить
$pdf->SetFont('DejaVu', '', 12);
$longText = 'Очень длинный текст, который должен быть разбит на строки автоматически...';
$pdf->MultiCell(0, 10, $longText);
$pdf->Output('longtext.pdf', 'F');
?>
Текст переносится по ширине страницы.
6. Генерация PDF с динамическим содержимым из базы данных (mpdf)
<?php
require 'vendor/autoload.php';
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $db->query('SELECT name, email FROM users');
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$mpdf = new \Mpdf\Mpdf();
$html = '<h1>Список пользователей</h1><ul>';
foreach ($rows as $row) {
$html .= '<li>' . $row['name'] . ' - ' . $row['email'] . '</li>';
}
$html .= '</ul>';
$mpdf->WriteHTML($html);
$mpdf->Output('users.pdf', 'F');
?>
PDF со списком пользователей из БД.