FPDF utf-8 एन्कोडिंग (HOW-TO)


80

किसी को भी कैसे utf-8 करने के लिए FPDF पैकेज में एन्कोडिंग सेट करने के लिए पता है? या कम से कम ISO-8859-7 (ग्रीक) जो ग्रीक वर्णों का समर्थन करते हैं?

मूल रूप से मैं एक पीडीएफ फाइल बनाना चाहता हूं जिसमें ग्रीक अक्षर हों।

किसी भी सुझाव से मदद मिलेगी। जॉर्ज


यदि आप अधिक भाषाओं का उपयोग करना चाहते हैं, तो आपको UTF8 की आवश्यकता होती है, इसलिए आप tFPDF का उपयोग कर सकते हैं। पर एक नज़र डालें संगीतकार पैकेज
रॉब्सच

जवाबों:


116

UTF-8 एन्कोडिंग का उपयोग न करें। मानक FPDF फोंट ISO-8859-1 या Windows-1252 का उपयोग करते हैं। ISO-8859-1 के साथ रूपांतरण करना संभव है utf8_decode(): $str = utf8_decode($str); लेकिन यूरो जैसे कुछ वर्णों का सही अनुवाद नहीं किया जाएगा। यदि आइकॉन एक्सटेंशन उपलब्ध है, तो इसे करने का सही तरीका निम्नलिखित है: $str = iconv('UTF-8', 'windows-1252', $str);


22
मुझे नहीं लगता कि इससे मदद मिलेगी। आपका उत्तर बताता है कि ISO-8859-1 या windows-1252 एन्कोडिंग के साथ एक पीडीएफ कैसे बनाया जाए, लेकिन ये एनकोडिंग गैर-लैटिन भाषाओं के लिए काम नहीं करेगी। बहु-भाषा (बहु-लिपि) ग्रंथों के आउटपुट का उल्लेख नहीं है।
Томица Кораћ

3
@Rafiq: मेरे उत्तर में "पुराने" FPDF का उपयोग न करें लेकिन नए UTF8 संस्करण tFPDF के रूप में है।
तारिष

1
नोट: ISO-8859-1 का उपयोग करते समय, € वर्ण काम नहीं करेगा (चार्ट में कोई यूरो चिह्न नहीं है, इसके बजाय ISO-8859-15 का उपयोग करें)।
बर्निनलियो

1
@BurninLeo: ISO-8859-15 बहुत बेहतर नहीं है, उन सभी एनकोडिंग में वर्ण की समान सीमा है, इसलिए -15 में € है, लेकिन इसलिए ´ या missing गायब है। एकमात्र वास्तविक समाधान यह है कि इसे टालने के बजाय UTF-8 का उपयोग किया जाए - जैसा कि मेरे उत्तर में दिखाया गया है।
तारिस

3
tFPDF यूनिकोड का समर्थन करता है, लेकिन इसे 3 वर्षों में अद्यतन नहीं किया गया है, जहाँ FPDF को हाल ही में अद्यतन किया गया है जिससे tFPDF पुराना हो गया है। कृपया ध्यान रखें कि tFPDF का उपयोग करते समय।
एजिलिस

38

FPDF का एक आधिकारिक UTF-8 संस्करण भी है जिसे tFPDF http://www.fpdf.org/en/script/script92.php कहा जाता है

आप मूल FPDF से आसानी से स्विच कर सकते हैं, बस सुनिश्चित करें कि आप एक यूनिकोड फ़ॉन्ट का उपयोग भी करते हैं जैसा कि ऊपर दिए गए लिंक या मेरे कोड में उदाहरण में दिखाया गया है:

<?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_d timecode () हर जगह और .Fff फ़ाइलों में सीधे .ttf फ़ाइलों का उपयोग करने की क्षमता के बजाय इसका उपयोग करने के लिए बहुत अधिक सुरुचिपूर्ण है।

किसी भी अन्य उत्तर में समस्या से बचने या काम करने का एक तरीका है, और UTF-8 से बचना अप-टू-डेट प्रोजेक्ट के लिए कोई वास्तविक विकल्प नहीं है।

एमपीडीएफ या टीसीपीडीएफ (और अन्य) जैसे विकल्प भी हैं जो एफपीडीएफ पर आधारित हैं, लेकिन उन्नत कार्यों की पेशकश करते हैं, यूटीएफ -8 समर्थन करते हैं और HTML कोड की व्याख्या कर सकते हैं (बेशक सीमित नहीं है क्योंकि HTML को पीडीएफ में बदलने का कोई सीधा तरीका नहीं है)। अधिकांश FPDF कोड का उपयोग उन लाइब्रेरी में सीधे किया जा सकता है, इसलिए कोड को स्थानांतरित करना बहुत आसान है।

