Unicode FPDF utf-8编码(HOW-TO)

Unicode FPDF utf-8编码(HOW-TO),unicode,utf-8,character-encoding,fpdf,Unicode,Utf 8,Character Encoding,Fpdf,有人知道如何将FPDF包中的编码设置为UTF-8吗?或者至少符合支持希腊字符的ISO-8859-7(希腊语) 基本上我想创建一个包含希腊字符的PDF文件 任何建议都会有帮助。 George不要使用UTF-8编码。标准FPDF字体使用ISO-8859-1或Windows-1252。可以使用utf8\u decode()执行到ISO-8859-1的转换: $str=utf8\u解码($str) 但有些字符,如欧元,将无法正确翻译。如果iconv扩展可用,正确的方法如下: $str=iconv('UT

有人知道如何将FPDF包中的编码设置为UTF-8吗?或者至少符合支持希腊字符的ISO-8859-7(希腊语)

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

任何建议都会有帮助。
George

不要使用UTF-8编码。标准FPDF字体使用ISO-8859-1或Windows-1252。可以使用
utf8\u decode()
执行到ISO-8859-1的转换:
$str=utf8\u解码($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');
}
?>
(我在一张桌子上工作。)这对我的语言起了作用(Buňka jedna是捷克语的Cell one)。捷克语属于中欧语言,也是ISO-8859-2。遗憾的是,FPDF的用户被迫失去了UTF-8编码的优势。您无法在PDF中获取此信息:

Městečko Fruens Bøge
丹麦字母
ø
在ISO-8859-2中变成
ř


解决方案建议:您需要使用希腊字体,使用正确的编码(ISO-8859-7)生成字体,并使用与生成字体的目标编码相同的
iconv

FPDF有一个名为mPDF的扩展,允许使用Unicode字体


这个答案对我不起作用,我还需要对字符串运行html解码。看

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

道具从

转到emfi还有一个名为tFPDF的FPDF的官方UTF-8版本

您可以轻松地从原始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");

//...
?>

这个问题有一个非常简单的解决方案

在文件fpdf.php中,转到以下行:

if($txt!=='')
{
在我的fpdf版本中是第648行。 插入以下代码行:

$txt = iconv('utf-8', 'cp1252', $txt);
(代码行上方)

这适用于所有德语特殊字符,也适用于希腊特殊字符。否则,只需将cp1252替换为所需的相应字母表即可。您可以在此处看到所有支持的字符:

我在这里看到了解决方案: 请使用我上面的示例代码,因为原作者忘记在utf和8之间插入破折号

希望以上内容对您有所帮助


Daan

FPDF有一个扩展名为UFDPF


但是,imho,如果您可以更改类别,最好使用mpdf。

您可以在文本上应用此功能:

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

谢谢

我将FPDF用于ASP,而iconv功能不可用。 奇怪的是,我在AddPage()函数之后,通过向pdf添加一个伪图像(1x1px jpeg),解决了UTF-8问题:

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

通过这种方式,重音字符被正确地添加到我的pdf中,不要问我为什么,但它可以工作。

不确定它是否适用于希腊语,但我对巴西葡萄牙语字符也有同样的问题,我的解决方案是使用html实体。我基本上有两个案例:

  • 字符串可能包含UTF-8字符
  • 对于这些,我首先使用
    htmlentities()
    将其编码为html实体,然后将其解码为
    iso-8859-1
    。例如:

    $s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
    
    $s = html_entity_decode("Treasurer/Tr&eacute;sorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
    
  • 修复了包含html实体的字符串:
  • 对于这些,我只是离开了
    htmlentities()
    callout。例如:

    $s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
    
    $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|u COMPAT | ENT|u HTML401
    是参数2的标准值,如中所示


    希望这能有所帮助。

    上述解决方案都行不通

    试试这个:

    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();
    
    为了后代

    我是如何将俄语添加到Linux机器上的fpdf的:

    1) 转到并使用ISO-8859-5编码将您的ttf字体(例如AerialRegular.ttf)转换为两个文件:AerialRegular.php和AerialRegular.z

    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);
    
    } 
    

    }

    我想为任何没有出于任何原因(框架集成等)切换到TFPDF的人回答这个问题

    转到:

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

    使用此选项激活新字体:
    $pdf->AddFont($font\u name,,'Your\u font\u Here.php')

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

    在字体本身上,使用iconv转换为UTF-8。例如,如果您使用的是希伯来语,您可以使用iconv('UTF-8','windows-1255',$first\u name)

    将windows编码编号替换为您的语言编码


    对于从右到左,一个快速修复方法是执行类似于strrev(iconv('UTF-8','windows-1255',$first_name))

    的操作,而不是使用此iconv解决方案:

    $str = iconv('UTF-8', 'windows-1252', $str);
    
    您可以使用以下选项:

    $str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
    

    请参阅:

    只需编辑fpdf.php文件中的函数单元格,查找如下所示的行

    function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
    { 
    
    找到线路后

    {
    之后写入

    $txt = utf8_decode($txt);
    
    保存文件并准备就绪,重音符号和utf8编码将起作用:)

    如何在FPDF中创建支持中文、日文、俄文等的PDF?

    (代码快照)
    $this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
    $this->SetFont('japanese', '', 14);
    $this->Write(14, '日本語');