TCPDF,“无法包含字体定义文件”和OpenType字体

时间:2013-10-15 15:50:49

标签: php fonts tcpdf opentype

我是一名网络程序员,对字体没有深入的了解,并且很难让TCPDF包含我们的自定义OpenType字体。我们购买了OpenType字体文件(.oft),它们不受任何DRM保护。

关于此错误消息的许多问题最终会获得相同的建议。我为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),这似乎更明显,因为它不包含对任何字体类型的任何引用。但是,我无法使用此函数处理它所拥有的小文档。

非常感谢任何帮助。

6 个答案:

答案 0 :(得分:12)

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

这两种方法可能有点令人困惑,但几个月前我给自己写了一些笔记,我将在下面部分重现,希望它能以某种方式帮助你:

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

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

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

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

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

最重要的是,您需要确保调用addTTFFont()生成“原始”字体文件并将其保存到fonts文件夹中。每种样式应该有三个文件,扩展名为.php.z.ctg.z。因此,如果您转换了名为blah.ttf的字体,则最终会得到blah.phpblah.zblah.ctg.z。如果您转换blah bold.ttf,TCPDF会发现它是粗体字,并在文件名的末尾附加“b”:blahb.phpblahb.zblahb.ctg.z

希望这里有一些金块可以提供帮助!祝你好运!

答案 1 :(得分:4)

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

使用Converter Link:

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

答案 2 :(得分:1)

通过生成字体解决此问题。

确保所有路径都正确。

使用此link

请务必将文件夹public class TabView extends Form { private Tabs tabs; public TabView() { super("Radio Web", new BorderLayout()); tabs = new Tabs(Component.BOTTOM); addComponent(BorderLayout.CENTER, tabs); tabs.setSwipeActivated(false); Component component = null; Button playButton = new Button(FontImage.createMaterial(FontImage.MATERIAL_PLAY_ARROW, UIManager.getInstance().getComponentStyle("Title"), 10)); playButton.getAllStyles().setBorder(RoundBorder.create().color(0x94170C)); playButton.getAllStyles().setMarginBottom(0); playButton.getAllStyles().setMarginLeft(0); playButton.getAllStyles().setMarginTop(0); Label mediaInfoLabel = new Label("Artist - Title"); mediaInfoLabel.getAllStyles().setPaddingTop(2); mediaInfoLabel.getAllStyles().setPaddingBottom(2); Slider volumeSlider = new Slider(); volumeSlider.setMinValue(0); volumeSlider.setMaxValue(100); volumeSlider.setEditable(true); Container box = GridLayout.encloseIn(1, new Container(), volumeSlider, mediaInfoLabel); Container south = new Container(new FlowLayout(Component.LEFT, Component.BOTTOM)); south.getAllStyles().setBgPainter(new BackgroundPainter(south) { @Override public void paint(Graphics g, Rectangle rect) { int color = g.getColor(); int alpha = g.getAlpha(); g.setColor(0xD12115); g.setAlpha(255); int y = rect.getHeight() / 2; g.fillRect(0, y, rect.getWidth(), rect.getHeight() - y); g.setColor(color); g.setAlpha(alpha); } }); south.add(playButton).add(box); component = BorderLayout.south(south); component.getAllStyles().setBgPainter(new BackgroundPainter(component) { @Override public void paint(Graphics g, Rectangle rect) { int color = g.getColor(); int alpha = g.getAlpha(); g.setColor(0x150100); g.setAlpha(255); g.fillRect(0, 0, rect.getWidth(), rect.getHeight()); g.setColor(color); g.setAlpha(alpha); } }); tabs.addTab("", FontImage.MATERIAL_AUDIOTRACK, 5, component); BrowserComponent sito = new BrowserComponent(); sito.setURL("https://www.codenameone.com"); tabs.addTab("", FontImage.MATERIAL_HTTP, 5, sito); BrowserComponent fb = new BrowserComponent(); fb.setURL("https://www.facebook.com"); tabs.addTab("", FontImage.MATERIAL_FACE, 5, fb); } } 放在make_font

的文件夹中

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

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

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

例如在生成pdf时使用:

正确:html2pdf

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

请记住,只生成了2个文件:

  

latoi.php

     

latoi.z

您不需要任何ctg文件。

我希望它会有所帮助

答案 3 :(得分:0)

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

答案 4 :(得分:0)

就我而言,这只是.ttf字体文件(没有找到)的错误路径。 为了进行测试,我成功使用了驱动器D:/,但是忘记了在使用C:/命令的代码行中将其更改回我的php文件中的生产驱动器addTTFfont('C:/...')。 / p>

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

答案 5 :(得分:0)

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