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' 属性:为此使用参数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);
【讨论】:
【参考方案8】:使用 dejavusans 字体,它适用于俄语和拉脱维亚字母。
【讨论】:
【参考方案9】:CPDF 核心字体中包含一种字体——dejavusans,它显示了所有立陶宛字符。只需添加以下内容:
$pdf->setHeaderFont(Array('dejavusans', '', 10, '', false));
$pdf->setFooterFont(Array('dejavusans', '', 8, '', false));
$pdf->SetFont('dejavusans', '', 10, '', false);
【讨论】:
【参考方案10】:使用默认的 TCPDF 包测试 dejavusans 和 freeserif,这两种字体都适用于立陶宛字符。我还输入了几个俄语字符,它们也有效。我用这段代码来测试它:
$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_CTYPE 或 TCPD 的其他设置,而是我使用的字体。 我提到我使用带有 Courier 字体的 TWIG 模板。 您可以尝试将字体更改为 freeserif
【讨论】:
【参考方案15】:更改字体以正常显示₹和立陶宛符号
$pdf->SetFont('cid0cs', '', 12);
【讨论】:
以上是关于TCPDF UTF-8 符号未显示的主要内容,如果未能解决你的问题,请参考以下文章