В Joomla 1.5, для сохранения статей в PDF формате, используется класс TCPDF 2.6.000 (2008-03-07), который выдаёт некорректный документ, а текущая версия класса TCPDF 5.9.172 (2012-07-02). Решение проблемы: нужно в Joomla обновить TCPDF до версии 5.9.172 (2012-07-02) но, тут не всё так просто...
Виновником этого материала на тему сохранения некорректных/кривых PDF документов в Joomla стал один из комментаторов статьи Установка PEAR на PHP 5.4 под Windows
подписавшийся как 3371, который 12.07.2012 ткнул нас носом в эту багу, за что ему большой респект, в комментарии заявив буквально следующее:
Так же хотел сохранить эту статью в PDF документ, но там генерится не очень приятный текст. Жаль.
При попытке сохранить статью в PDF документ, старый TCPDF 2.6.000 (2008-03-07) в Joomla криво обрабатывал многие XHTML теги и текст присутствующий между ними зачастую вовсе отсутствовал в полученном на выходе PDF документе, к тому же документ был некорректный (кривой) и жутко перекошен. Фактически проблема была решена обновлением класса до версии 5.9.172 (2012-07-02).
TCPDF в Joomla используется для 4-ой версии PHP и расположен в каталоге /joomla/libraries/tcpdf/. Не станем развозить что в этом каталоге лежит и зачем оно там всё нужно, а сразу перейдём к телу делу.
Скачиваем с сайта афтора самую свежую версию, tcpdf_5_9_172_php4.zip на данный момент, распаковываем с перезаписью в каталог /joomla/libraries/tcpdf/ такие файлы и каталоги:
/... /... /config /lang eng.php rus.php tcpdf_config.php /fonts *arial.ctg.z *arial.php *arial.ttf *arial.z courier.php freesans.ctg.z freesans.php freesans.z helvetica.php index.html html_entity_decode_php4.php tcpdf.php encodings_maps.php htmlcolors.php unicode_data.php CHANGELOG.TXT README.TXT LICENSE.TXT
Файлы помеченные символом "*" отсутствуют по умолчанию и требуются для корректного отображения русского языка (кириллицы), их нужно будет создавать отдельно иначе будем наблюдать сплошные знаки вопроса и в итоге получим некорректный документ но, об этом позже.
ВНИМАНИЕ! Файл arial.ttf нужно будет взять из C:\WINDOWS\Fonts
Если не определена константа K_TCPDF_EXTERNAL_CONFIG, то будут использованы настройки из файла конфигурации /joomla/libraries/tcpdf/config/tcpdf_config.php, а константа K_TCPDF_EXTERNAL_CONFIG определена в файле /joomla/libraries/joomla/document/pdf/pdf.php и настройки TCPDF прописаны в нём же, находим его и открываем. В этом файле меняем/добавляем строки в функции __construct:
define("K_PATH_FONTS", JPATH_SITE.DS.'language'.DS."pdf_fonts".DS); # на define("K_PATH_FONTS", K_PATH_MAIN.DS."fonts".DS); # после строки: $this->_engine = new TCPDF(); # добавляем: // Convert a font // http://www.tcpdf.org/fonts.php // Использование/конвертация кирилического шрифта под TCPDF // После создания "arial.ctg.z", "arial.php", "arial.z" - закомментировать //$this->_engine->addTTFfont(K_PATH_FONTS . '/arial.ttf', 'TrueTypeUnicode', '', 32); define ('PDF_FONT_NAME_MAIN', 'arial'); define ('PDF_FONT_NAME_DATA', 'arial'); $this->_engine->SetFont('arial', '', 14, '', 'false');
В ранних версиях TCPDF для использования/конвертации кириллических, и не только, шрифтов использовалось ttf2ufm -a -F arial.ttf и php -q makefont.php arial.ttf arial.ufm, а в новых версиях теперь всё иначе. В версии 5.9.172 (2012-07-02) используется функция addTTFfont():
Using the addTTFfont() method you can directly create a TCPDF font starting from a TrueType, OpenType or Type1 font.
NOTE: The 'fonts' folder must be writeable by the webserver.
Временно снимаем комментарий с //$this->_engine->addTTFfont(...); и пробуем сохранить/создать статью в PDF формате. Если после открытия PDF видим знаки вопроса, то проверяем права на каталог /joomla/libraries/tcpdf/fonts/, он должен иметь права на запись! После попытки сохранить статью в PDF формате в каталоге /joomla/libraries/tcpdf/fonts/ должны нарисоваться файлы с шрифтами под TCPDF.
Функцией SetFont() устанавливаем используемый по умолчанию шрифт для генерируемых PDF документов. Если хотим изменить содержимое вывода в PDF документ, то правим функцию render() всё в том же /joomla/libraries/joomla/document/pdf/pdf.php.
ВНИМАНИЕ!!! Ещё один ВАЖНЫЙ момент... В некоторых случаях TCPDF требует /joomla/libraries/tcpdf/fonts/courier.php у которого также бывают проблемы с кириллицей, просто скопируйте arial.php в отдельный каталог, там его переименуйте в courier.php и передвиньте назад в /joomla/libraries/tcpdf/fonts/.
Теперь сохраняемые в PDF формате статьи имеют более приятственный вид хоть всё же и не лишены некоторых недостатков, которые возможно в будущем будут устранены автором.
Известные ошибки TCPDF
TCPDF File does not begin with '%PDF-'.
Библиотека tcpdf_5_9_172_php4.zipпри попытке сохранения некоторых документов может выдавать ошибкуFile does not begin with '%PDF-'.Ошибка TCPDF File does not begin with '%PDF-' недавно обсуждалась нами на sourceforge.net
Для её устранения измените значение константы CURLOPT_FOLLOWLOCATION, в строке 7797, с true на 0:
curl_setopt($cs, CURLOPT_FOLLOWLOCATION, 0);
Эта ошибка уже устранена в версии tcpdf_5_9_176_php4, если у вас более старая версия, то обновитесь же до самой свежей версии и да прибудет вам счастье!
Рекомендация
Значение константы K_PATH_CACHE лучше установить к директории cache в корне каталога с CMS Joomla, чтобы в директории /joomla/libraries/tcpdf/cache не нарастало мусора забивающего дисковое пространство, а чистить кеш можно было в одном месте! /joomla/libraries/joomla/document/pdf/pdf.php:
define("K_PATH_CACHE", JPATH_BASE.DS."cache");