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

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

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

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


person yorgos    schedule 13.06.2011    source источник
comment
Если вы хотите использовать больше языков, вам понадобится UTF8, поэтому вы можете использовать tFPDF. Взгляните на пакет композитора.   -  person robsch    schedule 25.04.2018


Ответы (18)


Не используйте кодировку 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);

person Michal    schedule 30.01.2012
comment
где разместить UTF-8 в fpdf, чтобы печатать арбиковый текст - person SAR; 12.10.2014
comment
Не думаю, что это поможет. В вашем ответе объясняется, как создать PDF-файл с кодировкой ISO-8859-1 или windows-1252, но эти кодировки не будут работать для нелатинских языков. Не говоря уже о выводе многоязычных (мульти-скриптовых) текстов. - person Томица Кораћ; 17.02.2015
comment
@Rafiq: не используйте старый FPDF, а более новую версию tFPDF UTF8 в качестве сообщения в моем ответе. - person Tarsis; 07.05.2015
comment
За ответ @Tarsis нужно проголосовать больше; Все это решает поддержка tFPDF UTF-8. - person cbmtrx; 11.12.2015
comment
Примечание. При использовании ISO-8859-1 символ € не будет работать (в кодировке нет знака евро, используйте вместо него ISO-8859-15). - person BurninLeo; 30.12.2015
comment
@BurninLeo: ISO-8859-15 не намного лучше, все эти кодировки имеют одинаковый лимит символов, поэтому -15 имеет €, но поэтому отсутствует ´ или ½. Единственное реальное решение - использовать UTF-8 вместо того, чтобы избегать его, как показано в моем ответе. - person Tarsis; 19.01.2016
comment
Хороший момент - я был так занят решением проблемы, что даже перешагнул через tFPDF ... Арг! - person BurninLeo; 20.01.2016
comment
tFPDF поддерживает юникод, но он не обновлялся в течение 3 лет, тогда как FPDF был обновлен совсем недавно, что сделало tFPDF устаревшим. Помните об этом при использовании tFPDF. - person Agilis; 01.04.2016
comment
Я пробовал использовать tFPDF, но я также использую расширения Transformations и CircularText, и символы UTF8 не будут правильно отображаться в круговом тексте. Передача текста через iconv работала и была более простым решением для моей ситуации. - person phansen; 06.07.2016
comment
@phansen: Я использую tFPDF с fpdf-скриптами. Для миграции CircularText необходимо внести лишь несколько изменений. При первом парсинге текста: $ utf_text = preg_split ('// u', $ text, -1, PREG_SPLIT_NO_EMPTY); $ length = count ($ utf_text); или вы можете использовать функции многобайтовых строк для синтаксического анализа. Затем замените strlen ($ text) на $ length и $ text на $ utf_text. - person user4762971; 14.07.2016
comment
это действительно решает мою проблему, поскольку fpdf не может печатать язык какой-то страны, но с этими советами это можно сделать. также TFPDF не работает, некоторые символы отображаются неправильно (например, тайский) - person Sruit A.Suk; 13.07.2021

Также существует официальная версия 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/

