16 ответов:
не используйте кодировку 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);
существует также официальная версия 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 может использоваться непосредственно в этих библиотеках, поэтому его довольно легко перенести код.
есть очень простое решение этой проблемы.
в файле 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С той же целевой кодировкой, с которой был создан шрифт.
этот ответ не сработал для меня, мне также нужно было запустить 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-сущностей. У меня было в основном два случая:
- строка мая содержат UTF-8 символов.
для них я сначала закодировал его в HTML-объекты с помощью
htmlentities()а потом расшифровал их доiso-8859-1. Пример:$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
- исправлена строка с HTML сущностями:
для этих, Я только что ушел
htmlentities()звонок. Пример:$s = html_entity_decode("Treasurer/Tré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?
Comments