TCPDF UTF-8。立陶宛符号没有出现

时间:2011-03-17 01:07:58

标签: php pdf utf-8 pdf-generation tcpdf

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

任何帮助都将不胜感激。

15 个答案:

答案 0 :(得分:29)

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

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

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

答案 1 :(得分:14)

将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);

答案 2 :(得分:11)

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

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

答案 3 :(得分:9)

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

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

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

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

答案 4 :(得分: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 /字体/ arialuni.ctg.z
      应用程序/库/ TCPDF /字体/ arialuni.php
      应用/库/ TCPDF /字体/ arialuni.z

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

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

  6. 资料来源: http://myridia.com/dev_posts/view/852

答案 5 :(得分:8)

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

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

答案 6 :(得分:4)

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

  1. 定义连接的charset(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 来自数据库

答案 7 :(得分:3)

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

笨重但有效。

答案 8 :(得分:2)

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

答案 9 :(得分:2)

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

答案 10 :(得分:1)

默认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 :(得分:0)

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

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

它会帮助你。

答案 12 :(得分:0)

$fontname = $pdf->addTTFfont('C:\xampp\htdocs\copyshop\fonts\07-TH-Sarabun-PSK\THSarabun.ttf', 'TrueTypeUnicode', '', 32);
    $pdf->SetFont($fontname, '', 16,'',FALSE); //Working

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

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