Кодировка FPDF utf-8 (HOW-TO) - PullRequest
       66

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

70 голосов
/ 13 июня 2011

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

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

Ответы [ 18 ]

100 голосов
/ 30 января 2012

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

32 голосов
/ 03 февраля 2014

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

17 голосов
/ 04 февраля 2014

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

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

if($txt!=='')
{

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

$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.

Надеюсь, вышесказанное было полезно.

Даан

9 голосов
/ 10 апреля 2012

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

4 голосов
/ 25 марта 2016

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

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

function filter_html($value){
    $value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
    return $value;
}
4 голосов
/ 07 февраля 2017

Вы можете создать класс для расширения 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 голосов
/ 05 ноября 2013

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

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

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

4 голосов
/ 26 июля 2013

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

3 голосов
/ 26 октября 2017

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

Перейти к: 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)).

1 голос
/ 03 июня 2019

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

image

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

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

Проблема:

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

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

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

Решение:

Я использую округлыеПакеты шрифтов 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

...