tFDPF中的AddFont调用顺序会产生错误

时间:2014-07-14 07:28:21

标签: fpdf

我正在使用tFPDF库(扩展的fpdf包含unicode字体)。

添加多种字体时遇到了一个奇怪的问题。以下代码不会产生错误:

$pdf->AddFont('DejaVu','','DejaVuSans.ttf',true);
$pdf->AddFont('DejaVuBold','','DejaVuSans-Bold.ttf',true);
$pdf->AddFont('DejaVuBoldOblique','','DejaVuSans-Oblique.ttf',true);
$pdf->AddFont('DejaVuOblique','','DejaVuSans-BoldOblique.ttf',true);

但是你可以看到,我不小心添加了一个名为“DejaVuBoldOblique”的字体,它实际上只是倾斜的,“DejaVuOblique”既是倾斜又倾斜。因此,当我渲染PDF时,文本未按预期显示。但是,当我将代码修复为:

时出现错误
$pdf->AddFont('DejaVu','','DejaVuSans.ttf',true);
$pdf->AddFont('DejaVuBold','','DejaVuSans-Bold.ttf',true);
$pdf->AddFont('DejaVuOblique','','DejaVuSans-Oblique.ttf',true);
$pdf->AddFont('DejaVuBoldOblique','','DejaVuSans-BoldOblique.ttf',true);

FPDF错误:未定义的字体:dejavuoblique

这里有任何想法,为什么订购会产生影响?

4 个答案:

答案 0 :(得分:2)

我已经回答了你的问题我的理解是你试图添加DejaVu和DejaVu Bold字体。 你的代码:

$pdf->AddFont('DejaVu','','DejaVuSans.ttf',true);
$pdf->AddFont('DejaVuBold','','DejaVuSans-Bold.ttf',true);

使用下面的代码而不是上面的代码:

// Add a Unicode font (uses UTF-8)
$tfpdf->AddFont('DejaVu', '', 'DejaVuSansCondensed.ttf', true);
$tfpdf->AddFont('DejaVu', 'B', 'DejaVuSansCondensed-Bold.ttf', true);

DejaVuSansCondensed tFPDF最新版本中提供的字体,即(http://www.fpdf.org/en/script/script92.php

下载后,你必须在tfpdf.php文件函数“SetFont”中进行少量更改。粘贴在第619行的代码下面。

/* Modified by Vinod Patidar due to font key does not match in dejavu bold.*/
if ( $family == 'dejavu' && !empty($style) && ($style == 'B' || $style == 'b') ) {
    $fontkey = $family.' '.strtolower($style);
} else {
    $fontkey = $family.$style;  
}
/* Modified end here*/

如果有任何不清楚的地方,请告诉我,我很乐意帮助您!

答案 1 :(得分:0)

tl; dr:将tfpdf.php中的第614行更改为if($family=='arial' || $family=='dejavu')

要获得使用DejaVu(提供的字体文件)的不同字体样式(粗体等),您需要将其添加为核心字体。在文件tfpdf.php中,如果添加print_r($this->CoreFonts);,您将看到以下核心字体系列:

  • [0] =>快递
  • [1] =>黑体
  • [2] =>次
  • [3] =>符号
  • [4] => ZAPFDINGBATS

您需要将DejaVu映射到类似的字体(即Helvetica)。所以在tfpdf文件中,它将Arial映射到Helvetica。你也可以用DejaVu做同样的事。

答案 2 :(得分:0)

使用tFPDF中字体的命名系统(fontkey值)可以改善某些方面。

第一次添加字体时,tfpdf会进行某种缓存(如果unifont目录可写),如果您调用AddFont('font_for_big_titles','','DejaVuSansCondensed.ttf',True),它将创建3个文件:

  1. dejavusanscondensed.cw.dat
  2. dejavusanscondensed.cw172.php
  3. dejavusanscondensed.mtx.php

下次请求文件时,它将从缓存中加载数据。 在dejavusanscondensed.mtx.php内,您会发现(以及其他值):

$fontkey='font_for_big_titles';

我猜想这种缓存对性能有好处,但是不幸的是,当您决定稍后在其他生成PDF的其他PDF文件中使用同一字体和另一个别名时,此$fontkey值不能很好地工作:

AddFont('sub_title_font','','DejaVuSansCondensed.ttf',True)
SetFont('sub_title_font','',24);

这会给您错误:

  

FPDF错误:未定义的字体:sub_title_font

因为它已将字体加载到缓存的字体密钥font_for_big_titles下。

因此,这就是您收到该错误的原因。快速修复:删除缓存文件。

tFPDF的发展似乎没有在某些公共回购协议中发生(不幸的是,只有非正式的回购协议)。我当前正在测试的修复程序如下:

找到以下内容:

    if (file_exists($unifilename.'.mtx.php')) {
        include($unifilename.'.mtx.php');
    }

然后在其后添加换行符:$fontkey = $family.$style;应该将字体密钥从缓存覆盖为您刚刚设置的字体密钥。

答案 3 :(得分:0)

我遇到了同样的问题,就我而言,生成的mtx.php文件(在您的font / unicode文件夹中)包含该文件的本地路径。

已更改:

$ttffile="/Volumes/path/to/font.ttf"

收件人:

$ttffile=$_SERVER["DOCUMENT_ROOT"] . "/path/to/font.ttf"

解决了该问题。

此外,再次检查 $ fontkey 的值,该值必须与您在FPDF中为其指定的别名匹配。