我使用最新的 TCPDF 版本(5.9)。但是编码有一些奇怪的问题。我需要立陶宛语符号,例如:ąčęėįšųūž。但只得到其中的一小部分。其他仍然像????? 所以我该怎么做 ?我使用默认时间字体(它带有 TCPDF 下载)。
任何帮助,将不胜感激。
TCPDF 与 utf8 相当棘手。实现您想要的最佳方法是将字体嵌入生成的 PDF 文件本身。您可以使用 TCPDF 包中的 freeserif 字体,它包含所有 utf8 符号,绝对显示任何语言的任何字符,但在输出文件中增加了 ~700kb。如果文件大小无关紧要,这可能是获取所需符号的最简单方法。
您还可以制作自己的字体来嵌入,其中包含您需要的字符。这可能是最好的解决方案,保持通用性和小尺寸,但更复杂。
或者,您可以中继从系统中获取的核心字体,如果未找到,则替换为替代字体。这使得输出文件非常轻,但增加了字体子集以获得奇异字符的必要性。就我个人而言,我还没有成功,所以我仍然认为嵌入字体是最好的解决方案,它也恰好更通用..
CPDF 核心字体中包含一种字体——dejavusans,它显示了所有立陶宛字符。只需添加以下内容:
$pdf->setHeaderFont(Array('dejavusans', '', 10, '', false));
$pdf->setFooterFont(Array('dejavusans', '', 8, '', false));
$pdf->SetFont('dejavusans', '', 10, '', false);
将$unicode
TCPDF 构造函数上的参数设置为false
并将$encoding
参数设置为'ISO-8859-1'
或其他字符映射。
这将帮助您:
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);
将字体设置为 freeserif 它将起作用。我测试过。
$pdf->SetFont('freeserif', '', 14, '', true);
刚刚在尝试使用默认的 Helvetica 字体呈现罗马尼亚文本时发现了同样的情况。在进行一些调查时,我发现 tcpdf 库将其默认字体(称为“核心”字体)视为 Latin1 字符,因此即使您告诉它使用 UTF-8 编码并设置 unicode 标志,它也会逐字翻译您的文本在渲染之前转换为 Latin1 等价物。库的默认行为是,如果它找到一个 Latin1 等价物,则翻译它可以找到一个等价物的每个字符,否则它会将字符翻译为“?”。
这可以在以下方法链中的 TCPDF 类中找到:
Write()
-> Cell()
-> getCellCode()
-> _escapetext()
。
在里面_escapetext()
你可以看到它正在检查$this->isunicode
然后检查所选字体以查看它的类型是否为core|TrueType|Type1。如果是,它将通过该UTF8ToLatin1()
方法为您将字符串“拉丁化”。这是'?翻译正在进行中。
我的建议是使用与您所使用的默认字体类似的自定义 unicode 字体(如 Deja Vu Sans)。在我目前的情况下,这对我有用。
要使用带有特殊字符(如 ฿、포 或其他字符)的 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
你有问题从数据库中读取像卡纳塔克邦这样的字符并像这样显示 卡恩?塔卡 我的意思是“?” 我们不想要的然后做以下事情:
为连接定义字符集 ( 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);
IIRC,您可以在创建新字体时定义编码,如此处所述。否则,您必须使用创建字体时定义的编码。听起来 TCPDF 附带的字体都使用 WinAnsiEncoding ......又名代码页 1252。
笨拙,但有效。
使用默认的 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);
使用 dejavusans 字体,它适用于俄语和拉脱维亚字母。
对我来说,这是一个字体问题。我使用了字体times
,我的本地多字节字符无法正确显示。当我将其更改为freeserif
他们正常工作时:)
为此,请使用参数 TCPDF 构造函数的以下代码
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);
它会帮助你。
$fontname = $pdf->addTTFfont('C:\xampp\htdocs\copyshop\fonts\07-TH-Sarabun-PSK\THSarabun.ttf', 'TrueTypeUnicode', '', 32);
$pdf->SetFont($fontname, '', 16,'',FALSE); //Working
我对罗马尼亚字符有同样的问题,问题不在于编码、LC_CTYPE或TCPDF的其他设置,而是我使用的字体。我提到我使用带有 Courier 字体的 TWIG 模板。您可以尝试将字体更改为freeserif
更改字体以正常显示₹和立陶宛符号
$pdf->SetFont('cid0cs', '', 12);