使用DejaVu Sans时Dompdf返回500错误,如何支持扩展拉丁字符?
解决Dompdf 2.0使用DejaVu Sans时的500错误及扩展拉丁字符支持问题
错误原因分析
报错Path cannot be empty in FontMetrics.php:233说明Dompdf无法找到指定的DejaVu Sans字体文件路径,导致PDF渲染时触发致命错误。Dompdf默认集成DejaVu字体,但可能因安装不完整、路径配置缺失导致无法正常加载。
解决方案
方案1:确认字体完整性并配置字体路径
- 检查字体文件:查看项目
vendor/dompdf/dompdf/lib/fonts目录,确认存在DejaVuSans.ttf、DejaVuSans-Bold.ttf等相关字体文件。若缺失,执行composer install重新安装Dompdf。 - 手动指定路径:初始化Dompdf时,通过Options明确设置字体目录和缓存路径:
<?php require 'vendor/autoload.php'; use Dompdf\Dompdf; use Dompdf\Options; $options = new Options(); $options->set('isRemoteEnabled', true); // 指定字体存放目录 $options->set('fontDir', __DIR__ . '/vendor/dompdf/dompdf/lib/fonts'); // 指定字体缓存目录 $options->set('fontCache', __DIR__ . '/vendor/dompdf/dompdf/lib/fonts'); $dompdf = new Dompdf($options); $php = file_get_contents("inputPdfData.php"); $dompdf->setPaper('A4', 'portrait'); $dompdf->loadHtml($php); $dompdf->render(); $dompdf->stream();
方案2:手动注册DejaVu Sans字体
如果自动加载字体失败,可直接将DejaVu Sans注册到Dompdf的FontMetrics:
<?php require 'vendor/autoload.php'; use Dompdf\Dompdf; use Dompdf\Options; use Dompdf\FontMetrics; $options = new Options(); $options->set('isRemoteEnabled', true); $dompdf = new Dompdf($options); // 注册常规字重的DejaVu Sans $fontMetrics = $dompdf->getFontMetrics(); $fontMetrics->registerFont([ 'family' => 'DejaVu Sans', 'style' => 'normal', 'weight' => 'normal', 'path' => __DIR__ . '/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ttf', ]); // 可选:注册粗体版本 $fontMetrics->registerFont([ 'family' => 'DejaVu Sans', 'style' => 'normal', 'weight' => 'bold', 'path' => __DIR__ . '/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ttf', ]); $php = file_get_contents("inputPdfData.php"); $dompdf->setPaper('A4', 'portrait'); $dompdf->loadHtml($php); $dompdf->render(); $dompdf->stream();
方案3:使用自定义嵌入字体
若上述方案无效,可直接嵌入支持扩展拉丁字符的字体文件:
- 将支持波兰语字符的.ttf字体文件放到项目目录(如
fonts/文件夹)。 - 在HTML的CSS中通过
@font-face引入:
<html lang="pl"> <head> <title>PDF GENERATOR</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> @font-face { font-family: 'PolishSupportFont'; src: url('fonts/your-font-file.ttf') format('truetype'); font-weight: normal; font-style: normal; } * { font-family: 'PolishSupportFont', sans-serif; } </style> </head> <body> ążćęłóńź ĄŻĘĆŹŁÓŃ </body> </html>
确保Dompdf的isRemoteEnabled已设为true,且字体文件路径正确。
验证
修改代码后重新生成PDF,确认无500错误,且ążćłóńę等扩展拉丁字符正常显示。
内容的提问来源于stack exchange,提问作者bHiro
相关产品推荐
相关产品推荐

