簡體   English   中英

dompdf 字符編碼 UTF-8

[英]dompdf character encoding UTF-8

我試圖用正確的字符創建pdf,但有“?” 字符。 我創建了一個測試 php 文件,我試圖在其中找到最佳解決方案。 如果我在瀏覽器中打開 html 我看起來沒問題

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

但是當我查看pdf時,我看到了這個

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>

我做錯了什么? 我嘗試了很多我發現的選項:(知道嗎?

您應該再次閱讀Unicode How-to 主要問題是您沒有指定支持您的字符的字體。 看起來您已經閱讀了操作指南,因為您使用的是該文檔中的字體示例。 然而,該示例並不打算全局應用於任何文檔,dompdf 默認不包含螢火蟲(一種漢字字體)或 Verdana。

如果您不指定字體,則 dompdf 將退回到僅支持 Windows ANSI 編碼的核心字體之一(Helvetica、Times Roman、Courier)。 因此,請務必使用支持 Unicode 編碼並具有您需要顯示的字符的字體來設置文本樣式。

使用 dompdf 0.6.0,您可以使用包含的 Deja Vu 字體。 所以以下應該工作(只是HTML):

<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>

我得到了使用這種組合的 UTF-8 字符。 在將 html 傳遞給 DOMpdf 之前,請使用以下代碼進行編碼:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');

在你的 css 中使用 DejaVu 字體

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

確保在 HTML <head>標簽中設置了 utf-8 編碼

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

現在所有特殊字符都可以使用“ľ š č ť ž ý á í é”

只添加

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

之前</head>它對我有用。

utf8_decode() 為我做了一些德語翻譯,比如 ä 和 ü。

echo utf8_decode('X Ponuka číslo € černý Češký <br>');

Dompdf 不支持后備字體,因此如果它不支持您的字符,您就不能使用您喜歡的字體,並且您也不能將其他字體設置為這些字符的后備字體,例如droid sans fallback

您可以做的是利用正則表達式 unicode 腳本范圍: https : //www.regular-expressions.info/unicode.html將這些文本塊包裝到跨度中並為它們提供后備字體。

例子:

$body = 'test 簡化字 彝語/彝語 test číslo € černý Češký';

$cjk_scripts = 'Bopomofo|Han|Hiragana|Katakana';
$cjk_scripts = preg_replace('/[a-zA-Z_]+/', '\\p{$0}', $cjk_scripts);

// wrap the CJK characters into a span with it's own font
$body = preg_replace("/($cjk_scripts)+/isu", '<span class="cjk">$0</span>', $body);

// a font that supports CJK characters
$cjk_font_path = APP_PATH.'/fonts/DroidSansFallbackFull.ttf';

$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
@font-face {
    font-family: 'DroidSansFallbackFull';
    font-style: normal;
    font-weight: 400;
    src: url('$cjk_font_path') format('truetype');
}
body {
    font-family: DejaVu Sans, sans-serif;;
}
.cjk {
    font-family: DroidSansFallbackFull, sans-serif;
}
</style>
</head>
<body>$body</body>
</html>
HTML;

$dompdf = new \DOMPDF();
$dompdf->set_paper('A4');
$dompdf->load_html($html);
$dompdf->render();

$dompdf->stream('test.pdf', ['Attachment'=>0]);

相關: https : //github.com/dompdf/dompdf/issues/1508

提到的答案中沒有任何幫助我。 經過數小時的努力,我切換到niklasravnsborg/laravel-pdf具有幾乎完全相同的語法和用法,並且一切正常。

如果您不介意只有一個字符集,您可以更改dompdf_font_family_cache.dist.php每個字符集

就像

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

我知道這不是最好的方法,但它節省了很多時間

中文字符有時會引起問題。 重要的部分是要有好的字體,這里有一個你可以下載的列表。

我選擇了第一個命名為“Kai Bold Font” 這里是一個下載頁面

然后將它放在您的托管服務上的公共文件夾中。 我把它放進

http://192.168.10.10/fonts/pdf/wts11.ttf

這是我的 html 示例

$html = <<<EOT
<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <style>
    @font-face {
      font-family: chinese;
        src: url('http://192.168.10.10/fonts/pdf/wts11.ttf') format('truetype');
    }
    .chineseLanguage { font-family: chinese; }
      body {font-family: DejaVu Sans, sans-serif;}
   </style>
</head>
<body>
    Chinese
    <div class='chineseLanguage'>
        忠烈祠
        中文 - 這工作<br> 
    </div>
    hello world <br> 
    Russian - русский текст <br>
    Greek - α,β,γ,δ,ε <br>
    chars - !@#$%^&* -=- €   <br><br>
    <br>
    Hebrew (iw)<br><br>
    דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה<br>
    <br>    
</body>
</html>
EOT;

附注。 您可能需要此套裝的可能性很小:

ini_set("allow_url_fopen", true);

我遇到了類似的問題並最終使用了tcpdf 。希望這會有所幫助。 http://www.tcpdf.org/
問題是字型我是using.I能得到使用這種字體“freeserif'.I猜測有可能獲得使用該字體與DOMPDF相同的輸出正確的輸出。

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

這是我使用過的示例。 tcpdf utf-8 示例

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

?>

我遇到了同樣的問題,我很簡單地解決了它。 只需在生成 HTML 時使用的 CSS 文件中導入具有所需語言子集的谷歌字體。 在您的 HTML 文件中指定 utf-8 並且它正在工作...

@import url('https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin-ext');
body {font-family: 'Roboto', sans-serif;}

這里有很多答案,很難找到可靠地提供跨語言支持的答案。 我相信對於我們這些制作分布式軟件的人來說,還有一些服務器設置塊可以阻止某些功能,例如 pdfdom 中的@importsrc:url()自動嵌入字體。

以下解決方案適用於許多服務器和本地托管站點,並且不需要命令行訪問:

  1. 檢索要用作 .ttf 的字體(為了支持包括西里爾文、希臘文、梵文、拉丁文和越南文在內的語言,我們使用了Noto Sans,並選中了所有可選語言)
  2. 運行/內置以下腳本並僅觸發 PDFBuilder_install_font_family() 一次(單一安裝)

PDFBuilder_install_font_family()要點: https : PDFBuilder_install_font_family()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM