ChatGPT解决这个技术问题 Extra ChatGPT

FPDF utf-8 编码(HOW-TO)

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

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

任何建议都会有所帮助。乔治

如果你想使用更多的语言,你需要 UTF8,所以你可以使用 tFPDF。看看composer package

M
Michal

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


我认为这不会有帮助。您的回答确实解释了如何使用 ISO-8859-1 或 windows-1252 编码生成 PDF,但这些编码不适用于非拉丁语言。更不用说输出多语言(多脚本)文本了。
@Rafiq:不要在我的答案中使用“旧”FPDF,而是使用较新的 UTF8 版本 tFPDF 作为 postet。
注意:使用 ISO-8859-1 时,€ 字符不起作用(字符集中没有欧元符号,请改用 ISO-8859-15)。
@BurninLeo:ISO-8859-15 也好不到哪里去,所有这些编码都有相同的字符限制,所以 -15 有 €,但因此缺少 ´ 或 ½。唯一真正的解决方案是使用 UTF-8 而不是避免使用它 - 如我的回答所示。
tFPDF 确实支持 unicode,但它已经 3 年没有更新了,因为 FPDF 最近更新了,使得 tFPDF 过时了。使用 tFPDF 时请记住这一点。
T
Tarsis

还有一个官方的 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 对于最新项目来说并不是真正的选择。

还有其他替代品,例如 mPDF 或 TCPPDF(以及其他),它们基于 FPDF,但提供高级功能,支持 UTF-8 并且可以解释 HTML 代码(当然,由于没有直接将 HTML 转换为 PDF 的方法,因此受到限制)。大多数 FPDF 代码可以直接在这些库中使用,因此迁移代码非常容易。

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


没有一个 iconv 和 decode 解决方案适用于更特殊的字符 (♠♥☺äκόσμος)。但是,如果您只是将 fpdf.php 替换为 tpdf.php 文件,那么一切都会开始工作,并且您的文件会变小作为额外的奖励。很好的修复。
FPDF 和 tFPDF 是独立的分支吗?有谁知道为什么 tFPDF 在 FPDF 页面上隐藏得这么好?是否有任何缺点,在切换之前应该知道吗?
我很确定为什么他们没有将其设为默认 FPDF 版本,但它直接链接在主页 fpdf.org 上,并且如前所述,tFPDF 的功能最初是为 mPDF 开发的。我在生产环境中将 tFPDF 用于很多 PDF,我认为除了 UTF-8 和字体更改之外,它是 100% 相同的。从来没有任何问题。
tFPDF 是一个脚本,或者是 FPDF 的扩展。它被认为是过时的(3 年前更新),因为 FPDF 最近更新了。 tFPDF 的作者没有对其进行维护,与 tFPDF 相关的 GitHub 也没有被触及。请参阅:github.com/rev42/tfpdf
只要您不需要更多功能,我就没有看到问题,顺便说一句,最后一次(次要)更新仅在 4 个月前 - 仍然比不支持 UTF-8 好。无论哪种方式,我都喜欢 TCPDF 或 mPDF,它们都基于 FPDF,但提供高级功能,还支持 HTML 代码。
D
Daan

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

在文件 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 之间插入破折号。

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

大安


完美,在将 FPDF 更新到支持 PHP7 的版本以正确显示特殊字符后,这仍然有效或需要。
这个命令对我有用, $txt = iconv('utf-8', 'cp1252', $txt);谢谢
只是惊人的简单解决方案。可悲的是它藏在stackoverflow上一个不起眼的地方:)
这改变了我的间距 - 现在有些行更早中断。但至少它似乎有效——在土耳其字母对我完全不起作用之前,现在至少我看到了一些东西。
T
Theodor Keinstein

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

Městečko Fruens Bøge

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

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


H
HoldOffHunger

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

https://raw.githubusercontent.com/HoldOffHunger/php-html-to-pdf/master/images/php-html-to-pdf-converter.jpg

(下面使用的代码快照)

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

问题 :

正如 Tarsis 所说,将 FPDF 交换为 TFPDF。您实际上需要一种支持您正在使用的 UTF-8 字符的字体。 IE,仅仅使用 Helvetica 并试图显示日语是行不通的。如果您使用 Font Forge 或其他字体工具,您可以滚动到字体的中文字符,然后查看它们是否为空白。谷歌有一种包含所有语言的字体(Noto 字体),它是 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, '日本語');

应该没什么了!

GitHub 上的代码包:

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

工作,日语在线演示:

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


C
Community

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

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

道具从 html_entity_decode in FPDF(using tFPDF extention) 转到 emfi


n
nicolallias

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

function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{ 

找到线后

写在 { 之后,

$txt = utf8_decode($txt);

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


J
Jon Winstanley

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

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


链接好像死了
A
Alejandro Aranda

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

} 

}


M
Maciej Jureczko

我想为任何出于任何原因(框架集成等)没有切换到 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)

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

对于从右到左,快速解决方法是执行 strrev(iconv('UTF-8', 'windows-1255', $first_name)) 之类的操作。


J
James Fenwick

以上解决方案都不起作用。

尝试这个:

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

g
gounane

您可以将此功能应用于您的文本:

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

谢谢


A
Alexandre Schmidt

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

字符串可能包含 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

希望有帮助。


r
ryzhak

为子孙。

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

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

T
Theo

而不是这个 iconv 解决方案:

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

您可以使用以下内容:

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

请参阅:How to convert Windows-1252 characters to values in php?


s
sr9yar

FPDF 有一个扩展名为 UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/

但是,恕我直言,如果您可以更改课程,最好使用 mpdf。


n
niente1

我用FPDF for ASP,iconv功能不可用。看起来很奇怪,我通过在 AddPage() 函数之后向 pdf 添加假图像(1x1px jpeg)来解决 UTF-8 问题:

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

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


N
NutCracker

我知道这个问题很老,但我认为我的回答会帮助那些在其他答案中没有找到解决方案的人。所以,我的问题是我无法在我的 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();

S
S.B

就像这里很多人说的:

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

但是!在 windows-1252 或在我的情况下为 CP1252 之后有一个 '//Ignore',如下所示:

iconv("UTF-8", "CP1252//IGNORE", $row['project_name'])

这个对我有用,我希望它对你有用!