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

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

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

любые предложения помочь. Джордж!--1-->

16 ответов


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


существует также официальная версия UTF-8 FPDF под названием 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/


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

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

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

Даан


сначала вам нужно создать шрифт. Вы должны использовать 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 чешский для мобильник). Чешский язык принадлежит к центральноевропейским языкам, также Стандарт ISO-8859-2. К сожалению, пользователь FPDF вынужден потерять преимущества кодирования UTF-8. Вы не можете получить это в своем PDF:

Městečko Fruens Bøge

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

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


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

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


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

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

реквизит перейти к emfi от html_entity_decode в FPDF (используя расширение tFPDF)


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

} 

}


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

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

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

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


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

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

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

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


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

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

спасибо


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

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

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


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

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


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

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

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

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

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

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