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代码可以直接在这些库中使用,所以它很容易迁移代码。
您需要先生成一个字体。 您必须使用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是CELL的捷克语)。 捷克语属于中欧语言,也是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字体。
这个答案不适合我,我还需要在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实体。 我基本上有两种情况:
- string可能包含UTF-8字符。
对于这些,我首先使用htmlentities()
将其编码为html实体,然后将其解码为iso-8859-1
。 例:
$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
- 修正html实体的string:
对于这些,我刚刚离开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
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))
。