使用FPDM的Merge(true)时无法正常打印€符号的问题求助
问题:FPDM结合PHP 8.2.5处理PDF表单时欧元符号显示异常
在使用FPDM库处理PDF表单时,欧元符号(€)出现显示异常:
- 调用
Merge(false)时,符号正常显示为20.5€ - 调用
Merge(true)时,符号变为乱码⇬
已尝试以下方案均无效:
- 用
utf8_decode处理后显示为? - 修改FPDM
Load方法的第二个参数无变化 - 使用
chr(128)无法正常显示
当前使用字体为Arial,相关代码示例:
正常显示代码
$pdf = new FPDM('template.pdf'); $fields["name"] = 20.5 . "€"; // 输出 20.5€ $pdf->Load($fields, true); $pdf->Merge(false); $pdf->Output("D", "name.pdf"); return $pdf;
乱码显示代码
$pdf = new FPDM('template.pdf'); $fields["name"] = 20.5 . "€"; // 输出 20.5⇬ $pdf->Load($fields, true); $pdf->Merge(true); $pdf->Output("D", "name.pdf"); return $pdf;
解决方案
1. 转换编码为Windows-1252
Merge(true)依赖FPDF的文本渲染,而FPDF原生仅支持Windows-1252编码。将UTF-8的欧元符号转换为该编码即可:
$euro = mb_convert_encoding("€", "Windows-1252", "UTF-8"); $fields["name"] = 20.5 . $euro;
2. 修正FPDM的字符处理逻辑
如果上述方法无效,可修改FPDM库中Merge(true)模式下的文本处理代码,在写入文本前添加编码转换:
// 在FPDM类的文本输出部分添加 $text = mb_convert_encoding($text, "Windows-1252", "UTF-8");
3. 替换为支持UTF-8的FPDF分支
使用tFPDF(支持UTF-8的FPDF扩展)替代原生FPDF,FPDM可兼容该扩展。替换后直接使用UTF-8编码的欧元符号即可正常显示。
原因解析
Merge(false)是直接填充PDF表单域,表单域默认适配对应字体的编码;而Merge(true)是通过FPDF重新绘制文本,FPDF原生不支持UTF-8,UTF-8格式的欧元符号(3字节)会被错误解析为乱码,转换为Windows-1252编码后(对应单字节0x80)即可被正确识别。
内容的提问来源于stack exchange,提问作者Joel Quenard Martinez
相关产品推荐
相关产品推荐

