Хтось знає, як встановити кодування в пакеті 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);
Існує також офіційна версія 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 jednaka jedna є чеською мовою для Cell Cell ). Чеська мова належить до центральноєвропейських мов, також ISO-8859-2. На жаль, користувач FPDF змушений втратити переваги кодування UTF-8. Ви не можете отримати це у своєму PDF-файлі:
Městečko Fruens Bøge
Датський лист ø
переходить ř
у ISO-8859-2.
Пропозиція рішення: Вам потрібно отримати грецький шрифт, сформувати шрифт, використовуючи належне кодування (ISO-8859-7), і використовувати iconv
з тим самим цільовим кодуванням, що і шрифт, з яким створено шрифт.
Існує розширення FPDF, яке називається mPDF, що дозволяє шрифти Unicode.
Ця відповідь не спрацювала для мене, мені також потрібно було запустити html декодування на рядку. Подивитися
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
Реквізит переходить до emfi з html_entity_decode у FPDF (з використанням розширення tFPDF)
Жодне з наведених вище рішень не спрацює.
Спробуйте це:
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
Використовуйте a .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 Мб, що, як правило, залежить від розміру тексту. Отже, ви можете зрозуміти, чому багато шрифти просто не охоплюють кожну мову.
Рішення :
Я використовую пакети шрифтів rounded-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
Робоча, онлайн-демонстрація японської мови:
Для нащадків.
Як мені вдалося додати російську мову до 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, якщо це можливо, вам можна змінити клас.
Я використовую FPDF для ASP, а функція iconv недоступна. Це здається дивним, оскільки я вирішив проблему UTF-8, додавши в PDF підроблене зображення (jpeg у форматі 1x1px), відразу після функції 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();