在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
相关产品推荐
相关产品推荐

