FPDF utf-8编码(HOW-TO)

有谁知道如何在FPDF包中设置编码为utf-8? 或者至less是支持希腊字符的ISO-8859-7(希腊语)?

基本上我想创build一个包含希腊字符的PDF文件。

任何build议将有所帮助。 乔治

不要使用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);

还有一个官方的UTF-8 FPDF版本叫做tFPDF http://www.fpdf.org/en/script/script92.php

您可以轻松地从原始FPDF切换,只要确保您也使用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对于最新的项目来说并不是真正的select。

也有基于FPDF,但提供高级function,具有UTF-8支持,并可以解释HTML代码(当然有限的,因为没有直接的方式来将HTML转换为PDF),如mPDF或TCPDF(和其他)的替代品。 大多数FPDF代码可以直接在这些库中使用,所以它很容易迁移代码。

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

您需要先生成一个字体。 您必须使用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ňkajednaCELL的捷克语)。 捷克语属于中欧语言,也是ISO-8859-2。 令人遗憾的是,FPDF的用户被迫失去了UTF-8编码的优势。 你不能在你的PDF中得到这个:

 Městečko Fruens Bøge 

丹麦语字母ø在ISO-8859-2中变为ř

解决schemebuild议:您需要获取希腊字体,使用适当的编码(ISO-8859-7)生成字体,并使用与生成字体的目标编码相同的目标编码。

这个问题有一个非常简单的解决scheme。

在文件fpdf.php转到行:

 if($txt!=='') { 

这是我的fpdf版本648行。 插入以下代码行:

 $txt = iconv('utf-8', 'cp1252', $txt); 

(上面的代码行)

 if($align=='R') 

这适用于所有德国特殊字符,也适用于希腊特殊字符。 否则,只需用您所需的各个字母表replacecp1252即可。 你可以在这里看到所有支持的字符: http : //en.wikipedia.org/wiki/Windows-1252

我在这里看到了解决scheme: http : //fudforum.org/forum/index.php?t=msg&goto=167345请使用我上面的示例代码,因为原来的作者忘记了在UTF和8之间插入破折号。

希望以上是有帮助的。

大安

FPDF的扩展名为mPDF,允许使用Unicode字体。

http://www.mpdf1.com/mpdf/index.php

这个答案不适合我,我还需要在string上运行html解码。 看到

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

道具从FPDF中的 html_entity_decode转到emfi (使用tFPDF扩展)

您可以创build一个类来扩展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); } 

}

上述解决scheme都不会起作用。

尝试这个:

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

FPDF被称为UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/

但是,如果你有可能改变课堂,最好使用mpdf。

你可以在你的文字上应用这个function:

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

谢谢

我使用ASP的FPDF,并且iconvfunction不可用。 这似乎很奇怪,我解决了UTF-8的问题,在pdf中添加一个伪造的图像 (1x1px jpeg),就在AddPage()函数之后:

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

这样,重音字符正确添加到我的PDF,不要问我为什么,但它的作品。

不知道这是否会为希腊,但我有巴西葡萄牙字符相同的问题,我的解决scheme是使用HTML实体。 我基本上有两种情况:

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

对于这些,我首先使用htmlentities()将其编码为html实体,然后将其解码为iso-8859-1 。 例:

 $s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1'); 
  1. 修正html实体的string:

对于这些,我刚刚离开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 ENT_COMPAT | ENT_HTML401是参数#2的标准值,如http://php.net/manual/en/function.html-entity-decode.php

希望有所帮助。

我知道这个问题很老,但我想我的答案会帮助那些还没有find解决scheme的人。 所以,我的问题是,我无法在我的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(); 

为了后代。

我如何在Linux机器上添加俄文语言到fpdf:

1)转到http://www.fpdf.org/makefont/并;使用ISO-8859-5编码将您的ttf字体(例如AerialRegular.ttf)转换为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); 

我想回答这个问题,不pipe是出于什么原因都没有转向TFPDF的人(框架集成等)

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

使用.ttf兼容字体作为您要使用的语言。 确保select适合您的语言的编码号码。 下载这些文件并将其粘贴到当前的FPDF字体目录中。

使用这个来激活新的字体: $pdf->AddFont($font_name,'','Your_Font_Here.php');

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

在字体本身上,使用iconv转换为UTF-8。 所以,如果你使用希伯来语,你会做iconv('UTF-8', 'windows-1255', $first_name)

用您的语言编码replace窗口编码号码。

对于从右到左,快速修复正在做类似strrev(iconv('UTF-8', 'windows-1255', $first_name))