TCPDF UTF-8.Литовские символы не отображаются - PullRequest
25 голосов
/ 17 марта 2011

Я использую последнюю версию TCPDF (5.9). Но есть странные проблемы с кодировкой. Мне нужны символы литовского языка, такие как: ąčęėįšųūž. Но получите только несколько из них. Другие остаются как у каждого И что же мне делать ? Я использую шрифт раз по умолчанию (поставляется с загрузкой TCPDF).

Любая помощь будет оценена.

Ответы [ 14 ]

30 голосов
/ 03 июня 2011

TCPDF довольно сложен с utf8. Лучший способ добиться того, чего вы хотите - это встроить шрифт в сам сгенерированный файл PDF. Вы можете использовать шрифт freeserif из пакета TCPDF, он содержит все символы utf8, показывает абсолютно любой символ любого языка, но добавляет ~ 700 КБ к выходному файлу. Это, вероятно, самый простой способ получить нужные символы, если размер файла не имеет значения.

Вы также можете сделать свой собственный шрифт для вставки, содержащий необходимые символы. Это, пожалуй, лучшее решение, оно универсальное и небольшого размера, но более сложное.

В качестве альтернативы, вы можете ретранслировать основные шрифты, которые взяты из системы и, если не найдены, заменены заменой. Это делает выходной файл чрезвычайно легким, но добавляет необходимость поднабора шрифтов для получения экзотических символов. Лично я не имел успеха с этим, поэтому я все еще думаю, что встраивание шрифта - лучшее решение, которое также оказывается более универсальным ..

14 голосов
/ 26 мая 2011

Установите для параметра $unicode в конструкторе TCPDF значение false, а для параметра $encoding - 'ISO-8859-1' или другую карту символов.

Эта поможет вам:

По умолчанию для Unicode UTF-8:

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

Пример конструктора для европейской кодировки:

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);
11 голосов
/ 17 марта 2013

есть шрифт, включенный в основные шрифты CPDF - dejavusans, он показывает все литовские символы.Просто добавьте следующее:

$pdf->setHeaderFont(Array('dejavusans', '', 10, '', false));
$pdf->setFooterFont(Array('dejavusans', '', 8, '', false));
$pdf->SetFont('dejavusans', '', 10, '', false);
9 голосов
/ 16 февраля 2012

Только что обнаружил такую ​​же ситуацию при попытке отрисовки румынского текста с использованием шрифта Helvetica по умолчанию. Проведя некоторое исследование, я обнаружил, что библиотека tcpdf рассматривает свои шрифты по умолчанию (называемые «базовыми» шрифтами) как символы Latin1, поэтому даже если вы скажете ей использовать кодировку UTF-8 и установите флаг unicode, она буквально переведет ваш текст до Latin1 эквивалентов до рендеринга. Поведение библиотеки по умолчанию, если она находит эквивалент Latin1, переводит каждый символ, для которого она может найти эквивалент, иначе она переводит символ как «?».

Это можно найти внутри класса TCPDF в следующей цепочке методов: Write() -> Cell() -> getCellCode() -> _escapetext().

Внутри _escapetext() вы можете видеть, что он проверяет $this->isunicode, затем проверяет выбранный шрифт, чтобы увидеть, является ли его тип core | TrueType | Type1 . Если это так, он примет для вас строку «латинизировать» с помощью метода UTF8ToLatin1(). Это где '?' переводы выполняются.

Я рекомендую использовать пользовательский шрифт Unicode (например, Deja Vu Sans), который похож на шрифт по умолчанию, который вы ищете. Это сработало для меня в моей нынешней ситуации.

8 голосов
/ 15 ноября 2013

Установите шрифт на freeserif, он будет работать.Я проверял.

$pdf->SetFont('freeserif', '', 14, '', true);
8 голосов
/ 02 июля 2013

Чтобы использовать TCPDF со специальными символами, такими как ฿, 포 или другими , вам необходимо использовать Unicode шрифт:

  1. скачать шрифт здесь: ftp: //ftp.fu-berlin.de/unix/X11/multimedia/MPlayer/contrib/fonts/arialuni.ttf.bz2

  2. создайте тестовый файл pdf и загрузите этот шрифт в пример TCPDF:

    $fontname = $pdf->addTTFfont('/var/www/app/images/fonts/arialuni.ttf', 'TrueTypeUnicode', '', 32);

  3. это создаст шрифтыкак:

    приложение / библиотеки / tcpdf / шрифты / arialuni.ctg.z
    приложение / библиотеки / tcpdf / шрифты / arialuni.php
    приложение / библиотеки / tcpdf / шрифты / arialuni.z

  4. теперь вы можете установить новый шрифт с помощью: $ pdf-> SetFont ('arialuni', '', 10.5);

  5. и теперь вы можете использовать специальные символы Юникода, такие как ฿ и более ....

Источник: http://myridia.com/dev_posts/view/852

4 голосов
/ 15 мая 2012

У вас есть проблемы с чтением символа, подобного Karnātaka из базы данных, и отображением этого сообщения karn? Taka Я имею в виду "?" , который нам не нужензатем выполните следующие действия:

  1. Определите кодировку для соединения (mysql_set_charset()):

    $con = mysql_connect("localhost","root","");
    
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("database_name", $con) or die(mysql_error());
    mysql_set_charset('utf8',$con);
    
  2. Используйте $pdf->SetFont('DejaVuSerif', '', 10); вместо $pdf->SetFont('helvetica', 'B', 12);

    • Для библиотеки TCPDF из PHP читается такой символ, как Rājasthān вместо R? Jasth? N из базы данных
3 голосов
/ 17 марта 2011

IIRC, вы можете определить кодировку при создании нового шрифта, , как описано здесь .В противном случае вы должны использовать кодировку, которая была определена при создании шрифта.Похоже, что все шрифты, которые поставляются с TCPDF, используют WinAnsiEncoding ... он же кодовая страница 1252.

Неуклюжий, но эффективный.

2 голосов
/ 16 ноября 2012

С шрифтом dejavusans он отлично работал как для русских, так и для латышских букв.

2 голосов
/ 16 апреля 2012

У меня это была проблема со шрифтом.Я использовал шрифт times, и мои локальные многобайтовые символы не будут отображаться должным образом.Когда я изменил его на freeserif они работали нормально:)

...