person Tarsis    schedule 03.02.2014
comment
Ни одно из решений iconv и decode не работает для более исключительных символов (♠ ♥ ☺äκόσμος). Но если вы просто замените свой fpdf.php файлом tpdf.php, все просто начнет работать, а ваши файлы станут меньше в качестве дополнительного бонуса. Отличное исправление. - person Sebastian; 05.05.2015
comment
Являются ли FPDF и tFPDF отдельными филиалами? Кто-нибудь знает причину, по которой tFPDF так хорошо скрывается на странице FPDF? Есть ли недостатки, о которых стоит знать перед переключением? - person BurninLeo; 20.01.2016
comment
Я совершенно уверен, почему они не сделали ее версией FPDF по умолчанию, но ссылка на нее находится прямо на главной странице fpdf.org и, как уже упоминалось, функции tFPDF изначально были разработаны для mPDF. Я использовал tFPDF для многих PDF-файлов в продуктивной среде, и я думаю, что помимо UTF-8 и изменений шрифтов, он на 100% то же самое. Никогда не было проблем. - person Tarsis; 20.01.2016
comment
tFPDF - это сценарий или расширение FPDF. Он считается устаревшим (обновлен 3 года назад), потому что FPDF был обновлен совсем недавно. Автор tFPDF не поддерживает его, и GitHub, связанный с tFPDF, не был затронут. См .: github.com/rev42/tfpdf - person Agilis; 01.04.2016
comment
Пока вам не нужно больше функций, я не вижу в этом проблемы, кстати, последнее (незначительное) обновление было всего 4 месяца назад - все же лучше, чем не поддерживать UTF-8. В любом случае я бы предпочел TCPDF или mPDF, которые основаны на FPDF, но предоставляют расширенные функции, а также поддерживают HTML-код. - person Tarsis; 13.04.2016
comment
В настоящее время tFPDF можно установить через композитор: packagist.org/packages/docnet/tfpdf - person robsch; 25.04.2018
comment
Он работает, но для меня он намного медленнее, чем оригинальный FPDF. Я запустил собственную версию FPDF, чтобы создать три PDF-файла формата A4, и это заняло 577 мсек. Я запустил тот же сценарий, но с заменой tFPDF для замены собственного FPDF, и это заняло колоссальные 43 секунды. Однако файлы были чуть больше половины размера. - person Jon Marnock; 22.12.2020

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

В файле 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.

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

Даан

person Daan    schedule 04.02.2014
comment
Отлично, это все еще работает или необходимо после обновления FPDF до версии, которая поддерживает PHP7 для правильного отображения специальных символов. - person Aren; 09.12.2016
comment
Эта команда работает для меня, $ txt = iconv ('utf-8', 'cp1252', $ txt); Спасибо - person Patrick Arguello; 16.09.2019
comment
Просто потрясающее простое решение. К сожалению, он спрятан в непонятном месте в stackoverflow :) - person Pieter-Jan Casteels; 25.04.2020
comment
Это что-то изменило с моим интервалом - некоторые строки теперь рвутся раньше. Но, по крайней мере, вроде работает - раньше турецкое письмо у меня вообще не работало, теперь, по крайней мере, я кое-что вижу. - person Cold_Class; 13.09.2020

Сначала вам нужно сгенерировать шрифт. Вы должны использовать служебную программу 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);

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

Městečko Fruens Bøge

Датская буква ø становится ř в ISO-8859-2.

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

person Theodor Keinstein    schedule 10.04.2012

Этот ответ не сработал для меня, мне также нужно было запустить html-декодирование в строке. Видеть

iconv('UTF-8', 'windows-1252', html_entity_decode($str));

Реквизиты переходят в emfi из html_entity_decode в FPDF (с использованием расширения tFPDF) < / а>

person Joel Small    schedule 05.11.2013

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

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

person Jon Winstanley    schedule 26.07.2013
comment
Ссылка кажется мертвой - person robsch; 25.04.2018

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

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

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

Вы можете создать класс для расширения 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);

} 

}

person Alejandro Aranda    schedule 07.02.2017

Я хотел ответить на этот вопрос всем, кто не перешел на 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)).

person rozick    schedule 26.10.2017

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

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

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

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

$txt = utf8_decode($txt);

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

person R.Costa    schedule 28.02.2019

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

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

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

Проблема:

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

    Т.е., просто использовать 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

person HoldOffHunger    schedule 03.06.2019

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

Как мне удалось добавить русский язык в 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);
person ryzhak    schedule 26.10.2016

Вместо этого решения iconv:

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

Вы можете использовать следующее:

$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");

См. Как преобразовать символы Windows-1252 в значения в php?

person Theo    schedule 25.07.2018

Существует расширение FPDF под названием UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/

Но, имхо, лучше использовать mpdf, если вы можете изменить класс.

person sr9yar    schedule 05.06.2014

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

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

Спасибо

person gounane    schedule 25.08.2015

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

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

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

person niente1    schedule 11.12.2015

Не уверен, подойдет ли это для греческого языка, но у меня была такая же проблема с бразильскими португальскими символами, и я решил использовать 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

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

person Alexandre Schmidt    schedule 05.02.2016

Я знаю, что это старый вопрос, но я думаю, что мой ответ поможет тем, кто не нашел решения в других ответах. Итак, моя проблема заключалась в том, что я не мог отображать хорватские символы в моем 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();
person NutCracker    schedule 07.05.2016