如何在CodeIgniter 4中为Dompdf库添加Arial字体?
在CodeIgniter 4中为Dompdf配置Arial字体的正确步骤
你的问题核心在于路径配置不严谨、字体文件可能未正确注册,以下是针对性的解决步骤:
1. 确认字体文件的有效性
- 不要手动创建
Arial.php和Arial.afm,必须通过Dompdf官方的load_font.php脚本生成:- 下载Dompdf官方脚本,本地运行:
php load_font.php Arial /path/to/your/Arial.ttf - 生成的三个文件(ttf、afm、php)才是Dompdf能识别的有效文件。
- 下载Dompdf官方脚本,本地运行:
- 打开生成的
Arial.php,检查$font['family']值必须为'Arial',与代码中defaultFont的设置完全一致。
2. 修正CodeIgniter 4的路径配置
CI4中禁止使用相对路径,必须用框架提供的绝对路径常量,避免因入口位置导致路径错误:
// 替换原有的相对路径设置 $options->set('fontDir', FCPATH . 'vendor/dompdf/dompdf/lib/fonts/'); $options->set('fontCache', FCPATH . 'vendor/dompdf/dompdf/lib/fonts/');
推荐将字体文件移至
WRITEPATH . 'fonts/'(CI4的可写目录),避免vendor目录更新时被覆盖,同时确保PHP有读写权限。
3. 手动注册字体(强制识别)
在初始化Dompdf后,手动注册Arial字体,确保Dompdf能精准识别:
use Dompdf\FontMetrics; $fontMetrics = $dompdf->getFontMetrics(); $fontMetrics->registerFont([ 'family' => 'Arial', 'style' => 'normal', 'weight' => 'normal', 'uri' => FCPATH . 'vendor/dompdf/dompdf/lib/fonts/Arial.ttf' ]);
4. 优化CSS字体声明
为避免字体匹配失败,在CSS中添加fallback选项:
body { font-family: Arial, sans-serif; }
修改后的完整测试代码(适配CI4)
<?php namespace App\Controllers; use CodeIgniter\Controller; use Dompdf\Dompdf; use Dompdf\Options; use Dompdf\FontMetrics; class PdfTest extends Controller { public function index() { // 配置Dompdf选项,使用绝对路径 $options = new Options(); $options->set('fontDir', FCPATH . 'vendor/dompdf/dompdf/lib/fonts/'); $options->set('fontCache', FCPATH . 'vendor/dompdf/dompdf/lib/fonts/'); $options->set('defaultFont', 'Arial'); $dompdf = new Dompdf($options); // 手动注册Arial字体 $fontMetrics = $dompdf->getFontMetrics(); $fontMetrics->registerFont([ 'family' => 'Arial', 'style' => 'normal', 'weight' => 'normal', 'uri' => FCPATH . 'vendor/dompdf/dompdf/lib/fonts/Arial.ttf' ]); // 测试HTML内容 $html = ' <html> <head> <style> body { font-family: Arial, sans-serif; } </style> </head> <body> <h1>这是使用Arial字体的测试PDF</h1> <p>检查Arial字体是否正确显示在PDF中。</p> </body> </html>'; $dompdf->loadHtml($html); $dompdf->setPaper('A4', 'portrait'); $dompdf->render(); // 输出PDF到浏览器 $dompdf->stream("output.pdf", ["Attachment" => false]); } }
额外排查点
- 检查字体文件夹的权限,确保PHP用户拥有读写权限(尤其是缓存目录)。
- 删除fontCache目录下的旧缓存文件,重新生成新的缓存。
- 验证
Arial.ttf文件未损坏,可通过系统字体查看器打开确认。
内容的提问来源于stack exchange,提问作者mdrr5545
相关产品推荐
相关产品推荐

