Решение проблемы с генерацией PDF документов с использованием библиотеки dompdf при использовании Unicode - русских букв

Главные вкладки

Аватар пользователя Freakachoo Freakachoo 8 ноября 2009 в 23:58

Итак я долго мучался с этой проблемой и наконец решил.
Но совесть не дала мне просто принять этот опыт не написать об этом в сообщество Smile
Итак вот как я делал (ссылки на уже готовые - в конце статьи):

Берем модуль print версии 6.х-1.10.
Скачиваем dompdf в слегка переработанной версии (мне пришлось соединить между собой 2 сборки - dompdf 0.6 - альфа 2 и где-то кем-то сделанную версию с русскими шрифтами), что получилось выкладываю сюда.

Кладем dompdf в папку
/lib
модуля print (как того и приписывает инструкция).

Далее
Берем в модуле print (версию не перепутайте - 6.х-1.10.) файл: print/print_pdf/print_pdf.pages.inc и закомментируем следующие строки:

с №146 по №161:

  // Convert from UTF-8 to ISO 8859-1 and then to HTML entities
  if (function_exists('utf8_decode')) {
    $html = utf8_decode($html);
  }
// iconv fails silently when it encounters something that it doesn't know, so don't use it
//  else if (function_exists('iconv')) {
//    $html = iconv('UTF-8', 'ISO-8859-1', $html);
//  }
  elseif (function_exists('mb_convert_encoding')) {
    $html = mb_convert_encoding($html, 'ISO-8859-1', 'UTF-8');
  }
  elseif (function_exists('recode_string')) {
    $html = recode_string('UTF-8..ISO_8859-1', $html);
  }
  $html = htmlspecialchars_decode(htmlentities($html, ENT_NOQUOTES, 'ISO-8859-1'), ENT_NOQUOTES);

Ибо они поганят всю кодировку. (конечно я может где что лишнее закомментировал... но однако у меня заработало.

Далее
в dompdf - файл dompdf_config.inc.php
строка №161, параметр DOMPDF_UNICODE_ENABLED установить в true:
(должно стать так)

if (!defined("DOMPDF_UNICODE_ENABLED")) {
  define("DOMPDF_UNICODE_ENABLED", true);
}

Вот кажется и все Smile

Так что вот Smile пользуйтесь и радуйтесь. Найдете баги - пишите.
(все необходимое прилагаю)

P.S. файлы почему-то так и не прикрепился к статье (думаю что из-за таймаута), поэтому даю ссылку на внешнее хранилище:
dompdf-0.6-alfa2_plus_unicode

print_6.x-1.10_plus

Комментарии

Аватар пользователя pavlosof pavlosof 24 декабря 2009 в 18:46

А можно ли использовать это решение отдельно от Drupal-a?
Если да, то напишите пожалуйста для Drupal-непосвященных пример PHP-кода для генерации pdf-файла, скажем, с такого простого HTML-кода(файла):

<span style="font-family: Verdana;">Привет</span>

Хочется проверить как отображаются шрифты кроме Times.

Аватар пользователя ii ii 19 февраля 2010 в 12:26

Нашел файлик в исходнике по вашей ссылке sites/all/modules/print/lib/dompdf/list4.html Smile
В общем - не работает!

update: нашел так источник - sites\all\modules\print\print.tpl.php

Аватар пользователя ii ii 10 ноября 2015 в 11:46

Как сделать так, чтобы символы   — и пр. распознавались правильно? И чтоб слова не наезжали друг на друга.

Аватар пользователя milkovsky milkovsky 5 января 2012 в 19:58

ruska882010 wrote:
Я с подобной проблемой сталкивался, поменял шрифт и все нормально заработало

Удачи!


Не подскажите где меняется шрифт? Пробовал на странице admin/settings/print/pdf, не помогло

Аватар пользователя aparfilov aparfilov 8 ноября 2010 в 22:35

Freakachoo, с PDF понятно, а отправку по e-mail пробовали? У меня присылает письма в ISO-8859-1. Остальные модули нормально шлют. Что может быть?

Аватар пользователя Leonyl Leonyl 20 ноября 2010 в 22:14

Да, действительно Dompdf, представленная здесь, работает с рус. шрифтами. Но, следующая бага: весь текст разлазится за границы указанного (A4) формата, иногда абзацы наезжают друг на друга.

Если скачать dompdf_0-6-0_beta1.zip с сайта разработчика, копирнуть в неё шрифты из представленной в этом топике сборки и подправить dompdf_config.inc.php – наезды уходят, всё в рамках приличия.

А вот как подружить это всё с CSS – на странице модуля print заявлен "full CSS support" – неизвестно.
На print-6.x-1.12 эти хаки не действуют: кирилика выводится знаками вопроса. Что со шриятами из сборки топикстартера, что без. Перед этим висит больше минуты.

Заявленной поддержки CSS, ради которой пробовал dompdf, я так и не добился: помещал стили и в print_pdf.tpl.php, и во внешний файл.

tcpdf хоть и не поддерживает css, но зато быстрый и кириллицу держит без проблем.

Аватар пользователя Hardoman Hardoman 10 сентября 2015 в 16:41

решение работает, спасибо.
использую версию print 1.19 + dompdf 0.6.0 beta 3 + набор русских шрифтов, откуда-то скачанных

"milkovsky" wrote:
Не подскажите где меняется шрифт? Пробовал на странице admin/settings/print/pdf, не помогло

Шрифты прописываются в /sites/all/modules/print/lib/dompdf/lib/fonts/dompdf_font_family_cache.dist.php

В формате
'sans-serif' =>
array (
'normal' => DOMPDF_FONT_DIR . 'times',
'bold' => DOMPDF_FONT_DIR . 'timesbd',
'italic' => DOMPDF_FONT_DIR . 'timesi',
'bold_italic' => DOMPDF_FONT_DIR . 'timesbi',
),

Здесь я заменяю шрифт sans-serif на мои кастомные times. Сами эти шрифты лежат тутже в форматах aam, ttf, ufm