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

使用FPDM的Merge(true)时无法正常打印€符号的问题求助

问题:FPDM结合PHP 8.2.5处理PDF表单时欧元符号显示异常

在使用FPDM库处理PDF表单时,欧元符号(€)出现显示异常:

  • 调用Merge(false)时,符号正常显示为20.5€
  • 调用Merge(true)时,符号变为乱码⇬

已尝试以下方案均无效:

  • 用utf8_decode处理后显示为?
  • 修改FPDMLoad方法的第二个参数无变化
  • 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:42:52