2013-05-05 13 views
7

मैं सही वर्णों के साथ पीडीएफ बनाने की कोशिश कर रहा हूं, लेकिन "?" वर्ण। मैंने एक परीक्षण php फ़ाइल बनाई, जहां मैं सबसे अच्छा समाधान छूने की कोशिश कर रहा हूं। इम खुला ब्राउज़र में एचटीएमएल मैं की तरह ठीकdompdf वर्ण एन्कोडिंग यूटीएफ -8

UTF-8 --> UTF-8 : X Ponuka číslo € černý Češký 

लग रहा है लेकिन जब मैं पीडीएफ में देखो मैं देख रहा हूँ अगर यह

UTF-8 --> UTF-8 : X Ponuka ?íslo € ?erný ?ešký 

यहाँ मेरी सभी कोड है:

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title>č s š Š</title> 
</head> 
<body> 
<?php 

require_once("dompdf/dompdf_config.inc.php"); 
$tab = array("UTF-8", "ASCII", "Windows-1250", "ISO-8859-2", "ISO-8859-1", "ISO-8859-6", "CP1256"); 
$chain = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style></style><title>č s š Š</title></head><body>'; 
foreach ($tab as $i) 
    { 
     foreach ($tab as $j) 
     { 
      $chain .= "<br> $i --> $j : ".iconv($i, $j, 'X Ponuka číslo € černý Češký <br>'); 
     } 
    } 
$chain .= '<p style="font-family: firefly, verdana, sans-serif;">??????X Ponuka číslo € černý Češký <br></p></body></html>'; 
echo $chain; 
echo 'X Ponuka číslo € černý Češký <br>'; 

$filename = 'pdf/_1.pdf'; 
$dompdf = new DOMPDF(); 
$dompdf->load_html($chain, 'UTF-8'); 
$dompdf->set_paper('a4', 'portrait'); // change these if you need to 
$dompdf->render(); 
file_put_contents($filename, $dompdf->output()); 

?> 
</body> 
</html> 

