FPDF utf-8编码(HOW-TO)

yor*_*gos 72 unicode utf-8 character-encoding fpdf

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

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

任何建议都会有帮助.乔治

Mic*_*hal 103

不要使用UTF-8编码.标准FPDF字体使用ISO-8859-1或Windows-1252.可以通过以下方式执行到ISO-8859-1的转换utf8_decode(): $str = utf8_decode($str); 但是某些字符(如Euro)将无法正确转换.如果iconv扩展名可用,正确的方法如下: $str = iconv('UTF-8', 'windows-1252', $str);

  • 我不认为这会有所帮助.您的答案解释了如何使用ISO-8859-1或Windows-1252编码生成PDF,但这些编码不适用于非拉丁语言.更不用说输出多语言(多脚本)文本. (18认同)
  • @Rafiq:不要使用"旧的"FPDF,而是使用较新的UTF8版本tFPDF作为我的答案中的后缀. (3认同)
  • tFPDF确实支持unicode,但它在3年内没有更新,因为FPDF最近更新使tFPDF过时.使用tFPDF时请记住这一点. (2认同)

Tar*_*sis 36

还有一个名为tFPDF的官方UTF-8版FPDF 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");

//...
?>
Run Code Online (Sandbox Code Playgroud)

我认为使用它更优雅而不是在任何地方使用utf8_decode(),并且在AddFont()中直接使用.ttf文件的能力也是一个好处.

这里的任何其他答案只是避免或解决问题的一种方法,并且避免使用UTF-8不是最新项目的真正选择.

还有像mPDF或TCPDF(和其他)这样的替代品,它们基于FPDF但提供高级功能,具有UTF-8支持并且可以解释HTML代码(当然有限,因为没有直接的方法将HTML转换为PDF).大多数FPDF代码可以直接在这些库中使用,因此很容易迁移代码.

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


Daa*_*aan 19

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

在文件fpdf.php中,转到说:

if($txt!=='')
{
Run Code Online (Sandbox Code Playgroud)

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

$txt = iconv('utf-8', 'cp1252', $txt);
Run Code Online (Sandbox Code Playgroud)

(在代码行之上)

if($align=='R')
Run Code Online (Sandbox Code Playgroud)

这适用于所有德国特殊字符,也适用于希腊特殊字符.否则,只需将cp1252替换为您需要的相应字母.您可以在此处查看所有受支持的字符:http://en.wikipedia.org/wiki/Windows-1252

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

希望以上是有帮助的.

大安

  • 这个命令对我有用, $txt = iconv('utf-8', 'cp1252', $txt); Thks (2认同)

Tom*_* K. 9

您需要先生成一个字体.您必须使用MakeFontFPDF包中包含的实用程序.我在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');
}
?>
Run Code Online (Sandbox Code Playgroud)

然后我将生成的文件复制到font我的web目录并使用:

$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Bu?ka jedna'),1);
Run Code Online (Sandbox Code Playgroud)

(我正在桌上工作.)这对我的语言有效(BuňkajednaCell one的捷克语).捷克语属于中欧语言,也属于ISO-8859-2.令人遗憾的是,FPDF的用户被迫失去了UTF-8编码的优势.你不能在你的PDF中得到这个:

M?ste?ko Fruens Bøge
Run Code Online (Sandbox Code Playgroud)

丹麦信函ø成为?ISO-8859-2.

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


小智 5

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

iconv('UTF-8', 'windows-1252', html_entity_decode($str));
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{ 
Run Code Online (Sandbox Code Playgroud)

找到线后

写在{, 之后

$txt = utf8_decode($txt);
Run Code Online (Sandbox Code Playgroud)

保存文件并准备好,重音和 utf8 编码将起作用:)


Hol*_*ger 5

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

(下面使用的代码快照)

我想提供:问题摘要、解决方案、带有工作代码的 github 项目,以及带有预期结果 PDF 的在线示例。

问题 :

  1. 正如 Tarsis 所说,将 FPDF 交换为 TFPDF。
  2. 您实际上需要一种支持您正在使用的 UTF-8 字符的字体。

    IE,仅使用 Helvetica 并尝试显示日语是行不通的。如果您使用 Font Forge 或其他一些字体工具,您可以滚动到字体的中文字符,并看到它们是空白的。

    Google 有一种包含所有语言的字体 ( Noto font ),它是 20mb,这通常是文本大小的几个因素。因此,您可以理解为什么许多字体根本无法涵盖每一种语言。

解决方案 :

我使用的是 rounded-mgenplus-20140828.ttf 和 ZCOOL_QingKe_HuangYou.ttf 日文和中文字体包,它们是开源的,可以在许多开源项目中找到。在 tFPDF 本身或它的新继承类中,例如class HTMLtoPDF extends tFPDF {...},您将执行此操作...

$this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
$this->SetFont('japanese', '', 14);
$this->Write(14, '???');
Run Code Online (Sandbox Code Playgroud)

应该没什么了吧!

GitHub 上的代码包:

https://github.com/HoldOffHunger/php-html-to-pdf

工作,日语在线演示:

https://www.earthfluent.com/privacy.pdf?language=ja