https://github.com/mpdf/mpdf http://www.tcpdf.org/


1
अधिक असाधारण पात्रों (None ♥ ςä iconμος) के लिए कोई भी आइकनव और डिकोड समाधान काम नहीं करता है। लेकिन अगर आप अपने fpdf.php को tpdf.php फ़ाइल से बदल देते हैं, तो यह सब बस काम करना शुरू कर देता है और आपकी फाइलें अतिरिक्त बोनस के रूप में छोटी हो जाती हैं। महान तय।
सेबेस्टियन

1
क्या FPDF और tFPDF अलग-अलग शाखाएँ हैं? क्या किसी को इसका कारण पता है कि FPDF पेज पर tFPDF इतनी अच्छी तरह से क्यों छिपा हुआ है? क्या कोई कमियां हैं, जिन्हें स्विच करने से पहले पता होना चाहिए?
बर्निनलियो

1
मुझे यकीन है कि क्यों वे इसे डिफ़ॉल्ट FPDF संस्करण नहीं बनाते हैं, लेकिन यह सीधे मुख्य पृष्ठ fpdf.org से जुड़ा हुआ है और जैसा कि उल्लेख किया गया है कि tFPDF की विशेषताएं मूल रूप से mPDF के लिए विकसित की गई थीं। मैंने एक उत्पादक वातावरण में बहुत सारे PDF के लिए tFPDF का उपयोग किया है और मुझे लगता है कि इसके अलावा UTF-8 और फ़ॉन्ट परिवर्तन 100% समान हैं। कभी कोई मुद्दा नहीं था।
टारिस

1
tFPDF एक स्क्रिप्ट, या FPDF का विस्तार है। इसे पुराना माना जाता है (3 साल पहले अपडेट किया गया) क्योंकि FPDF को हाल ही में अपडेट किया गया है। TFPDF के लेखक इसे बनाए नहीं रखते हैं और tFPDF से जुड़े GitHub को छुआ नहीं गया है। देखें: github.com/rev42/tfpdf
Agilis

जब तक आपको और अधिक कार्यों की आवश्यकता नहीं होती है, तब तक मुझे इसमें कोई समस्या नहीं दिखती है, अंतिम (मामूली) को अपडेट करें 4 महीने पहले ही अपडेट किया गया था - फिर भी UTF-8 का समर्थन नहीं करने से बेहतर है। किसी भी तरह से मैं TCPDF या mPDF को प्राथमिकता दूंगा, जो दोनों FPDF को आधार बनाते हैं लेकिन उन्नत कार्य देते हैं और HTML कोड भी।
तारिस्स

28

इस समस्या का एक बहुत ही सरल समाधान है।

फ़ाइल में 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 के बीच डैश डालना भूल गया था।

आशा है कि ऊपर सहायक था।

दान


बिल्कुल सही, यह अभी भी काम कर रहा है या एफपीडीएफ को एक संस्करण में अपडेट करने के बाद आवश्यक है जो विशेष वर्णों को सही ढंग से दिखाने के लिए PHP7 का समर्थन करता है।
अर्नन

1
मेरे लिए यह कमांड काम, $ txt = iconv ('utf-8', 'cp1252', $ txt); Thks
पैट्रिक Arguello

बस अद्भुत simpel समाधान। दुःख की बात यह है कि स्टैकओवरफ्लो पर एक अस्पष्ट जगह से दूर चला जाता है :)
पीटर-जन कास्टेल्स

इसने मेरी रिक्ति के साथ कुछ बदल दिया - कुछ लाइनें अब पहले टूट गईं। लेकिन कम से कम यह काम करने लगता है - इससे पहले कि तुर्की पत्र मेरे लिए बिल्कुल काम नहीं करता था, अब कम से कम मुझे कुछ दिखाई देता है।
कोल्ड_क्लास

9

आपको पहले एक फॉन्ट जनरेट करना होगा। आपको MakeFontFPDF पैकेज के भीतर शामिल उपयोगिता का उपयोग करना चाहिए । मैंने लिनक्स पर डेमो से थोड़ी विस्तारित स्क्रिप्ट का उपयोग किया:

<?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);

(मैं एक मेज पर काम कर रहा था।) जो मेरी भाषा के लिए काम करता था ( बुक्का जेडना सेल फॉर सेल एक है )। चेक भाषा केंद्रीय यूरोपीय भाषाओं से संबंधित है, ISO-8859-2 भी। अफसोस की बात है कि FPDF का उपयोगकर्ता UTF-8 एन्कोडिंग के खोए हुए लाभों के लिए मजबूर है। आप इसे अपने पीडीएफ में नहीं पा सकते हैं:

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

