处理含日文的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"?> - 日文内容是否正常显示,没有乱码
- 不存在未转义的特殊字符(比如
&需要转义为&,不过你的内容里的●是合法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
相关产品推荐
相关产品推荐

