Генерация PDF средствами PHP. FPDF и кириллица.
Рано или поздно встает вопрос о генерации PDF файлов. Он удобен, а страницы можно сделать довольно красивыми. Есть много разных библиотек для PHP, у меня в данном случае в ТЗ стояла задача сделать на FPDF. Данная библиотека, а точнее класс распространяется бесплатно и умеет работать с разными типами кодировок, в том числе и с CP1251. Наверно минусом этой библиотеки является отсутствие поддержки UTF, но есть отдельная пропатченная библиотека UFPDF, ее рассматривать я не буду.
Вы наверно спросите почему мучение с кириллицей? Скажем так, я потратил много времени на поиски, как заставить показывать русский текст, а не каракули. Делал я все по мануалам, официальных источников.
Итак, для того что бы был русский текст нам нужны шрифты, я делал для Arial, Times New Roman, Verdana. Создайте в своем проекте папку fonts. Скиньте туда нужные шрифты. Теперь нам нужно с конвертировать их для FPDF. На многих сайтах предлагают использовать специальную утилиту ttf2pt1.
ttf2pt1 -a arial.ttf arial
Сохранив, проверим в браузере. Он создает 2 файла, потом надо создать php фаил и сделать следующее, а точнее он создаст php фаил который содержит информацию о шрифте. Не забудьте поставить права на папку, где будете генерировать шрифты.
<? require('/usr/share/php/fpdf/font/makefont/makefont.php'); MakeFont('arial.ttf','.afm','cp1251'); ?>
Все это я делал ни один раз. И никак скрипт не хотел работать. После чего я нашел более простой способ конвертирования шрифтов.
Идем http://fpdf.fruit-lab.de/index.php?id=3 на этот сайт. Выбираем кодировку cp1251, далее прикрепляем нужный нам шрифт и жмем Convert. Там нас будет интересовать php, afm, z. Скачивайте эти файлы в созданную нами папку fonts. Далее нужно переименовать фаил .php.txt в .php.
После чего откроем этот php фаил (с сайта мы скачиваем его в .php.txt и потом переименовываем). В данном случае нас будет интересовать имя шрифта ($name='ArialMT';). Теперь у нас есть шрифт и имя шрифта. Можно приступить к созданию самого генератора PDF. Создаем нужный нам фаил, подключаем нужные библиотеки.
define('FPDF_FONTPATH', __system_directory__ .'API/font/'); // на всякий случай я прописал полный путь до библиотеки. require('/usr/share/php/fpdf/fpdf.php'); // объявляем класс и конструктор класса, в данном случае у меня альбомный лист $pdf=new FPDF('L'); //нужно подключить шрифт, указав имя шрифта и имя файла. $pdf->AddFont('ArialMT','','119379869a251bdd6a14438b3c5514f2_arial.php'); $pdf->AddPage(); // выбираем шрифт для текста. $pdf->SetFont('ArialMT','',35); $pdf->Cell(40,10,'русский текст!'); $pdf->Output();
Основное время я потратил из-за возникавшей ошибки: «FPDF error: Undefined font: arialmt B» Она наверно вызывалась неверной конвертацией шрифта, когда пользовался MakeFont или использованием неверного параметра, к примеру ошибка возникает, когда 2 параметр не совпадает с SetFont или наоборот.
// Ошибка в этом примере: $pdf->AddFont('ArialMT','','119379869a251bdd6a14438b3c5514f2_arial.php'); $pdf->SetFont('ArialMT','B',35); //И в такой тоже: $pdf->AddFont('ArialMT','B','119379869a251bdd6a14438b3c5514f2_arial.php'); $pdf->SetFont('ArialMT','',35); //работает $pdf->AddFont('ArialMT','B','119379869a251bdd6a14438b3c5514f2_arial.php'); $pdf->SetFont('ArialMT','B',35);
Как оказалось ошибки были на пустом месте, но я рад что разобрался с ними, и буду надеяться что эта маленькая статья поможет не терять время, на поиск проблемы связанной c кодировками.
Скачать: моя сборка готовых шрифтов.
Станьте первым!