Кодирование FPDF utf-8 (КАК)


80

Кто-нибудь знает, как установить кодировку в пакете FPDF на utf-8? Или, по крайней мере, ISO-8859-7 (греческий), который поддерживает греческие символы?

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

Любые предложения помогут. Джордж


Если вы хотите использовать больше языков, вам понадобится UTF8, поэтому вы можете использовать tFPDF. Взгляните на пакет композитора .
Робш

Ответы:


116

Не используйте кодировку UTF-8. Стандартные шрифты FPDF используют ISO-8859-1 или Windows-1252. Преобразование в ISO-8859-1 можно выполнить с помощью utf8_decode(): $str = utf8_decode($str); Но некоторые символы, такие как евро, не будут переведены правильно. Если расширение iconv доступно, правильный способ сделать это: $str = iconv('UTF-8', 'windows-1252', $str);


22
Не думаю, что это поможет. Ваш ответ объясняет, как создать PDF-файл с кодировкой ISO-8859-1 или windows-1252, но эти кодировки не будут работать для нелатинских языков. Не говоря уже о выводе многоязычных (мульти-скриптовых) текстов.
Томица Кораћ

3
@Rafiq: не используйте "старый" FPDF, а более новую версию UTF8 tFPDF как сообщение в моем ответе.
Тарсис

1
Примечание. При использовании ISO-8859-1 символ € не будет работать (в кодировке нет знака евро, используйте вместо него ISO-8859-15).
BurninLeo

1
@BurninLeo: ISO-8859-15 не намного лучше, все эти кодировки имеют одинаковый лимит символов, поэтому -15 имеет €, но поэтому отсутствует ´ или ½. Единственное реальное решение - использовать UTF-8 вместо того, чтобы избегать его, как показано в моем ответе.
Тарсис

3
tFPDF поддерживает юникод, но он не обновлялся в течение трех лет, тогда как FPDF был обновлен совсем недавно, что сделало tFPDF устаревшим. Имейте это в виду при использовании tFPDF.
Agilis

38

Также существует официальная версия FPDF для UTF-8 под названием tFPDF http://www.fpdf.org/en/script/script92.php

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

<?php

//this is a UTF-8 file, we won't need any encode/decode/iconv workarounds

//define the path to the .ttf files you want to use
define('FPDF_FONTPATH',"../fonts/");
require('tfpdf.php');

$pdf = new tFPDF();
$pdf->AddPage();

// Add Unicode fonts (.ttf files)
$fontName = 'Helvetica';
$pdf->AddFont($fontName,'','HelveticaNeue LightCond.ttf',true);
$pdf->AddFont($fontName,'B','HelveticaNeue MediumCond.ttf',true);

//now use the Unicode font in bold
$pdf->SetFont($fontName,'B',12);

//anything else is identical to the old FPDF, just use Write(),Cell(),MultiCell()... 
//without any encoding trouble
$pdf->Cell(100,20, "Some UTF-8 String");

//...
?>

Я думаю, что гораздо более элегантно использовать это вместо рассылки utf8_decode () повсюду, и возможность использовать файлы .ttf непосредственно в AddFont () также является положительным моментом.

Любой другой ответ здесь - это просто способ избежать или обойти проблему, а отказ от UTF-8 не является реальным вариантом для современного проекта.

Существуют также альтернативы, такие как mPDF или TCPDF (и другие), которые основаны на FPDF, но предлагают расширенные функции, имеют поддержку UTF-8 и могут интерпретировать HTML-код (конечно, с ограничениями, поскольку нет прямого способа конвертировать HTML в PDF). Большая часть кода FPDF может использоваться непосредственно в этих библиотеках, поэтому его довольно легко перенести.

https://github.com/mpdf/mpdf http://www.tcpdf.org/


1
Ни одно из решений iconv и decode не работает для более исключительных символов (♠ ♥ ☺äκόσμος). Но если вы просто замените свой fpdf.php файлом tpdf.php, все просто начнет работать, а ваши файлы станут меньше в качестве дополнительного бонуса. Отличное исправление.
Себастьян

1
Являются ли FPDF и tFPDF отдельными филиалами? Кто-нибудь знает причину, по которой tFPDF так хорошо скрывается на странице FPDF? Есть ли недостатки, о которых стоит знать перед переключением?
BurninLeo

1
Я совершенно уверен, почему они не сделали ее версией FPDF по умолчанию, но она связана непосредственно на главной странице fpdf.org, и, как упоминалось там, функции tFPDF изначально были разработаны для mPDF. Я использовал tFPDF для многих PDF-файлов в продуктивной среде, и я думаю, что помимо UTF-8 и изменений шрифтов он на 100% одинаков. Никогда не было проблем.
Тарсис

1
tFPDF - это сценарий или расширение FPDF. Он считается устаревшим (обновлен 3 года назад), потому что FPDF был обновлен совсем недавно. Автор tFPDF не поддерживает его, и GitHub, связанный с tFPDF, не был затронут. См .: github.com/rev42/tfpdf
Agilis