.ttfजिस भाषा का आप उपयोग करना चाहते हैं, उसके लिए एक संगत फ़ॉन्ट का उपयोग करें। एन्कोडिंग नंबर चुनना सुनिश्चित करें जो आपकी भाषा के लिए सही है। फ़ाइलों को डाउनलोड करें और उन्हें अपने वर्तमान FPDF फ़ॉन्ट निर्देशिका में पेस्ट करें।

नए फ़ॉन्ट को सक्रिय करने के लिए इसका उपयोग करें: $pdf->AddFont($font_name,'','Your_Font_Here.php');

तब आप $pdf->SetFontसामान्य रूप से उपयोग कर सकते हैं ।

फ़ॉन्ट पर, UTF-8 में कनवर्ट करने के लिए iconv का उपयोग करें। इसलिए यदि उदाहरण के लिए आप हिब्रू का उपयोग कर रहे हैं, तो आप करेंगे iconv('UTF-8', 'windows-1255', $first_name)

अपनी भाषा एन्कोडिंग के लिए विंडोज़ एन्कोडिंग संख्या को प्रतिस्थापित करें।

दाएं से बाएं के लिए, एक त्वरित फिक्स कुछ ऐसा कर रहा है 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

मैं एफपीडीएफ में पीडीएफ कैसे बनाऊं जो चीनी, जापानी, रूसी आदि का समर्थन करते हैं?

(नीचे उपयोग में कोड का स्नैपशॉट)

मैं प्रदान करना चाहूंगा: समस्या का एक सारांश, समाधान, काम करने वाले कोड के साथ एक गीथब प्रोजेक्ट, और अपेक्षित, परिणामी पीडीएफ के साथ एक ऑनलाइन उदाहरण।

समस्या :

  1. Tarsis द्वारा कहा गया है, TFPDF को FPDF स्वैप करें।
  2. आपको वास्तव में एक फ़ॉन्ट की आवश्यकता है जो UTF-8 वर्णों का समर्थन करता है।

    IE, केवल हेल्वेटिका का उपयोग करने और जापानी प्रदर्शित करने की कोशिश करने से काम नहीं चलेगा। यदि आप फ़ॉन्ट फोर्ज, या कुछ अन्य फ़ॉन्ट टूल का उपयोग करते हैं, तो आप फ़ॉन्ट के चीनी अक्षरों को स्क्रॉल कर सकते हैं, और देख सकते हैं कि वे रिक्त हैं।

    Google में एक फ़ॉन्ट ( Noto फ़ॉन्ट ) है जिसमें सभी भाषाएँ हैं, और यह 20mb है, जो आमतौर पर आपके पाठ के आकार के कई कारक हैं। तो, आप देख सकते हैं कि क्यों कई फोंट बस हर एक भाषा को कवर नहीं करेंगे।

समाधान :

मैं जापानी और चीनी के लिए राउंड-मगनप्लस-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 में रूसी भाषा जोड़ने में कैसे कामयाब रहा:

1) http://www.fpdf.org/makefont/ पर जाएं और अपने ttf फ़ॉन्ट (उदाहरण के लिए AerialRegular.ttf) को ISO-8859-5 एन्कोडिंग का उपयोग करके 2 फाइलों में परिवर्तित करें : AerialRegular.php और AerialRegular.z

2) इन 2 फाइलों को fpdf / font directory में रखें

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

मैं ASP के लिए FPDF का उपयोग करता हूं, और iconv फ़ंक्शन उपलब्ध नहीं है। यह अजीब लगता है, जब तक मैंने AddPage () फ़ंक्शन के बाद, एक नकली छवि (1x1px जेपीईजी) पीडीएफ में जोड़कर UTF-8 समस्या को हल किया :

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

इस तरह, मेरे पीडीएफ में उच्चारण वर्णों को सही ढंग से जोड़ा गया है, मुझसे यह न पूछें कि यह क्यों काम करता है।


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

मुझे पता है कि यह प्रश्न पुराना है, लेकिन मुझे लगता है कि मेरा उत्तर उन लोगों की मदद करेगा, जिन्होंने अन्य उत्तरों में समाधान नहीं पाया है। इसलिए, मेरी समस्या यह थी कि मैं अपने पीडीएफ में मैंडर्स यहूदियों को प्रदर्शित नहीं कर सकता था। सबसे पहले, मैंने FPDF का उपयोग किया लेकिन, मुझे लगता है, यह यूनिकोड का समर्थन नहीं करता है। अंत में, मेरी समस्या का हल tFPDF है जो FPDF का संस्करण है जो यूनिकोड का समर्थन करता है। यह मेरे लिए काम करने वाला उदाहरण है:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.