Кто-нибудь знает, как установить кодировку в пакете FPDF на UTF-8? Или хотя бы ISO-8859-7 (греческий), который поддерживает греческие символы?
В основном я хочу создать файл PDF, содержащий греческие символы.
Любые предложения помогут. Джордж
Кто-нибудь знает, как установить кодировку в пакете FPDF на UTF-8? Или хотя бы ISO-8859-7 (греческий), который поддерживает греческие символы?
В основном я хочу создать файл PDF, содержащий греческие символы.
Любые предложения помогут. Джордж
Не используйте кодировку 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);
Также существует официальная версия 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/
есть действительно простое решение этой проблемы.
В файле 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.
Надеюсь, это было полезно.
Даан
Сначала вам нужно сгенерировать шрифт. Вы должны использовать служебную программу 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
с той же целевой кодировкой, что и шрифт, сгенерированный.
Этот ответ не сработал для меня, мне также нужно было запустить html-декодирование в строке. Видеть
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
Реквизиты переходят в emfi из html_entity_decode в FPDF (с использованием расширения tFPDF) < / а>
Существует расширение FPDF, называемое mPDF, которое позволяет использовать шрифты Unicode.
http://www.mpdf1.com/mpdf/index.php
Ни одно из вышеперечисленных решений не сработает.
Попробуй это:
function filter_html($value){
$value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
return $value;
}
Вы можете создать класс для расширения 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);
}
}
Я хотел ответить на этот вопрос всем, кто не перешел на 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.php, найдите строку, которая выглядит так
function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{
после нахождения линии
пишите после {
,
$txt = utf8_decode($txt);
сохраните файл и готово, акценты и кодировка utf8 будут работать :)
Как создать PDF-файлы в FPDF, поддерживающие китайский, японский, русский и т. д.?
(снимки используемого кода ниже)
Я хотел бы предоставить: краткое изложение проблемы, решение, проект github с рабочим кодом и онлайн-пример с ожидаемым, результирующим PDF-файлом.
Проблема:
Вам действительно нужен шрифт, поддерживающий символы 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
Для потомков.
Как мне удалось добавить русский язык в 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);
Вместо этого решения iconv:
$str = iconv('UTF-8', 'windows-1252', $str);
Вы можете использовать следующее:
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
См. Как преобразовать символы Windows-1252 в значения в php?
Существует расширение 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-сущности. У меня было в основном два случая:
Для этого я сначала закодировал его в html-объекты с помощью htmlentities()
, а затем декодировал их в iso-8859-1
. Пример:
$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
Для них я просто оставил 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();