Пока вам не нужно больше функций, я не вижу в этом проблемы, кстати, последнее (незначительное) обновление было всего 4 месяца назад - все же лучше, чем не поддерживать UTF-8. В любом случае я бы предпочел TCPDF или mPDF, которые основаны на FPDF, но предоставляют расширенные функции, а также поддерживают HTML-код.
Тарсис

28

есть действительно простое решение этой проблемы.

В файле fpdf.php перейдите к строке, которая гласит:

if($txt!=='')
{

В моей версии fpdf это строка 648. Вставьте следующую строку кода:

$txt = iconv('utf-8', 'cp1252', $txt);

(над строкой кода)

if($align=='R')

Это работает для всех немецких специальных символов, а также для греческих специальных символов. В противном случае просто замените cp1252 соответствующим алфавитом, который вам нужен. Здесь вы можете увидеть все поддерживаемые символы: http://en.wikipedia.org/wiki/Windows-1252

Я видел решение здесь: http://fudforum.org/forum/index.php?t=msg&goto=167345 Воспользуйтесь приведенным выше примером кода, поскольку исходный автор забыл вставить дефис между utf и 8.

Надеюсь, это было полезно.

Даан


Отлично, это все еще работает или необходимо после обновления FPDF до версии, которая поддерживает PHP7 для правильного отображения специальных символов.
Aren

1
Эта команда работает для меня, $ txt = iconv ('utf-8', 'cp1252', $ txt); Спасибо
Патрик Аргуэлло

Просто потрясающее простое решение. К сожалению, он спрятан в
неясном

Это что-то изменило с моим интервалом - некоторые строки теперь рвутся раньше. Но, по крайней мере, вроде работает - раньше турецкое письмо у меня вообще не работало, теперь по крайней мере я что-то вижу.
Cold_Class

9

Сначала вам нужно сгенерировать шрифт. Вы должны использовать MakeFontутилиту, включенную в пакет FPDF. Я использовал в Linux этот немного расширенный скрипт из демонстрации:

<?php
// Generation of font definition file for tutorial 7
require('../makefont/makefont.php');

$dir = opendir('/usr/share/fonts/truetype/ttf-dejavu/');
while (($relativeName = readdir($dir)) !== false) {
    if ($relativeName == '..' || $relativeName == '.')
        continue;
    MakeFont("/usr/share/fonts/truetype/ttf-dejavu/$relativeName",'ISO-8859-2');
}
?>

Затем я скопировал сгенерированные файлы в fontкаталог своей сети и использовал это:

$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Buňka jedna'),1);

(Я работал на столе.) , Который работал на моем языке ( Бунка Jedna является чешским для сотовых один ). Чешский язык относится к центральноевропейским языкам, также ISO-8859-2. К сожалению, пользователь FPDF вынужден терять преимущества кодировки UTF-8. Вы не можете получить это в своем PDF-файле:

Městečko Fruens Bøge

Датское письмо øстановится řISO-8859-2.

Предложение решения: вам необходимо получить греческий шрифт, сгенерировать шрифт с использованием правильной кодировки (ISO-8859-7) и использовать iconvту же целевую кодировку, что и шрифт, сгенерированный.




4

Ни одно из вышеперечисленных решений не сработает.

Попробуй это:

function filter_html($value){
    $value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
    return $value;
}

4

Вы можете создать класс для расширения FPDF и добавить это:

class utfFPDF extends FPDF {

function Cell($w, $h=0, $txt="", $border=0, $ln=0, $align='', $fill=false, $link='')
{
    if (!empty($txt)){
        if (mb_detect_encoding($txt, 'UTF-8', false)){
            $txt = iconv('UTF-8', 'ISO-8859-5', $txt);

        }
    }
    parent::Cell($w, $h, $txt, $border, $ln, $align, $fill, $link);

} 

}


4

Я хотел ответить на этот вопрос всем, кто не перешел на TFPDF по какой-либо причине (интеграция фреймворка и т. Д.)

Перейдите по ссылке : http://www.fpdf.org/makefont/index.php

Использовать .ttf шрифт, совместимый с языком, который вы хотите использовать. Убедитесь, что вы выбрали правильный номер кодировки для вашего языка. Загрузите файлы и вставьте их в текущий каталог шрифтов FPDF.

Используйте это, чтобы активировать новый шрифт: $pdf->AddFont($font_name,'','Your_Font_Here.php');

Тогда можно будет $pdf->SetFontнормально пользоваться.

В самом шрифте используйте iconv для преобразования в UTF-8. Так что, например, если вы используете иврит, вы бы это сделали iconv('UTF-8', 'windows-1255', $first_name).

Замените кодировку Windows на кодировку вашего языка.

Для справа налево быстрое исправление делает что-то вроде strrev(iconv('UTF-8', 'windows-1255', $first_name)).


4

просто отредактируйте ячейку функции в файле fpdf.php, найдите строку, которая выглядит так

function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{ 

после нахождения линии

напишите после {,

$txt = utf8_decode($txt);

сохраните файл и готово, акценты и кодировка utf8 будут работать :)


3

Как мне создать PDF-файлы в FPDF, которые поддерживают китайский, японский, русский и т. Д.?

(снимки используемого кода ниже)

Я хотел бы предоставить: краткое изложение проблемы, решение, проект github с рабочим кодом и онлайн-пример с ожидаемым итоговым PDF-файлом.

Проблема :

  1. Как заявил Тарсис, замените FPDF на TFPDF.
  2. На самом деле вам нужен шрифт, поддерживающий символы UTF-8, которые вы используете.

    IE, просто используя Helvetica и пытаясь отобразить японский язык, не сработает. Если вы используете Font Forge или какой-либо другой инструмент для работы со шрифтами, вы можете прокрутить до китайских символов шрифта и увидеть, что они пусты.

    У Google есть шрифт (шрифт Noto ), который содержит все языки, и его размер составляет 20 МБ, что обычно в несколько раз больше размера вашего текста. Итак, вы можете понять, почему многие шрифты просто не охватывают все языки.

Решение :

Я использую пакеты шрифтов Round-mgenplus-20140828.ttf и ZCOOL_QingKe_HuangYou.ttf для японского и китайского языков, которые имеют открытый исходный код и могут быть найдены во многих проектах с открытым исходным кодом. В самом tFPDF или его новом наследующем классе, например class HTMLtoPDF extends tFPDF {...}, вы сделаете это ...

$this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
$this->SetFont('japanese', '', 14);
$this->Write(14, '日本語');

Больше ничего не должно быть!

Пакет кода на GitHub:

https://github.com/HoldOffHunger/php-html-to-pdf

Рабочая онлайн-демонстрация японского языка:

https://www.earthfluent.com/privacy.pdf?language=ja


1

Для потомков.

Как мне удалось добавить русский язык в fpdf на моей Linux-машине:

1) Перейдите на http://www.fpdf.org/makefont/ и преобразуйте шрифт ttf (например, AerialRegular.ttf) в 2 файла, используя кодировку ISO-8859-5 : AerialRegular.php и AerialRegular.z

2) Поместите эти 2 файла в FPDF / FONT каталог