क्या मैं गलत कर रहा हूँ? मैंने कई विकल्पों को आजमाया जो मैंने पाया :(कोई विचार?

+0

अधिकतर लाइब्रेरी आपको एक अलग एन्कोडिंग में डेटा लोड करने की अनुमति नहीं देते हैं, जिसे आप स्पष्ट रूप से लाइब्रेरी लोड करने के लिए बताते हैं। इसके बाद अक्सर प्रश्न चिह्नों में परिणाम मिलता है। तो मुझे सच में आश्चर्य है कि आप वास्तव में क्यों सोचते हैं कि डीओएमपीडीएफ के साथ यह अलग होना चाहिए? इसके अलावा बस सभी विकल्पों के माध्यम से कोशिश करना ठीक खेलना ठीक हो सकता है, लेकिन यदि वह खेल किसी भी परिणाम को त्वरित नहीं देता है, तो आपको यह समझने के लिए एक अलग रणनीति मिलनी होगी कि क्या हो रहा है। – hakre

+0

मैंने कई विकल्प बनाए, क्योंकि यह पता लगाना मुश्किल था कि यह कैसे काम करता है, वर्णमाला आईएसओ -885 9 -2 इसके बारे में कोई उपयोगी जानकारी नहीं है, मैंने बहुत गुमराह किया, और मैं यूटीएफ -8 चाहता था, जहां हर चार ठीक है ! – lostika

+1

हां, यूटीएफ -8 एक अच्छा विकल्प है यदि आप सभी (कंप्यूटर सिस्टम) ज्ञात पात्रों का समर्थन करना चाहते हैं। हालांकि उपरोक्त आपके कोड में, आप * समान * स्ट्रिंग में एकाधिक एन्कोडिंग करते हैं। वह कभी भी अच्छी तरह से काम नहीं कर सकता है। इसके बजाए यह पता लगाना बेहतर होगा कि मूल रूप से आपके तारों को कौन से एन्कोडिंग कर रहे हैं। और फिर विशिष्ट एन्कोडिंग के साथ यूटीएफ -8 में परिवर्तित करें। आपको केवल एक ही पुन: एन्कोडिंग करना चाहिए। यह उत्तर आपके लिए भी समेकित हो सकता है: http://stackoverflow.com/a/5159071/367456 – hakre

उत्तर

25

आपको Unicode How-to पर फिर से पढ़ना चाहिए। मुख्य समस्या यह है कि आप अपने पात्रों का समर्थन करने वाले फ़ॉन्ट को निर्दिष्ट नहीं करते हैं। ऐसा लगता है कि आपने पढ़ा है कैसे करें, क्योंकि आप उस दस्तावेज़ से फ़ॉन्ट उदाहरण का उपयोग कर रहे हैं। हालांकि उदाहरण किसी भी दस्तावेज़ में वैश्विक रूप से लागू करने के लिए नहीं था, dompdf में फ़ायरफ़्लाय (एक चीनी वर्ण फ़ॉन्ट) या वर्डाना डिफ़ॉल्ट रूप से शामिल नहीं है।

यदि आप फ़ॉन्ट निर्दिष्ट नहीं करते हैं तो dompdf कोर फोंट (हेल्वैटिका, टाइम्स रोमन, कूरियर) में से एक पर वापस आ जाता है जो केवल विंडोज एएनएसआई एन्कोडिंग का समर्थन करता है। इसलिए हमेशा अपने टेक्स्ट को यूनिकोड एन्कोडिंग का समर्थन करने वाले फ़ॉन्ट के साथ स्टाइल करना सुनिश्चित करें और इसमें वर्ण जिन्हें आपको प्रदर्शित करने की आवश्यकता है।

dompdf 0.6.0 के साथ आप शामिल डीजा वू फ़ॉन्ट्स का उपयोग कर सकते हैं। तो काम करना चाहिए (बस एचटीएमएल) निम्नलिखित:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
<style> 
    body { font-family: DejaVu Sans, sans-serif; } 
</style> 
<title>č s š Š</title> 
</head> 
<body> 
    <p>??????X Ponuka číslo € černý Češký <br></p> 
</body> 
</html> 
+0

काम नहीं किया - € साइन इन सृजन में खो गया है। –

+0

dompdf का कौन सा संस्करण? DejaVu फोंट केवल 0.6.x के साथ शुरू किया गया था। इसके अलावा, कई चीजें आउटपुट को प्रभावित कर सकती हैं। उदाहरण के लिए, आपका दस्तावेज़ वास्तव में यूटीएफ -8 के रूप में एन्कोड किया जाना चाहिए और साथ ही हेडर में एन्कोडिंग निर्दिष्ट करना चाहिए। – BrianS

+0

संस्करण 0.6.1 '<मेटा http-equiv =" सामग्री-प्रकार "सामग्री =" टेक्स्ट/एचटीएमएल; वर्णसेट = utf-8 "/>' और फ़ॉन्ट सीएसएस और बॉडी टैग के साथ सेट किया गया था: 'font-family: हेल्वेटिका, "टाइम्स न्यू रोमन", सेरिफ़; ' –

-1

मैं इसी तरह की समस्या थी और tcpdf आशा है का उपयोग करते हुए यह सहायक हो सकता है समाप्त हो गया। http://www.tcpdf.org/
समस्या का उपयोग मैं कर रहा था। मैं इस फ़ॉन्ट 'freeserif' का उपयोग कर सही आउटपुट प्राप्त करने में सक्षम था। मुझे लगता है कि dompdf के साथ इस फ़ॉन्ट का उपयोग करके एक ही आउटपुट प्राप्त करना संभव हो सकता है।

$pdf->SetFont('freeserif', '', 12); 

यहां नमूना है जिसका मैंने उपयोग किया है। tcpdf utf-8 sample

<?php 
header('Content-type: text/html; charset=UTF-8') ;//chrome 
require_once('tcpdf_include.php'); 

// create new PDF document 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 

$pdf->setFontSubsetting(true); 

$pdf->SetFont('freeserif', '', 12); 

$pdf->AddPage(); 

$utf8text = ' 
<html><head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body> 
<b>Ponuka číslo € černý Češký </b></br> 
සිංහල </br> 
<u>தேமல </u> </br> 
</body></html>'; 

$pdf->SetTextColor(0, 63, 127); 

$pdf->writeHTML($utf8text, true, 0, true, true); 

$pdf->Output('example_008.pdf', 'I'); 

?> 
20

मैं UTF-8 इस संयोजन के साथ काम कर पात्रों मिला है।

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'); 
अपने सीएसएस में

उपयोग DejaVu फ़ॉन्ट

*{ font-family: DejaVu Sans; font-size: 12px;} 

HTML में सुनिश्चित करें कि आप निर्धारित किया है UTF-8 एन्कोडिंग बनाओ <head> टैग

: इससे पहले कि आप DOMpdf को एचटीएमएल गुजरती हैं, इस के साथ गुप्त एन्कोडिंग बनाने
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

अब सभी विशेष पात्र काम कर रहे हैं "ľ š č ť ž ý í í é é"

+0

मेरे लिए '<मेटा http-equiv =" सामग्री-प्रकार "सामग्री =" टेक्स्ट/एचटीएमएल; charset = utf-8 "/>' –

4

केवल जोड़े

<style> 
    *{ font-family: DejaVu Sans !important;} 
    </style> 

</head> से पहले यह मेरे लिए काम कर रहा है।

+0

काम करता है, इसके अलावा SET def ("DOMPDF_ENABLE_HTML5PARSER", false); से डीफ़ ("DOMPDF_ENABLE_HTML5PARSER", सत्य); Dompdf_config.inc.php फ़ाइल में । –

0

कुछ भी उल्लेख किए गए उत्तरों में मेरी मदद नहीं की। घंटों के संघर्ष के बाद मैंने niklasravnsborg/laravel-pdf पर स्विच किया, लगभग बिल्कुल समान वाक्यविन्यास और उपयोग है, और सबकुछ ठीक से काम कर रहा है।

0

आप होने के लिए केवल एक चारसेट आप जैसे

<?php 
$distFontDir = $rootDir . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'fonts' . DIRECTORY_SEPARATOR; 
return array(
    'sans-serif' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'times' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'times-roman' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'courier' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'helvetica' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'zapfdingbats' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'symbol' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'serif' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'monospace' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'fixed' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'dejavu sans' => 
    array(
     'bold' => $distFontDir . 'DejaVuSans-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSans-Oblique', 
     'normal' => $distFontDir . 'DejaVuSans' 
    ), 
    'dejavu sans mono' => 
    array(
     'bold' => $distFontDir . 'DejaVuSansMono-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSansMono-BoldOblique', 
     'italic' => $distFontDir . 'DejaVuSansMono-Oblique', 
     'normal' => $distFontDir . 'DejaVuSansMono' 
    ), 
    'dejavu serif' => 
    array(
     'bold' => $distFontDir . 'DejaVuSerif-Bold', 
     'bold_italic' => $distFontDir . 'DejaVuSerif-BoldItalic', 
     'italic' => $distFontDir . 'DejaVuSerif-Italic', 
     'normal' => $distFontDir . 'DejaVuSerif' 
    ) 
) 
?> 

dompdf_font_family_cache.dist.php

में हर चारसेट बदल सकते हैं मैं जानता हूँ कि यह सबसे अच्छा तरीका नहीं है कोई आपत्ति नहीं है, लेकिन यह समय

की बहुत बचत होती है
संबंधित मुद्दे