TCPDF UTF-8 符号未显示

Posted

技术标签:

【中文标题】TCPDF UTF-8 符号未显示【英文标题】:TCPDF UTF-8 symbols not showing up 【发布时间】:2011-07-17 01:31:28 【问题描述】:

我正在使用最新的 TCPDF 版本(5.9)。但是编码有一些奇怪的问题。我需要立陶宛语符号,例如:ąčęėįšųūž。但只得到其中的一小部分。其他仍然像????? 所以我该怎么做 ?我使用默认时间字体(它带有 TCPDF 下载)。

任何帮助将不胜感激。

【问题讨论】:

生成的PDF文档的编码是ANSI。此类信息显示 PDF 阅读器。但怎么可能呢?我在我的代码中定义,编码是 UTF-8... 【参考方案1】:

IIRC,您可以在创建新字体as described here 时定义编码。否则,您必须使用创建字体时定义的编码。听起来 TCPDF 附带的字体都使用 WinAnsiEncoding...a.k.a. 代码页 1252。

笨拙但有效。

【讨论】:

我可以确认这是我如何让它为罗马尼亚字符工作的。我尝试以多种方式生成 Arial (ttf),但最终失败了。当我尝试使用 MyriadPro (utf) 时,它第一次起作用。【参考方案2】:

将 TCPDF 构造函数上的$unicode 参数设置为false,将$encoding 参数设置为'ISO-8859-1' 或其他一些字符映射。

This 会帮助你:

UTF-8 unicode 的默认值:

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

欧洲字符集的构造函数示例:

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);

【讨论】:

请提及该行应该添加/修改的文件 这绝对行不通,当文本的编码是 utf-8 时。在我的情况下,将参数设置为 >>false, 'ISO-8859-1' 会更糟 @emfi 不要忘记将源文件本身的编码从“UTF-8”更改为“ANSI”【参考方案3】:

TCPPDF 与 utf8 相当棘手。实现您想要的最佳方法是将字体嵌入生成的 PDF 文件本身。您可以使用 TCPDF 包中的 freeserif 字体,它包含所有 utf8 符号,绝对显示任何语言的任何字符,但在输出文件中增加了 ~700kb。如果文件大小无关紧要,这可能是获取所需符号的最简单方法。

您还可以制作自己的字体来嵌入,其中包含您需要的字符。这可能是最好的解决方案,保持通用性和小型化,但更复杂。

或者,您可以使用从系统中获取的核心字体,如果未找到,则替换为替代品。这使得输出文件非常轻,但增加了字体子集以获得奇异字符的必要性。就我个人而言,我没有成功,所以我仍然认为嵌入字体是最好的解决方案,它也恰好更通用..

【讨论】:

freesans 字体的绝妙提示,我会为你投票 10 次,为我节省了很多工作! Freesans 也帮助了我。非常感谢!另外,我想补充一点,如果您像我一样尝试打印表格,则应该在 php ($pdf->SetFont('freesans')) 和 html 中设置“freesans”字体。只需像这样添加 'style' 属性:... 帮助我显示了一些捷克语字符。 "实现您想要的最佳方式是将字体嵌入生成的 PDF 文件本身。" - 我怎样才能做到这一点? @squirrely 我爱你,parrker9 我爱你 就我而言,只需更改原始 HTML 的内联样式中的字体(为 freesans)(我正在使用 writeHTML)就可以了。不过,您需要在字体文件夹中有字体。【参考方案4】:

为此使用参数TCPDF构造函数的以下代码

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);

它会帮助你。

【讨论】:

【参考方案5】:

刚刚在尝试使用默认的 Helvetica 字体渲染罗马尼亚语文本时发现了同样的情况。在进行一些调查时,我发现 tcpdf 库将其默认字体(称为“核心”字体)视为 Latin1 字符,因此即使您告诉它使用 UTF-8 编码并设置 unicode 标志,它也会逐字翻译您的文本在渲染之前转换为 Latin1 等价物。该库的默认行为是,如果它找到一个 Latin1 等价物,则翻译它可以找到一个等价物的每个字符,否则它会将字符翻译为“?”。

这可以在以下方法链中的 TCPDF 类中找到: Write() -> Cell() -> getCellCode() -> _escapetext().

_escapetext() 内部,您可以看到它正在检查$this->isunicode,然后检查所选字体以查看其类型是否为core|TrueType|Type1。如果是,它将通过UTF8ToLatin1() 方法为您将字符串“拉丁化”。这是'?翻译正在进行中。

我的建议是使用与您所使用的默认字体类似的自定义 unicode 字体(如 Deja Vu Sans)。在我目前的情况下,这对我有用。

【讨论】:

这确实也是我的问题。感谢您的提示!【参考方案6】:

