Генерация PDF средствами PHP. FPDF и кириллица.

Веб-программирование 18 ноября 2009 г., 8:03

Рано или поздно встает вопрос о генерации 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 кодировками.

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



Станьте первым!

Пожалуйста, авторизуйтесь или зарегистрируйтесь для комментирования!

Яндекс.Метрика