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

问题描述 投票:2回答:4

我正在使用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

这里有任何想法,为什么订购会有所作为?

fpdf
4个回答
3
投票

我已经回顾了你的问题,我理解你正试图添加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*/

如果有什么不清楚请告诉我,我很乐意帮助你!


0
投票

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

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

  • [0] =>快递
  • [1] => helvetica
  • [2] =>次
  • [3] =>符号
  • [4] => zapfdingbats

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


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生成php文件中使用与另一个别名相同的字体时,这个$fontkey值运行不正常:

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

这会给你错误:

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

因为它在fontkey font_for_big_titles下加载了缓存的字体。

所以这就是你得到那个错误的原因。快速修复:删除缓存文件。

一些公共回购似乎没有发生tFPDF(?),遗憾的是只有非正式的回购。我目前正在测试的修复程序如下:

找到说:

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

然后在它之后添加一个换行符:$fontkey = $family.$style;这应该将缓存中的fontkey覆盖到刚刚设置的fontkey。


0
投票

我有同样的问题,在我的例子中,生成的mtx.php文件(在你的font / unicode文件夹中)包含文件的本地路径。

改变:

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

至:

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

这解决了这个问题。

另外,仔细检查$ fontkey的值,该值需要与您在FPDF中给出的别名相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.