有誰知道如何將FPDF包中的編碼設置爲utf-8?或者至少支持希臘字符的ISO-8859-7(希臘語)?FPDF UTF-8編碼(如何)
基本上我想創建一個包含希臘字符的pdf文件。
任何建議都會有幫助。 George
有誰知道如何將FPDF包中的編碼設置爲utf-8?或者至少支持希臘字符的ISO-8859-7(希臘語)?FPDF UTF-8編碼(如何)
基本上我想創建一個包含希臘字符的pdf文件。
任何建議都會有幫助。 George
請勿使用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);
您需要先生成一個字體。您必須使用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
具有相同的目標編碼的字體已經與生成的一個。
FPDF的擴展名爲mPDF,允許使用Unicode字體。
這個答案並沒有爲我工作,我需要在弦上運行HTML解碼也。見
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
謝謝!這也適用於我。 – 2016-06-14 22:03:58
到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代碼都可以直接用在這些庫中,所以它很容易遷移代碼。
iconv和解碼解決方案都不適用於更多特殊字符(♠♥☺äκόσμος)。但是如果你只是用tpdf.php文件替換你的fpdf.php文件,它就會開始工作,並且你的文件會變得更小,作爲額外的獎勵。偉大的修復。 – Sebastian 2015-05-05 11:48:14
FPDF和tFPDF是獨立的分支嗎?有誰知道爲什麼tFPDF在FPDF頁面上隱藏得這麼好?是否有任何缺點,在切換之前應該知道? – BurninLeo 2016-01-19 21:28:52
我很確定他們爲什麼沒有將它設爲默認的FPDF版本,但它直接鏈接到主頁面http://www.fpdf.org/,並且如前所述,tFPDF的功能最初是爲mPDF開發的。我在生產環境中使用了大量的PDF格式的tFPDF,並且我認爲除了UTF-8和字體的改變外,它與100%是一樣的。從來沒有任何問題。 – Tarsis 2016-01-20 13:54:46
存在這個問題一個非常簡單的解決方案。
在文件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之間的破折號
希望以上是很有幫助。
大安
有一個推廣到FPDF稱爲UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/
但是,恕我直言,這是更好,如果你是有可能爲你改變類使用MPDF。
您可以在文字應用此功能:
$yourtext = iconv('UTF-8', 'windows-1252', $yourtext);
感謝
我使用FPDF的ASP,和的iconv功能不可用。 這似乎很奇怪,被我解決了UTF-8的問題,通過添加僞像(一1x1px JPEG)到PDF,只是AddPage()函數後:
pdf.Image "images/fpdf.jpg",0,0,1
這樣,重音符號正確地添加到我的pdf,不要問我爲什麼,但它的工作原理。
不確定它是否適用於希臘語,但我對巴西葡萄牙語字符有同樣的問題,我的解決方案是使用html實體。我基本上有兩種情況:
對於這些,我首先將它編碼爲具有htmlentities()
的html實體,然後將它們解碼爲iso-8859-1
。例如:
$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
對於這些,我剛離開htmlentities()
呼出。例如:
$s = html_entity_decode("Treasurer/Tré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
希望幫助。
以上都不是解決方案。
試試這個:
function filter_html($value){
$value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
return $value;
}
我知道這個問題是舊的,但我想,我的回答將幫助那些誰沒有找到解決辦法在其他的答案。所以,我的問題是我無法在我的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();
對於後代。
我如何設法俄語語言添加到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);
你可以讓一個類來擴展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);
}
}
使用utf8_decode而不是iconv – robie2011 2017-04-19 15:06:01
我想回答這個問題的人誰沒有切換到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))
之類的操作。
謝謝,捷克和德國符號效果很好! – mrohnstock 2012-04-27 08:23:11
在哪裏可以放置UTF-8在fpdf,可以打印阿爾比奇文本 – SAR 2014-10-12 06:40:37
我不認爲這會有所幫助。您的答案確實解釋瞭如何使用ISO-8859-1或windows-1252編碼生成PDF,但這些編碼不適用於非拉丁語言。更不用說輸出多語言(多腳本)文本。 – 2015-02-17 12:25:27