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