3) Используйте это в своем коде:

$pdf = new \FPDI();
    $pdf->AddFont('ArialMT','','ArialRegular.php');
    $pdf->AddPage();
    $tplIdx = $pdf->importPage(1);
    $pdf->useTemplate($tplIdx, 0, 0, 211, 297); //width and height in mms
    $pdf->SetFont('ArialMT','',35);
    $pdf->SetTextColor(255,0,0);
    $fullName = iconv('UTF-8', 'ISO-8859-5', 'Алексей');
    $pdf->SetXY(60, 54);
    $pdf->Write(0, $fullName);



0

Вы можете применить эту функцию к своему тексту:

 $yourtext = iconv('UTF-8', 'windows-1252', $yourtext);

благодаря


0

Я использую FPDF для ASP, и функция iconv недоступна. Это кажется странным, но я решил проблему UTF-8, добавив поддельное изображение (1x1px jpeg) в pdf сразу после функции AddPage ():

pdf.Image "images/fpdf.jpg",0,0,1

Таким образом, акцентированные символы правильно добавляются в мой PDF-файл, не спрашивайте меня, почему, но это работает.


0

Не уверен, подойдет ли это для греческого языка, но у меня была такая же проблема с бразильскими португальскими символами, и я решил использовать html-сущности. У меня было в основном два случая:

  1. Строка может содержать символы UTF-8.

Для этого я сначала закодировал его в html-объекты, htmlentities()а затем декодировал их в iso-8859-1. Пример:

$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
  1. Фиксированная строка с html-сущностями:

Для них я просто оставил htmlentities()вызов. Пример:

$s = html_entity_decode("Treasurer/Tr&eacute;sorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');

Затем я перешел $sк FPDF, как в этом примере:

$pdf->Cell(100, 20, $s, 0, 0, 'L');

Примечание: ENT_COMPAT | ENT_HTML401это стандартное значение для параметра №2, как в http://php.net/manual/en/function.html-entity-decode.php

Надеюсь, это поможет.


0

Я знаю, что это старый вопрос, но я думаю, что мой ответ поможет тем, кто не нашел решения в других ответах. Итак, моя проблема заключалась в том, что я не мог отображать хорватские символы в моем PDF-файле. Во-первых, я использовал FPDF, но, думаю, он не поддерживает Unicode. Наконец, что решило мою проблему, так это tFPDF, который является версией FPDF, поддерживающей Unicode. Это пример, который сработал для меня:

require('tFPDF/tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
$pdf->AddFont('DejaVu', 'B', 'DejaVuSansCondensed-Bold.ttf', true);

$pdf->SetFont('DejaVu','',14);

$txt = 'čćžšđČĆŽŠĐ';
$pdf->Write(8,$txt);

$pdf->Output();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.