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

在CodeIgniter中使用Dompdf配置泰米尔字体失败,字符显示为方块的问题求助

解决CodeIgniter中Dompdf渲染泰米尔语字体为方块的问题

嘿,我之前也踩过非拉丁语系字体渲染的坑,方块字符一般意味着Dompdf要么没找到你的字体文件,要么没正确处理泰米尔语的复杂脚本布局。咱们一步步来搞定:

1. 先把字体路径的问题捋清楚

你把Baamini.ttf放在了lib目录,但@font-face里的url('fonts/Baamini.ttf')路径大概率不对——Dompdf解析路径是相对于HTML文件的,不是CodeIgniter的根目录。

  • 试试用服务器物理路径指定字体:
    在视图的@font-face里,用CodeIgniter的常量输出绝对路径:
    @font-face {
        font-family: "Baamini";
        src: url('<?php echo FCPATH . "lib/Baamini.ttf"; ?>') format("truetype");
        font-weight: normal;
        font-style: normal;
    }
    
  • 检查Dompdf的字体缓存目录(默认是dompdf/lib/fonts/):如果字体加载成功,这里会生成对应的.ufm和.ttf.z文件。要是没有,说明路径肯定错了,调整到正确位置就行。

2. 开启Dompdf的Unicode和复杂脚本支持

泰米尔语属于需要复杂文本布局(CTL)的语言,旧版Dompdf默认没开启相关支持:

  • 在控制器初始化Dompdf时,添加这些配置:
    $dompdf = new DOMPDF();
    // 启用HTML5解析器,更好适配现代CSS和字符编码
    $dompdf->set_option('isHtml5ParserEnabled', true);
    // 允许加载本地资源(比如你的字体文件)
    $dompdf->set_option('isRemoteEnabled', true);
    
  • 确保HTML视图头部声明UTF-8编码:
    <meta charset="UTF-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    

3. 直接在Dompdf中注册字体(更稳妥的方式)

有时候@font-face的路径问题很难排查,直接用Dompdf的字体注册功能更靠谱:

在控制器加载Dompdf后,添加这段代码注册字体:

$this->load->helper(array('dompdf', 'file'));
$dompdf = new DOMPDF();

// 注册Baamini字体
$font_path = FCPATH . 'lib/Baamini.ttf'; // 替换成你实际的字体路径
$dompdf->getFontMetrics()->registerFont(array(
    'family' => 'Baamini',
    'style' => 'normal',
    'weight' => 'normal',
    'src' => $font_path
));

// 后续代码不变,注意你之前拼写错了portrait!
$html = $this->load->view('ret_purchase/vendor_ack', $data, true);
$dompdf->load_html($html);
$dompdf->set_paper('A4', "portrait" );
$dompdf->render();
$dompdf->stream("VendorAck.pdf",array('Attachment'=>0));

然后在视图的CSS里直接用:

body{ font-family: "Baamini"; }

4. 检查文件编码和内容

  • 确保你的视图文件(vendor_ack.php)是UTF-8无BOM编码:很多编辑器默认会加BOM,这会导致字符解析错误。
  • 确认你要渲染的泰米尔语内容本身是正确的UTF-8编码,没有乱码。

5. 升级Dompdf到最新版本

旧版Dompdf对泰米尔语这类CTL语言的支持很差,如果你用的是老版本,建议升级到最新版——新版对非拉丁语系字体的渲染有很大改进。

另外,你之前的代码里set_paper的参数拼写错了,是portrait不是portriat,虽然这不是字体问题,但也一起改了吧!

内容的提问来源于stack exchange,提问作者Vinoth Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:27:29