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

处理含日文的HTML转PDF时触发SAXParseException错误求助

解决日文HTML解析生成PDF的XML格式错误问题

我之前碰到过几乎一模一样的问题,罪魁祸首是编码配置不匹配加上Tidy生成的XHTML不符合XML规范,导致后续ITextRenderer在解析时抛出XML相关的异常。下面是亲测有效的解决步骤:

1. 统一配置Tidy的编码为UTF-8

日文属于多字节字符,必须确保Tidy的输入输出都使用UTF-8编码,否则会出现乱码或者无效字符问题。代码示例:

import org.w3c.tidy.Tidy;
import java.nio.charset.StandardCharsets;

Tidy tidy = new Tidy();
// 设置输入编码为UTF-8
tidy.setInputEncoding(StandardCharsets.UTF_8.name());
// 设置输出编码为UTF-8
tidy.setOutputEncoding(StandardCharsets.UTF_8.name());
// 生成符合XML规范的XHTML(关键!默认可能生成非严格XML的HTML)
tidy.setXmlOutput(true);
// 添加XML声明,明确告知解析器编码格式
tidy.setXmlPi(true);

2. 读取HTML时强制使用UTF-8

不管是从文件读取还是字符串传入,都要确保HTML内容是以UTF-8编码加载的,避免平台默认编码干扰:

// 从文件读取HTML的示例
FileInputStream fis = new FileInputStream("your-input.html");
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
// 用Tidy处理输入
Document doc = tidy.parseDOM(isr, null);

3. 调整Tidy参数保证XHTML合规

额外配置一些Tidy参数,减少生成XHTML时的格式问题,避免XML解析器报错:

// 关闭不必要的警告输出
tidy.setShowWarnings(false);
tidy.setQuiet(true);
// 即使有轻微错误也强制输出XHTML
tidy.setForceOutput(true);
// 禁用自动换行,避免换行导致的XML格式问题
tidy.setWrap(-1);

4. 验证Tidy生成的XHTML

可以把Tidy处理后的XHTML输出到临时文件,检查以下几点:

  • 开头是否有XML声明:<?xml version="1.0" encoding="UTF-8"?>
  • 日文内容是否正常显示,没有乱码
  • 不存在未转义的特殊字符(比如&需要转义为&amp;,不过你的内容里的●是合法Unicode字符,不需要转义)

5. 确保ITextRenderer用UTF-8加载XHTML

最后一步,ITextRenderer加载处理后的XHTML时,也要保证编码一致:

import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.StringWriter;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

// 将Tidy处理后的DOM转为字符串
StringWriter writer = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
String xhtmlContent = writer.toString();

// 用ITextRenderer生成PDF
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(xhtmlContent);
renderer.layout();
renderer.createPDF(new FileOutputStream("output.pdf"));

按照这些步骤配置后,应该就能解决那个XML格式错误,顺利生成包含日文内容的PDF了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:50:27