27

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

任何帮助,将不胜感激。

4

15 回答 15

33

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

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

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

于 2011-06-03T14:28:44.503 回答
15

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

$pdf->setHeaderFont(Array('dejavusans', '', 10, '', false));
$pdf->setFooterFont(Array('dejavusans', '', 8, '', false));
$pdf->SetFont('dejavusans', '', 10, '', false);
于 2013-03-16T21:03:42.227 回答
14

$unicodeTCPDF 构造函数上的参数设置为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);
于 2011-05-26T07:19:33.293 回答
12

将字体设置为 freeserif 它将起作用。我测试过。

$pdf->SetFont('freeserif', '', 14, '', true);
于 2013-11-15T17:29:23.617 回答
10

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

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

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

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

于 2012-02-16T06:58:34.780 回答
8

要使用带有特殊字符(如 ฿、포 或其他字符)的 TCPDF, 您需要使用unicode字体:

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

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

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

  3. 这将创建如下字体:

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

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

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

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

于 2013-07-02T15:08:21.340 回答
5

你有问题从数据库中读取像卡纳塔克邦这样的字符并像这样显示 卡恩?塔卡 我的意思是“?” 我们不想要的然后做以下事情:

  1. 为连接定义字符集 ( 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);
    
  2. 使用 $pdf->SetFont('DejaVuSerif', '', 10);代替$pdf->SetFont('helvetica', 'B', 12);

    • 对于 PHP 的 TCPDF 库,从数据库中读取Rājasthān等字符而不是R?jasth?n
于 2012-05-15T10:12:31.867 回答
3

IIRC,您可以在创建新字体时定义编码,如此处所述。否则,您必须使用创建字体时定义的编码。听起来 TCPDF 附带的字体都使用 WinAnsiEncoding ......又名代码页 1252。

笨拙,但有效。

于 2011-03-17T17:25:42.363 回答
3

使用默认的 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);
于 2013-05-27T19:14:32.853 回答
2

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

于 2012-11-16T12:44:47.933 回答
1

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

于 2012-04-15T22:44:16.563 回答
0

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

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

它会帮助你。

于 2011-11-21T07:10:07.503 回答
0
$fontname = $pdf->addTTFfont('C:\xampp\htdocs\copyshop\fonts\07-TH-Sarabun-PSK\THSarabun.ttf', 'TrueTypeUnicode', '', 32);
    $pdf->SetFont($fontname, '', 16,'',FALSE); //Working
于 2014-01-11T18:00:43.720 回答
0

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

于 2017-04-04T10:38:24.080 回答
0

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

$pdf->SetFont('cid0cs', '', 12);
于 2019-08-26T12:17:07.743 回答