对我来说,这是一个字体问题。我使用了字体times,而我的本地多字节字符无法正确显示。当我将其更改为freeserif 时,它们工作正常:)

【讨论】:

【参考方案7】:

你有问题从数据库中读取像 Karnātaka 这样的字符并像这样显示 karn?taka 我的意思是 "?" 我们没有'不想然后做以下事情:

    为连接定义字符集 (mysql_set_charset()):

    $con = mysql_connect("localhost","root","");
    
    if (!$con)
    
        die('Could not connect: ' . mysql_error());
    
    mysql_select_db("database_name", $con) or die(mysql_error());
    mysql_set_charset('utf8',$con);
    

    使用$pdf->SetFont('DejaVuSerif', '', 10); 而不是$pdf->SetFont('helvetica', 'B', 12);

    对于 PHP 的 TCPDF 库,从数据库中读取字符如 Rājasthān 而不是 R?jasth?n

【讨论】:

【参考方案8】:

使用 dejavusans 字体,它适用于俄语和拉脱维亚字母。

【讨论】:

【参考方案9】:

CPDF 核心字体中包含一种字体——dejavusans,它显示了所有立陶宛字符。只需添加以下内容:

$pdf->setHeaderFont(Array('dejavusans', '', 10, '', false));
$pdf->setFooterFont(Array('dejavusans', '', 8, '', false));
$pdf->SetFont('dejavusans', '', 10, '', false);

【讨论】:

【参考方案10】:

使用默认的 TCPDF 包测试 dejavusansfreeserif,这两种字体都适用于立陶宛字符。我还输入了几个俄语字符,它们也有效。我用这段代码来测试它:

$this->pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 
$this->pdf->AddPage();
$this->pdf->SetFont('dejavusans', 'B', 20); // UTF8 fonts with lithuanian support: freeserif, dejavusans
$this->pdf->Write(0, 'ąžūčšęėųįĄŽŪČŠĘĖŲĮ Превед Кросавчег!', '', 0, 'C', true, 0, false, false, 0);

【讨论】:

【参考方案11】:

将 TCPDF 与 ฿、포 等特殊字符一起使用 您需要使用 unicode 字体:

    下载字体在这里: ftp://ftp.fu-berlin.de/unix/X11/multimedia/MPlayer/contrib/fonts/arialuni.ttf.bz2

    创建一个测试pdf文件并将此字体加载到TCPDF 示例:

    $fontname = $pdf->addTTFfont('/var/www/app/images/fonts/arialuni.ttf', 'TrueTypeUnicode', '', 32);

    这将创建如下字体:

    应用程序/库/tcpdf/fonts/arialuni.ctg.z 应用程序/库/tcpdf/fonts/arialuni.php 应用程序/库/tcpdf/fonts/arialuni.z

    现在您可以使用以下命令设置新字体: $pdf->SetFont('arialuni', '', 10.5);

    现在您可以使用特殊的 unicode 字符,如 ฿ 等....

来源: http://myridia.com/dev_posts/view/852

【讨论】:

我使用的是 6.2.12 版本,这里不存在 $pdf->addTTFfont() 方法?你或其他人有任何信息吗? @emfi,现在“addTTFfont”是一个静态方法。您可以在此处找到示例:github.com/tecnickcom/TCPDF/blob/…【参考方案12】:

将字体设置为 freeserif 即可。 我测试过。

$pdf->SetFont('freeserif', '', 14, '', true);

【讨论】:

不敢相信花了将近两个小时才弄明白 谢谢我试图在页眉/页脚中写希腊语,只有这个答案对我有帮助。我必须通过htmlentities() 传递字符,现在freeserif 字体可以正确显示它们。【参考方案13】:
$fontname = $pdf->addTTFfont('C:\xampp\htdocs\copyshop\fonts\07-TH-Sarabun-PSK\THSarabun.ttf', 'TrueTypeUnicode', '', 32);
    $pdf->SetFont($fontname, '', 16,'',FALSE); //Working

【讨论】:

【参考方案14】:

我对罗马尼亚语字符也有同样的问题,问题不在于编码、LC_CTYPETCPD 的其他设置,而是我使用的字体。 我提到我使用带有 Courier 字体的 TWIG 模板。 您可以尝试将字体更改为 freeserif

【讨论】:

【参考方案15】:

更改字体以正常显示₹和立陶宛符号

$pdf->SetFont('cid0cs', '', 12);

【讨论】:

以上是关于TCPDF UTF-8 符号未显示的主要内容,如果未能解决你的问题,请参考以下文章

JSP未显示®或商标符号

TCPDF 未使用 Helvetica 显示希腊字符

™ 来自数据库未显示符号

现场未显示欧元符号

性能:内核模块符号未显示在分析中

Discord.js v13 机器人显示未定义而不是表情符号