【问题标题】:TCPDF, "Could not include font definition file" with OpenType fontsTCPDF,“无法包含字体定义文件”与 OpenType 字体
【发布时间】:2013-10-23 12:24:20
【问题描述】:

我是一名网络程序员,对字体没有深入的了解,并且正在努力让 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 information page,但没有运气。我注意到TCPDF 也有addFont() 函数(documentation here),因为它不包含对任何字体类型的任何引用,所以使用起来似乎更明显。但是,我无法让这个函数与它所拥有的小文档一起工作。

任何帮助将不胜感激。

【问题讨论】:

  • OTF 是与 TTF 不同的格式

标签: php fonts tcpdf opentype


【解决方案1】:

您确定在调用addTTFfont() 时遇到该错误吗?我问的原因是因为我检查了 TCPDF 代码(只是对“无法包含字体定义文件”进行了全局搜索)并且该消息仅出现在 addFont() 方法中。

这两种方法可能有点混乱,但几个月前我给自己写了一些笔记,我将在下面部分复制,希望对你有所帮助:

  • addTTFfont() - 此方法的主要功能是将字体从 TTF(或 OTF)转换为 TCPDF 所需的“原始”版本。这个函数的实现方式,理论上,您可以将其用作向文档添加字体的主要方法。它将首先检查 tcpdf 字体文件夹,如果转换后的文件不存在,它将继续进行转换。这只是一点点开销,但仍然不是我向文件添加字体的首选方法,因为您需要知道要转换的字体样式才能使该过程成功运行。 IMO,最好使用此方法预先转换您计划使用的任何字体,然后简单地使用addFont() 将“原始”版本添加到文档中。

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

  • SetFont() - 这将为您编写的下一个文本块设置字体。

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

如果addFont() 失败并显示上述错误消息,则意味着它找不到字体定义文件。请记住,如果您使用样式集('i'、'b'、'bi' 等)调用 addFont(),它所做的只是将其附加到文件名(在扩展名之前)。

最重要的是,您需要确保您对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(定义)文件的创建失败。
  • 没错,您最终应该得到三个文件(.php、.z 和 .ctg.z)。奇怪的是 addTTFfont() 只会创建 .z 文件而不是其他两个文件。函数返回的是字体名称(表示成功)还是布尔值 false(表示错误)?
  • 更新:我刚刚尝试转换一个 TCPDF 不喜欢的 TTF 文件,它创建了 .z 文件,但其他两个文件都没有。该函数返回 FALSE。在我的特殊情况下,在 tcpdf_fonts.php 中的第 365 行附近检查“snft 版本”时它失败了(我使用的是 6.0.039 版,但我认为这个文件最近没有太大变化)。老实说,虽然作者在 TCPDF 方面做得非常出色,但字体转换方面一直是我生活的祸根,所以我使用了其他方法来转换我的字体。
  • 感谢您进一步研究 JamesG。你能告诉我你找到了哪些转换字体的替代方法吗?我们真的很想在 PDF 文件中使用我们的字体。
  • 老实说,我在这个网站上取得了最大的成功:xml-convert.com/en/convert-tff-font-to-afm-pfa-fpdf-tcpdf 你必须首先从 OTF 转换为 TTF,但我认为还有其他网站可以公平地处理这方面的问题容易地。您可能遇到的另一个问题是许多(大多数?全部?)OTF/TTF 字体具有两字节编码,但 PostScript 字体(addTTFfont() 和该网站都转换为)使用单字节编码,这意味着您只能从原始字体中获取前 255 个字符。祝你好运!
【解决方案2】:

通过生成字体来解决这个问题。

确保所有路径都正确。

使用这个link

记得把文件夹make_font放在html2pdf的文件夹里面

记住正确的路径:html2pdf.class.php index.php 中的 make_font 文件夹内

如果您有其他问题 - 字体:无法包含字体定义文件:

这是你的新字体名称正确的问题。

例如在生成pdf时使用:

正确:$html2pdf->addFont('lato i', '', 'latoi.php');

不正确:$html2pdf->addFont('lato', '', 'latoi.php');

记住只生成了 2 个文件:

latoi.php

latoi.z

您不需要任何 ctg 文件。

希望对你有帮助

【讨论】:

    【解决方案3】:

    TCPPDF 新字体添加和土耳其字符问题解决方法。

    使用转换器链接:

    1. http://fonts.snm-portal.com
    2. 下载 3 个文件,
    3. 复制 TCPDF-master/fonts
    4. 用途:$pdf->SetFont('roboto', '', 14);

    【讨论】:

      【解决方案4】:

      就我而言,问题是字体路径不可写。我通过更改文件夹的权限来修复它:var_dump(K_PATH_FONTS);

      【讨论】:

        【解决方案5】:

        在我的情况下,这只是一个错误的路径(找不到更多).ttf 字体文件。 在测试中,我成功使用了驱动器D:/,但我忘记在我使用addTTFfont('C:/...') 命令的代码行中的php 文件中将它改回prod 驱动器C:/

        不幸的是,TCPDF 错误消息没有输出任何关于源文件和产生问题的代码行的信息。

        【讨论】:

          【解决方案6】:

          将dejavusans.php文件添加到字体文件夹到tcpdf库到codeingiter库文件夹中。

          【讨论】:

          • 您好,欢迎来到 StackOverflow!你指的是什么文件dejavusans.php,从哪里得到它?
          • 是的,从谷歌下载并添加到 Codeigniter 的库和字体文件夹中
          【解决方案7】:

          “cid0jp”这个字体支持日文和中文。

          【讨论】:

            猜你喜欢
            • 2013-06-22
            • 2013-01-05
            • 2019-12-07
            • 2014-06-27
            • 2022-12-11
            • 2014-04-01
            • 2013-07-27
            • 2011-03-25
            • 2017-12-22
            相关资源
            最近更新 更多