2011-06-13 146 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))之类的操作。