使用XSL将XML转PDF时遇META标签未闭合错误,求解决方法
解决XSL生成HTML中
<meta>标签未闭合导致的xhtmlrenderer解析错误 这个问题我之前用Flying Saucer转PDF时也碰到过,核心原因是xhtmlrenderer依赖严格的XHTML规范,而普通HTML的<meta>无闭合标签写法不符合XML语法要求,所以才会抛出SAXParseException。下面给你几个靠谱的解决办法:
1. 直接修改XSL模板中的<meta>标签写法
最简单的方式就是在XSL里把<meta>改成XHTML认可的形式:
- 推荐用自闭合标签(XHTML标准写法):
<meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - 或者明确添加闭合标签(虽然少见,但也符合规范):
<meta charset="UTF-8"></meta>
2. 配置XSLT输出为严格XHTML格式
如果你的XSL里有很多类似的空标签(比如<link>、<br>),一个个修改太麻烦,可以直接在XSL的根节点设置输出规则,强制生成XML格式的XHTML:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 添加输出配置 --> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/> <!-- 你的其他模板逻辑 --> </xsl:stylesheet>
这里method="xml"会让XSLT转换器自动把所有空标签处理成自闭合形式,完全符合XML语法,从根源上避免标签未闭合的问题。注意如果之前用的是method="html",它会生成HTML风格的非闭合标签,这就是问题的诱因。
3. (备选)调整渲染器的解析宽松度
如果实在没办法修改XSL,可以尝试让xhtmlrenderer忽略XML解析的严格检查(不推荐,可能引入其他潜在问题)。以常用的Flying Saucer为例,可以自定义XMLReader来忽略非致命错误:
// 创建宽松的XMLReader XMLReader xmlReader = XMLReaderFactory.createXMLReader(); // 关闭外部DTD加载,避免额外依赖 xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); // 设置自定义错误处理器,忽略非致命错误 xmlReader.setErrorHandler(new DefaultHandler() { @Override public void error(SAXParseException e) throws SAXException { // 这里可以只打印错误,不抛出异常 System.err.println("解析警告: " + e.getMessage()); } }); // 使用这个Reader加载HTML文档 ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(xmlReader, new InputSource(new StringReader(htmlContent))); renderer.layout(); renderer.createPDF(outputStream);
总结
优先选择前两种方法,尤其是第二种配置XSL输出的方式,既能解决当前的<meta>问题,还能保证整个文档的XHTML合规性,避免后续其他标签的类似错误。
内容的提问来源于stack exchange,提问作者Karthikeyan
相关产品推荐
相关产品推荐

