我正在使用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
这里有任何想法,为什么订购会有所作为?
我已经回顾了你的问题,我理解你正试图添加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*/
如果有什么不清楚请告诉我,我很乐意帮助你!
tl; dr:将tfpdf.php中的第614行更改为if($family=='arial' || $family=='dejavu')
要获得使用DejaVu(提供的字体文件)的不同字体样式(粗体等),您需要将其添加为核心字体。在文件tfpdf.php中,如果添加print_r($this->CoreFonts);
,您将看到以下核心字体系列:
您需要将DejaVu映射到类似的字体(即Helvetica)。所以在tfpdf文件中,它将Arial映射到Helvetica。您也可以使用DejaVu。
使用tFPDF中字体的命名系统(fontkey
值)可以改进一些东西。
第一次添加字体时,tfpdf会产生一种缓存(如果unifont目录是可写的),如果你调用AddFont('font_for_big_titles','','DejaVuSansCondensed.ttf',True)
它会创建3个文件:
下次请求文件时,它将从缓存中加载数据。在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。
我有同样的问题,在我的例子中,生成的mtx.php文件(在你的font / unicode文件夹中)包含文件的本地路径。
改变:
$ttffile="/Volumes/path/to/font.ttf"
至:
$ttffile=$_SERVER["DOCUMENT_ROOT"] . "/path/to/font.ttf"
这解决了这个问题。
另外,仔细检查$ fontkey的值,该值需要与您在FPDF中给出的别名相匹配。