You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CodeIgniter 4中为Dompdf库添加Arial字体?

在CodeIgniter 4中为Dompdf配置Arial字体的正确步骤

你的问题核心在于路径配置不严谨、字体文件可能未正确注册,以下是针对性的解决步骤:

1. 确认字体文件的有效性

  • 不要手动创建Arial.php和Arial.afm,必须通过Dompdf官方的load_font.php脚本生成:
    1. 下载Dompdf官方脚本,本地运行:php load_font.php Arial /path/to/your/Arial.ttf
    2. 生成的三个文件(ttf、afm、php)才是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:23:16