Проблема DOMPDF с кириллическими символами

Я использую библиотеку DOMPDF для создания счета в формате PDF. Этот документ может быть на французском, русском или английском, но у меня возникли проблемы с печатью русских букв.

во-первых, я попытался использовать кодировку UTF-8 и поставил meta тег в заголовке HTML-страницы для преобразования:

но это не сработало.

затем я вставил это meta бирка внутри BODY tag, и это помогло решить проблему с французскими символами.

но русские символы по-прежнему не работают. Я также попытался преобразовать русские символы в HTML-объекты, но это тоже не работает.

Я использую класс R & OS CPDF, а не PDFLib в качестве бэкэнда.

кто может помочь?

6 ответов


проблема заключается в шрифтах по умолчанию, которые использует dompdf (то есть у него нет всех символов Юникода, whick уже более 5000). Обычно просмотра азиатских языков.ТТФ-это то, что вам нужно. Вы можете скачать локализованную русскую версию на http://chernev.ru/dompdf.rar {битая ссылка}

обновленная ссылка:https://code.google.com/p/ipwn/downloads/detail?name=arialuni.ttf


в принятом ответе ссылка сломана и содержит старую версию DOMPDF.

для работы с символами юникода в DOMPDF 0.6 у вас есть две альтернативы: использовать существующие шрифты или создать свой собственный шрифт.

  • использовать существующий шрифт (применяется для DOMPDF 0.6):

    1. скачать архив и распаковываем.
    2. скопируйте извлеченные файлы в папку шрифтов dompdf /dompdf/lib/fonts/.
    3. редактировать dompdf_font_family_cache.dist.php с фрагментом 1.
    4. в CSS использовать font-family: times;.

фрагмент 1:

/* ... */
'times' => array (
    'normal' => DOMPDF_FONT_DIR . 'times',
    'bold' => DOMPDF_FONT_DIR . 'timesbd',
    'italic' => DOMPDF_FONT_DIR . 'timesi',
    'bold_italic' => DOMPDF_FONT_DIR . 'timesbi'
),
'times-roman' => array (
    'normal' => DOMPDF_FONT_DIR . 'times',
    'bold' => DOMPDF_FONT_DIR . 'timesbd',
    'italic' => DOMPDF_FONT_DIR . 'timesi',
    'bold_italic' => DOMPDF_FONT_DIR . 'timesbi'
),
/* ... */

  • если вы хотите использовать свой собственный шрифт TTF (скажем, Arial.ttf):

    1. Run:ttf2afm -o Arial.afm Arial.ttf. (Я сделал это в Ubuntu.)
    2. Run:ttf2ufm -a -F Arial.ttf. (Я сделал это в Windows, используя exe из UFPDF, но я думаю, вы можете использовать /dompdf/lib/ttf2ufm/bin/ttf2ufm.exe.)
    3. скопировать Arial.* файлы /dompdf/lib/fonts/.
    4. добавить dompdf_font_family_cache.dist.php фрагмент 2.
    5. в CSS использовать font-family: arial;.

фрагмент 2:

/* ... */
'arial' => array (
    'normal' => DOMPDF_FONT_DIR . 'Arial',
    'bold' => DOMPDF_FONT_DIR . 'Arial',
    'italic' => DOMPDF_FONT_DIR . 'Arial',
    'bold_italic' => DOMPDF_FONT_DIR . 'Arial'
)
/* ... */

Если вы будете использовать шрифт DejaVu, вы можете увидеть кириллические символы

шрифты Dejavu TrueType были предварительно установлены, чтобы предоставить dompdf достойное покрытие символов Юникода по умолчанию. Чтобы использовать шрифты DejaVu, обратитесь к шрифту в таблице стилей, например body { font-family: DejaVu Sans; } (для DejaVu Sans).

DOMPDF включает шрифт DejaVu по умолчанию

    $html = "<html><head><style>body { font-family: DejaVu Sans }</style>".
        "<body>А вот и кириллица</body>".
        "</head></html>";

    $dompdf = new \DOMPDF();
    $dompdf->load_html($html);
    $dompdf->render();
    echo file_put_contents('cyrillic.pdf', $dompdf->output());

вы также можете установить change def для шрифта по умолчанию в dompdf_config.Инк.в PHP

def("DOMPDF_DEFAULT_FONT", "DejaVu Sans");

скачать arialuni.ТЦФ Запустите php load_font.php 'Arial' arialuni.ttf в каталоге dompdf установите шрифт arial Это работает ;)


для меня 4 шага выше не решили проблему. Кроме того, dompdf преобразует созданный pdf в ANSI (ISO) Нужно отключить на странице настроек http://domain.com/admin/settings/print/pdf

установите флажок Использовать режим Юникода dompdf. Это заставит создавать файлы в UTF-8 / Unicode.

обратите внимание, что веб-настройки переопределяют настройки в dompdf_config.Инк.PHP по умолчанию.


отметил, что проблема может быть в использовании CSS-reset, в частности font:inherit;