PDFlib生成PDF时报bad font handle 0错误如何解决?
问题原因
报错bad font handle 0的核心是你传入info_textline()的字体句柄值为0,代表load_font()加载字体失败:PDFlib加载字体成功会返回正整数的有效句柄,加载失败才会返回0。常见的加载失败原因如下:
- 字体路径错误:你使用的
fonts/xxx是相对路径,相对路径是相对于PHP执行时的工作目录,不是字体加载代码所在文件的目录,路径不匹配会加载失败。 - 文件名不完整:自定义字体加载需要写全文件名(包含.ttf/.otf等后缀),如果漏写后缀、大小写不匹配(Linux系统大小写敏感)、字体文件损坏都会加载失败。
- 权限不足:Web服务运行用户(如www-data、apache)对fonts目录和字体文件没有可读权限,导致无法读取字体文件。
- 调用时机错误:
load_font()必须在begin_document()执行之后调用,未初始化文档就提前加载字体也会返回无效句柄。 - 函数传参错误:调用
createHeaderText()时参数顺序错误,把其他值传到了$fontMedium/$fontRegular的参数位,导致传入无效句柄。
解决方法
按照以下步骤逐步排查即可:
- 先在字体加载代码后增加错误校验,输出具体的失败原因:
// 建议先拼接成绝对路径避免相对路径歧义 $fontMedium = $p->load_font(__DIR__ . '/fonts/NotoSerif-Medium.ttf', 'unicode', 'embedding'); if ($fontMedium == 0) { die("字体加载失败:" . $p->get_errmsg()); } $fontRegular = $p->load_font(__DIR__ . '/fonts/NotoSerif-Regular.ttf', 'unicode', 'embedding'); if ($fontRegular == 0) { die("字体加载失败:" . $p->get_errmsg()); }
- 确认字体文件名和路径完全匹配,补全文件后缀,Linux环境下注意文件名大小写要和实际文件一致。
- 给字体文件和目录设置可读权限:目录权限设为755,字体文件权限设为644即可。
- 调整代码执行顺序,确保
load_font()在$p->begin_document()之后执行。 - 校验
createHeaderText()的调用参数,确认传入的第二、第三个参数就是你加载得到的$fontMedium和$fontRegular,没有传错顺序。
内容的提问来源于stack exchange,提问作者strayed soul
相关产品推荐
相关产品推荐

