2011-06-13 261 views
63

有誰知道如何將FPDF包中的編碼設置爲utf-8?或者至少支持希臘字符的ISO-8859-7(希臘語)?FPDF UTF-8編碼(如何)

基本上我想創建一個包含希臘字符的pdf文件。

任何建議都會有幫助。 George

回答

87

請勿使用UTF-8編碼。標準FPDF字體使用ISO-8859-1或Windows-1252。可以使用utf8_decode()執行到ISO-8859-1的轉換: $str = utf8_decode($str); 但是一些字符(如歐元)將無法正確翻譯。如果iconv擴展名可用,則正確的方法如下: $str = iconv('UTF-8', 'windows-1252', $str);

+0

謝謝,捷克和德國符號效果很好! – mrohnstock 2012-04-27 08:23:11

+0

在哪裏可以放置UTF-8在fpdf,可以打印阿爾比奇文本 – SAR 2014-10-12 06:40:37

+11

我不認爲這會有所幫助。您的答案確實解釋瞭如何使用ISO-8859-1或windows-1252編碼生成PDF,但這些編碼不適用於非拉丁語言。更不用說輸出多語言(多腳本)文本。 – 2015-02-17 12:25:27

9

您需要先生成一個字體。您必須使用FPDF軟件包中包含的MakeFont實用程序。我在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ňkajedna是捷克語單元格)。捷克語屬於中歐語言,也是ISO-8859-2。令人遺憾的是,FPDF的用戶被迫失去了UTF-8編碼的優勢。你不能在你的PDF得到這樣的:

Městečko Fruens Bøge 

丹麥信01​​在ISO-8859-2變得ř

的解決方案建議:您需要獲得希臘字體,使用正確的編碼(ISO-8859-7)產生的字體和使用iconv具有相同的目標編碼的字體已經與生成的一個。

4

這個答案並沒有爲我工作,我需要在弦上運行HTML解碼也。見

iconv('UTF-8', 'windows-1252', html_entity_decode($str)); 

道具去從html_entity_decode in FPDF(using tFPDF extention)

+0

謝謝!這也適用於我。 – 2016-06-14 22:03:58

25

到EMFI還有就是FPDF的官方UTF-8版本,稱爲tFPDF http://www.fpdf.org/en/script/script92.php

您可以從原來的FPDF easyly開關,只要確保你也使用一個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(),直接在AddFont()中使用.ttf文件的能力也是一個好處。

這裏的任何其他答案只是一種避免或解決問題的方法,避免UTF-8對於最新項目來說不是真正的選擇。

還有其他基於FPDF的替代品,如mPDF或TCPDF(而其他),但提供高級功能,具有UTF-8支持並可以解釋HTML代碼(當然由於沒有直接的方式將HTML轉換爲PDF )。 大多數FPDF代碼都可以直接用在這些庫中,所以它很容易遷移代碼。

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

+0

iconv和解碼解決方案都不適用於更多特殊字符(♠♥☺äκόσμος)。但是如果你只是用tpdf.php文件替換你的fpdf.php文件,它就會開始工作,並且你的文件會變得更小,作爲額外的獎勵。偉大的修復。 – Sebastian 2015-05-05 11:48:14

+0

FPDF和tFPDF是獨立的分支嗎?有誰知道爲什麼tFPDF在FPDF頁面上隱藏得這麼好?是否有任何缺點,在切換之前應該知道? – BurninLeo 2016-01-19 21:28:52

+0

我很確定他們爲什麼沒有將它設爲默認的FPDF版本,但它直接鏈接到主頁面http://www.fpdf.org/,並且如前所述,tFPDF的功能最初是爲mPDF開發的。我在生產環境中使用了大量的PDF格式的tFPDF,並且我認爲除了UTF-8和字體的改變外,它與100%是一樣的。從來沒有任何問題。 – Tarsis 2016-01-20 13:54:46

10

存在這個問題一個非常簡單的解決方案。

在文件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之間的破折號

希望以上是很有幫助。

大安

+1

這也適用於我的情況。 – merlin 2015-06-20 18:48:06

+1

這工作,謝謝! – 2015-11-23 23:02:48

+0

完美的是,在將FPDF更新爲支持PHP7的版本以正確顯示特殊字符之後,這仍然正在工作或需要。 – Aren 2016-12-09 08:14:39

0

您可以在文字應用此功能:

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

感謝

0

我使用FPDF的ASP,和的iconv功能不可用。 這似乎很奇怪,被我解決了UTF-8的問題,通過添加僞像(一1x1px JPEG)到PDF,只是AddPage()函數後:

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

這樣,重音符號正確地添加到我的pdf,不要問我爲什麼,但它的工作原理。

0

不確定它是否適用於希臘語,但我對巴西葡萄牙語字符有同樣的問題,我的解決方案是使用html實體。我基本上有兩種情況:

  1. 字符串可能包含UTF-8字符。

對於這些,我首先將它編碼爲具有htmlentities()的html實體,然後將它們解碼爲iso-8859-1。例如:

$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-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

    希望幫助。

    2

    以上都不是解決方案。

    試試這個:

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

    我知道這個問題是舊的,但我想,我的回答將幫助那些誰沒有找到解決辦法在其他的答案。所以,我的問題是我無法在我的PDF中顯示克羅地亞字符。首先,我使用了FPDF,但我認爲它不支持Unicode。最後,解決我的問題的是tFPDF,它是支持Unicode的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(); 
    
    1

    對於後代。

    我如何設法俄語語言添加到FPDF我的Linux機器上:

    1)進入http://www.fpdf.org/makefont/和轉換您的TTF字庫(例如AerialRegular.ttf)到使用ISO-8859-5編碼的2個文件: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); 
    
    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); 
    
    } 
    

    }

    +0

    使用utf8_decode而不是iconv – robie2011 2017-04-19 15:06:01

    1

    我想回答這個問題的人誰沒有切換到TFPDF無論出於何種原因(框架集成等)

    轉到:http://www.fpdf.org/makefont/index.php

    使用.ttf兼容字體爲您要使用的語言。確保選擇適合您的語言的編碼號碼。下載這些文件並將它們粘貼到當前的FPDF字體目錄中。

    使用此激活新字體:$pdf->AddFont($font_name,'','Your_Font_Here.php');

    然後你可以使用$pdf->SetFont正常。

    在字體本身上,使用iconv轉換爲UTF-8。所以如果你使用希伯來語,你會做iconv('UTF-8', 'windows-1255', $first_name)

    用您的語言編碼替換窗口編碼號。

    對於從右至左,快速修復正在執行諸如strrev(iconv('UTF-8', 'windows-1255', $first_name))之類的操作。