You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

iTextPDF 5.5.4渲染含中文HTML表格时乱码问题求助

解决iTextPDF 5.5.4处理中文HTML表格的乱码问题

嘿,这个问题我太熟了——你看到的“月”其实是UTF-8编码的“月”被错误当成ISO-8859-1(拉丁编码)解析后的乱码,再加上iTextPDF 5.5.4默认不自带中文字体支持,双重因素导致了显示异常。别慌,按下面几步来就能解决:

1. 强制XMLWorker使用UTF-8编码解析

你的代码里已经把HTML字符串转成了UTF-8字节流,但XMLParser默认可能还是用了系统默认编码(比如ISO-8859-1)来解析。改成用InputStreamReader明确指定UTF-8编码,确保解析环节的编码完全一致:

String tableString = "你的含中文HTML表格字符串";
XMLWorker xmlWorker = new XMLWorker(...); // 后面会优化这部分的初始化
XMLParser parser = new XMLParser(xmlWorker);
// 用InputStreamReader指定UTF-8编码,避免编码解析偏差
parser.parse(new InputStreamReader(new ByteArrayInputStream(tableString.getBytes("UTF-8")), "UTF-8"));

2. 给XMLWorker配置中文字体支持

iTextPDF默认没有内置中文字体,就算编码正确,没有对应字体也会显示乱码(或者方框)。你需要手动注册中文字体(比如宋体、黑体):

步骤2.1:准备字体文件

把中文字体文件(比如SimSun.ttf宋体)放到项目的资源目录下,或者直接引用系统字体路径(比如Windows系统的C:/Windows/Fonts/simsun.ttc,0)。

步骤2.2:初始化带字体的XMLWorker

创建FontProvider并注册字体,再传给XMLWorker:

// 创建字体提供者
FontProvider fontProvider = new FontProvider();
// 方式1:引用项目内的字体文件(推荐,避免依赖系统字体)
fontProvider.addFont("simsun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// 方式2:引用系统字体(Windows示例,适合本地开发测试)
// fontProvider.addFont("C:/Windows/Fonts/simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

// 初始化XMLWorker时传入字体提供者
XMLWorker xmlWorker = new XMLWorker(fontProvider, true);
XMLParser parser = new XMLParser(xmlWorker);

3. (可选)在HTML中指定字体

为了更稳妥,你可以在HTML表格的样式里直接指定字体名称,让XMLWorker明确使用你注册的字体:

<table style="font-family: SimSun; font-size: 12px;">
  <tr>
    <td>月份</td>
    <td>销售额</td>
  </tr>
  <!-- 其他表格内容 -->
</table>

按上面的步骤调整后,“月”就能正常显示在PDF里了。

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

火山引擎 最新活动