середу, 18 листопада 2009 р.

Генерация 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 файл который содержит информацию о шрифте. Не забудьте поставить права на папку, где будете генерировать шрифты.

Все это я делал ни один раз. И никак скрипт не хотел работать. После чего я нашел более простой способ конвертирования шрифтов.
Идем 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 кодировками.

Скачать: моя сборка готовых шрифтов.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments