TCPDF в Joomla выдает некорректный pdf документ при сохранении статьи в pdf формате

archive view archive save

TCPDF в Joomla выдает некорректный pdf документ при сохранении статьи в pdf формате В 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");

Автор: Олег Головский


Об авторе
Иван Шаман
Меня нет ни в Инстаграмме ни в Фейсбуке, я просто хожу по улицам и рассказываю первым встречным: сколько зарабатываю; с кем дружу; где живу и чем дышу. У меня даже появилось несколько подписчиков: ПСИХоЛОХ и участковый полицай!
Ещё статьи автора

Комментарии   

АдМинь БагоИскатель
0 #11 АдМинь БагоИскатель 25.09.2013 18:00
Цитирую Guest:
сделал все как написано все равно не помогает. вот что он пишет, где должна быть кириллица »Ð¾Ñ‚Ð»Ñ‚Ð»Ð¾Ñ‚ тотолт олт лот олт л

Не факт! :-) Люди часто бывает упускают из виду некоторые важные детали, которые лежат на самом видном месте.

Инструкция полностью рабочая, по крайней мере для версии TCPDF 5.9.х, проверено!

Вы можете подождать пока не обновиться эта статья для TCPDF версии 6.х или кто в комментариях не подскажет решение, но я думаю что Вы просто кое-что пропустили - ещё раз внимательно перечитайте эту статью, убедитесь, что выполнили конвертацию шрифта $this->_engine- >addTTFfont(... ), иногда конвертация не проходит и без выдачи ошибок, а также что имя шрифта указали верно.

За версию 6.х ничего сказать не можем, на нашем сайте использование PDF документов временно отключили для экономии ресурсов, но за скромное вознаграждение сможем Вам помочь решить проблему с кирилицей.
Цитировать
Guest
0 #10 Guest 25.09.2013 16:38
сделал все как написано все равно не помогает. вот что он пишет, где должна быть кириллица »Ð¾Ñ‚Ð»Ñ‚Ð»Ð¾Ñ‚ тотолт олт лот олт л
Цитировать
АдМинь БагоИскатель
0 #9 АдМинь БагоИскатель 09.10.2012 06:31
Цитирую Станислав:
Добрый день!
сделал все как написано, причем повторил порядка 5 раз. У меня нормально создаются файлы шрифтов. Я потом снова заккоменировал строку //$this->_engine->addTTFfont(K_PATH_FONTS . '/arial.ttf', 'TrueTypeUnicode', '', 32);
И далее сделал все по тексту, НО! к сожалению эффекта практически нет вместо буков только знаки вопроса, хотя местами начал проскакивать русский текст. Куда копать, подскажиете пожалуйста!
Заранее спасибо!

:-) Точно сделали всё как написано? Точно ли сделали всё по тексту? А ничего не пропустили?
Цитата:
ВНИМАНИЕ!!! Ещё один ВАЖНЫЙ момент... В некоторых случаях TCPDF требует /joomla/libraries/tcpdf/fonts/courier.php у которого также бывают проблемы с кириллицей, просто скопируйте arial.php в отдельный каталог, там его переименуйте в courier.php и передвиньте назад в /joomla/libraries/tcpdf/fonts/.
Сегодня выделили начало этого пункта красным и жирным шрифтом, обратите на него должное внимание! ок? После этого на всяк случ. почистите каталог /public_html/ca che/
Цитировать
Станислав
0 #8 Станислав 09.10.2012 00:18
Добрый день!
сделал все как написано, причем повторил порядка 5 раз. У меня нормально создаются файлы шрифтов. Я потом снова заккоменировал строку //$this->_engin e->addTTFfont(K _PATH_FONTS . '/arial.ttf', 'TrueTypeUnicod e', '', 32);
И далее сделал все по тексту, НО! к сожалению эффекта практически нет вместо буков только знаки вопроса, хотя местами начал проскакивать русский текст. Куда копать, подскажиете пожалуйста!
Заранее спасибо!
Цитировать
Александр
0 #7 Александр 02.10.2012 19:20
Цитирую Администратор:

С таблицами всё ок, например гляньте в таблице "Список UNIX/LINUX демонов/служб и их автозагрузка" в разделе "Unix -> Общее"

Ваша таблица возможно не прорисовывается из-за того, что CSS стили прописаны в отдельном файле, а не в тегах самой таблицы - потому её и не видно в итоговом PDF документе!

Вы были правы. Сделал. Спасибо
Цитировать
Олегатор
0 #6 Олегатор 02.10.2012 18:51
Цитирую Александр:

Спасибо. Получилось. Не то что было раньше. Но таблица все равно не рисуется.

С таблицами всё ок, например гляньте в таблице "Список UNIX/LINUX демонов/служб и их автозагрузка" в разделе "Unix -> Общее"

Ваша таблица возможно не прорисовывается из-за того, что CSS стили прописаны в отдельном файле, а не в тегах самой таблицы - потому её и не видно в итоговом PDF документе!
Цитировать
Александр
0 #5 Александр 02.10.2012 17:46
Цитирую Администратор:

Александр, ВНИМАНИЕ! Файл arial.ttf нужно будет взять из C:\WINDOWS\Fonts

Обновлено 02.10.2012 16:05

Спасибо. Получилось. Не то что было раньше. Но таблица все равно не рисуется.
Цитировать
Олегатор
0 #4 Олегатор 02.10.2012 17:07
Цитирую Александр:
При попытке создания pdf документа появляется следующая ошибка

TCPDF ERROR: Could not find file: ... /libraries/tcpdf/fonts//arial.ttf

Александр, ВНИМАНИЕ! Файл arial.ttf нужно будет взять из C:\WINDOWS\Font s

Обновлено 02.10.2012 16:05
Цитировать
Александр
0 #3 Александр 02.10.2012 12:40
При попытке создания pdf документа появляется следующая ошибка

TCPDF ERROR: Could not find file: ... /libraries/tcpd f/fonts//arial. ttf
Цитировать
Олегатор
0 #2 Олегатор 25.09.2012 07:43
Цитирую Евгения:
Добрый день!!

Спасибо большое за пост!

Появился только один вопрос - у меня не создаются "arial.ctg.z", "arial.php", "arial.z" после того, как раскоментировала нужную строчку. Не подскажите в чем может быть проблема?

Женечька, если не создаются "arial.ctg.z", "arial.php", "arial.z", то проверьте чтобы каталог /public_html/li braries/tcpdf/f onts был доступен на запись!

Обычно у вменяемого хостинг провайдера сервер использует РНР через SuExec и все каталоги доступны на запись для сервера и исплняемых там скриптов при правах на каталоги 755 но, бывают и исключения где требуются права на каталоги 775 или того хуже 777.

Негадая можете временно установить 777 на каталог /public_html/li braries/tcpdf/f onts и повторить попытку, после чего обновите список файлов и каталогов в файловом менеджере, проверьте наличие "arial.ctg.z", "arial.php", "arial.z" и верьните права на каталог как было, а если желаемые файлы так и не появятся, то напишите нам на почту или сюда в комментарии и мы вышлем эти файлы на Ваш электронный ящик!
Цитировать

Добавить комментарий

АХТУНГ! Все комменты гостей модерасятся модерастом.
  1. Мессаги исключительно рекламного содержания, либо содержащие только одни оценочные суждения типа "круто" ("отлично", "спасибо", "автор дебил" и т.п.) не публикуются;
  2. Злостным спамерам, пранкерам и прочей сетевой нечисти рекомендуем напрасно не тратить своего времени и удовлетворять свои больные фантазии на специализированных Интернет ресурсах!;
  3. Разумная обоснованная критика, замечания, дополнения приветствуются. Поля помеченные символом * обязательны к заполнению.


Защитный код
Обновить

Комментарии в блоге
Новое на форуме