TCPDF, 使用OpenType字体时出现“无法包含字体定义文件”的错误

16

我是一名网页程序员,对字体没有深入了解,正在努力让TCPDF包含我们的自定义OpenType字体。 我们购买了未受任何DRM保护的OpenType字体文件(.oft)。

关于此错误消息的许多问题最终都得到相同的建议。 我已经为TCPDF使用的文件夹设置了正确的文件权限(755),而且我没有问题使用addTTFfont()来像这样包括.ttf TrueType字体:

$pdf->addTTFfont('/path-to-font/DejaVuSans.ttf', 'TrueTypeUnicode', '', 32);

因此,我编写了以下代码以包括我们的OpenFont类型。 addTTFfont()文档似乎表明支持OpenTypeUnicode和OpenType参数。

$pdf->addTTFfont('/path-to-font/customfont.otf', 'OpenTypeUnicode', '', 96);

导致如下:

TCPDF ERROR: Could not include font definition file:

我们使用的是TCPDF v6.0.020,我一直在阅读TCPDF Fonts信息页面 ,但迄今为止没有收获。 我注意到TCPDF还具有addFont()函数(此处为文档) ,它似乎更容易使用,因为它不包括任何字体类型的参考。 但是,我无法使用它的一些文档来使该函数正常工作。

非常感谢任何帮助。


OTF是一种不同于TTF的格式。 - kurdtpage
8个回答

17

您确定在调用addTTFfont()时出现了该错误吗?我之所以问这个问题是因为我检查了TCPDF代码(只是全局搜索了“Could not include font definition file”),而这个消息只出现在addFont()方法中。

这两种方法可能有点令人困惑,但是我几个月前写了一些笔记,下面我将部分复制它们,希望能对您有所帮助:

  • addTTFfont() - 此方法的主要功能是将字体从TTF(或OTF)转换为TCPDF需要的“原始”版本。通过实现这个函数,你可以理论上使用它作为向文档添加字体的主要方法。它将首先检查tcpdf字体文件夹,如果转换后的文件不存在,它将继续进行转换。这只是略微增加一些额外开销,但仍不是我的首选方法来向文件添加字体,因为您需要知道所转换的字体风格,才能使这个过程成功。按照我的看法,最好使用此方法预先转换计划使用的任何字体,然后仅使用addFont()将“原始”版本添加到文档中。

  • AddFont() - 这将“原始”(即已转换)字体添加到文档中,这意味着可以用它来写入文本。

  • SetFont() - 这将设置下一块要写入的文本的字体。

因此,我会使用addTTFfont()预先转换字体为“原始”版本,然后在实际创建PDF的代码中使用addFont()setFont()

如果addFont()失败,并出现上面的错误消息,说明它找不到字体定义文件。请记住,如果您调用addFont()并设置样式('i'、'b'、'bi'等),它只是将其附加到文件名(在扩展名之前)。

最重要的是,你需要确保调用 addTTFFont() 方法并生成 "原始" 字体文件并将其保存到你的字体文件夹中。每种样式应该包含三个文件,文件扩展名分别为 .php, .z.ctg.z。因此,如果你转换了一个名为 blah.ttf 的字体,你将会得到 blah.phpblah.zblah.ctg.z 三个文件。如果你转换的是带粗体的字体 blah bold.ttf,TCPDF 将会自动识别它是粗体字体,并在文件名末尾加上 'b': blahb.phpblahb.zblahb.ctg.z

希望这里有一些对你有所帮助的信息!祝你好运!


是的,我确定。我已经尽力解释我的情况了。每当出现错误后,我都会检查我的服务器,但总是得到相同的结果:只有一个customfont.z文件,没有customfont.php文件。如果我正确理解TCPDF,那么我所描述的错误指向了customfont.php(定义)文件创建失败的问题。 - Seroczynski
没错,你最终应该得到三个文件(.php、.z 和 .ctg.z)。很奇怪的是,addTTFfont() 只会创建 .z 文件而不是另外两个文件。这个函数返回的是字体名称(表示成功)还是布尔值 false(表示出错)? - JamesG
3
说实话,我在这个网站上取得了最大的成功:http://www.xml-convert.com/en/convert-tff-font-to-afm-pfa-fpdf-tcpdf。你需要先将OTF转换为TTF格式,但我认为还有其他一些网站可以轻松处理这个方面。另一个可能会遇到的问题是,许多(大多数?全部?)OTF/TTF字体都采用双字节编码,但PostScript字体(addTTFfont()和那个网站都转换成它)使用单字节编码,这意味着你只能获得原始字体的前255个字符。祝你好运! - JamesG
1
@Kamlesh 是的,我看到了。考虑到原始问题是在大约10年前发布的,而我在5.5年前贴上了对那个页面的引用,我想这是可以预料的。不幸的是,我无法编辑我上面的留言,也找不到其他关于这个信息的引用。互联网归档机器可能会有一份副本... - undefined
是的,@JamesG,我支持你,谢谢 :) - undefined
显示剩余5条评论

8
TCPDF 新增字体和解决土耳其字符问题的方法:
使用转换器链接:
1. 访问 http://fonts.snm-portal.com 2. 下载 3 个文件 3. 复制 TCPDF-master/fonts 文件夹 4. 使用方法:$pdf->SetFont('roboto', '', 14);
图片参考如下:enter image description here

http://fonts.snm-portal.com/建议的链接已经失效,显示错误信息:错误404 - 未找到。 - undefined

1
解决生成字体问题的方法:
确保所有路径都正确。
使用这个链接:link 记得把文件夹make_font放在html2pdf文件夹中。
记得在index.php文件中,将正确的路径指向make_font文件夹中的html2pdf.class.php文件。
或者
如果你遇到了其他问题-字体:无法包含字体定义文件:
这是由于你新字体的名称不正确导致的问题。
例如,在生成pdf时使用:
正确的方式:$html2pdf->addFont('lato i', '', 'latoi.php'); 错误的方式:$html2pdf->addFont('lato', '', 'latoi.php'); 请记住,只有两个文件被生成:

latoi.php

latoi.z

您不需要任何ctg文件。
希望能有所帮助。

https://prgm.spipu.net/php_makefont 提供的链接已失效,显示错误信息“错误404 - 未找到”。 - undefined

0
在我的情况下,问题是字体路径不可写。我通过更改文件夹的权限来解决它:var_dump(K_PATH_FONTS);

0
将dejavusans.php文件添加到tcpdf库的font文件夹中,然后再将其添加到codeingiter库文件夹中。

你好,欢迎来到StackOverflow!你所提到的dejavusans.php文件是什么,它在哪里获取? - Ad5001
是的,从谷歌下载它并将其添加到Codeigniter库和字体文件夹中。 - Rahul Sharma

0

"cid0jp" 这种字体支持日文和中文。


0
在我的情况下,问题只是路径错误,找不到.ttf字体文件了。 为了测试,我成功地使用了驱动器D:/,但是我忘记在我的php文件中将其改回生产驱动器C:/,在我使用addTTFfont('C:/...')命令的代码行中。 不幸的是,TCPDF错误消息没有输出任何关于源文件和产生问题的代码行的信息。

0
对我来说,对于HTML2PDF生成的字体,只有使用«font-weight»才有效。
.font-bold {
    font-family: calibri_b;
    font-weight: 700;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接