Кодування FPDF utf-8 (ЯК ДО)


80

Хтось знає, як встановити кодування в пакеті FPDF на utf-8? Або принаймні до ISO-8859-7 (грецька), що підтримує грецькі символи?

В основному я хочу створити pdf-файл, що містить грецькі символи.

Будь-які пропозиції допомогли б. Джордж


Якщо ви хочете використовувати більше мов, вам потрібен UTF8, тому ви можете використовувати tFPDF. Погляньте на композиторський пакет .
Робш

Відповіді:


116

Не використовуйте кодування 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);


22
Я не думаю, що це допоможе. Ваша відповідь пояснює, як створити PDF із кодуванням ISO-8859-1 або windows-1252, але ці кодування не будуть працювати для нелатинських мов. Не кажучи вже про виведення багатомовних (багатокриптових) текстів.
Томица Кораћ

3
@Rafiq: не використовуйте "старий" FPDF, а новішу версію UTF8 tFPDF, як встановлено у моїй відповіді.
Тарсіс

1
Примітка: При використанні ISO-8859-1 символ € не буде працювати (у коди символів немає знака Євро, замість цього використовуйте ISO-8859-15).
BurninLeo

1
@BurninLeo: ISO-8859-15 не набагато кращий, усі ці кодування мають однакову межу символів, отже -15 має €, але тому відсутня ´ або ½. Єдиним реальним рішенням є використання UTF-8 замість того, щоб уникати цього - як показано у моїй відповіді.
Тарсіс

3
tFPDF підтримує unicode, але він не оновлювався впродовж 3 років, де, оскільки FPDF оновлювався нещодавно, роблячи tFPDF застарілим. Будь ласка, майте це на увазі, використовуючи tFPDF.
Агіліс

38

Існує також офіційна версія 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/


1
Жодне з рішень iconv та декодування не працює для більш виняткових символів (♠ ♥ ☺äκόσμος). Але якщо ви просто заміните файл fpdf.php на файл tpdf.php, він все просто почне працювати, і ваші файли стануть меншими як додатковий бонус. Чудове виправлення.
Себастьян

1
Чи є FPDF та tFPDF окремими гілками? Хтось знає причину, чому tFPDF так добре прихований на сторінці FPDF? Чи є якісь недоліки, про які слід знати перед переходом?
BurninLeo

1
Я впевнений, чому вони не зробили його версією FPDF за замовчуванням, але вона пов’язана безпосередньо на головній сторінці fpdf.org, і, як там уже згадувалось, функції tFPDF спочатку були розроблені для mPDF. Я використовував tFPDF для багатьох PDF-файлів у виробничому середовищі, і я думаю, що окрім UTF-8 та змін шрифтів це на 100% однаково. Ніколи не мав жодних проблем.
Тарсіс

1
tFPDF - це сценарій або розширення FPDF. Він вважається застарілим (оновлено 3 роки тому), оскільки FPDF оновлено нещодавно. Автор tFPDF не підтримує його підтримку, і GitHub, пов’язаний з tFPDF, не торкався. Див: github.com/rev42/tfpdf
Agilis

Поки вам не потрібно більше функцій, я не бачу проблеми в цьому, до речі, останнє (незначне) оновлення було лише 4 місяці тому - все-таки краще, ніж не підтримувати UTF-8. У будь-якому випадку я б віддав перевагу TCPDF або mPDF, які обидва базуються на FPDF, але надають розширені функції, а також підтримують HTML-код.
Тарсіс

28

існує справді просте рішення цієї проблеми.

У файлі 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.

Сподіваюся, вищесказане було корисним.

Даан


Ідеально, це все ще працює або потрібно після оновлення FPDF до версії, яка підтримує PHP7 для коректного відображення спеціальних символів.
Арен

1
Ця команда працює для мене, $ txt = iconv ('utf-8', 'cp1252', $ txt); Thks
Patrick Arguello

Просто дивовижне рішення Simpel. Сумно, він схований у незрозумілому місці на stackoverflow :)
Пітер-Ян Кастельс,

Це щось змінило з моїм інтервалом - деякі рядки ламаються раніше. Але, принаймні, це спрацьовує - раніше турецький лист для мене взагалі не працював, зараз я принаймні щось бачу.
Cold_Class

9

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




4

Жодне з наведених вище рішень не спрацює.

Спробуйте це:

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

4

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

Я хотів відповісти на це всім, хто не перейшов на 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)).


4

просто відредагуйте комірку функції у файлі fpdf.php, знайдіть рядок, який виглядає так

function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{ 

після знаходження рядка

написати після {,

$txt = utf8_decode($txt);

збережіть файл і готово, акценти та кодування utf8 будуть працювати :)


3

Як створити PDF-файли у FPDF, що підтримують китайську, японську, російську тощо?

(знімки коду, що використовуються нижче)

Я хотів би надати: короткий опис проблеми, рішення, проект github з робочим кодом та приклад в Інтернеті з очікуваним результативним PDF-файлом.

Проблема :

  1. Як заявив Тарсіс, поміняйте FPDF на TFPDF.
  2. Насправді вам потрібен шрифт, який підтримує символи 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

Робоча, онлайн-демонстрація японської мови:

https://www.earthfluent.com/privacy.pdf?language=ja


1

Для нащадків.

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



0

Ви можете застосувати цю функцію до тексту:

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

Дякую


0

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

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

Таким чином, символи з наголосом правильно додаються до мого PDF-файлу, не питайте мене чому, але це працює.


0

Не впевнений, що це буде стосуватися грецької мови, але у мене була така сама проблема з португальськими символами Бразилії, і моє рішення полягало у використанні 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

Сподіваюся, що це допомагає.


0

Я знаю, що це питання застаріле, але я думаю, що моя відповідь допоможе тим, хто не знайшов рішення в інших відповідях. Отже, моя проблема полягала в тому, що я не міг відображати хорватські символи у своєму 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.