Кодирование 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

Существует расширение FPDF, называемое mPDF, которое позволяет использовать шрифты Unicode.

http://www.mpdf1.com/mpdf/index.php

Джон Уинстэнли
источник
3
Ссылка кажется мертвой
robsch
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

HoldOffHunger
источник
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-файл, не спрашивайте меня, почему, но это работает.

niente1
источник
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();
NutCracker
источник