Apache FOP转换XML到PDF时SVG元素base URL设置失败问题排查
SVG嵌入FOP时的URI错误原因分析
问题代码
<xsl:template name="Draft"> <fo:block-container> <fo:block> <fo:instream-foreign-object> <svg:svg xmlns:svg="http://www.w3.org/2000/svg" xml:base="http://example.org/today/" > <svg:defs> <svg:font-face font-family="sample"> <svg:font-face-src> <svg:font-face-uri href="sample.ttf"/> </svg:font-face-src> </svg:font-face> </svg:defs> <svg:text> DRAFT </svg:text> </svg:svg> </fo:instream-foreign-object> </fo:block> </fo:block-container> </xsl:template>
错误日志
org.apache.fop.fo.extensions.svg.SVGElement.getDimension Could not set base URL for svg java.lang.IllegalArgumentException: URI is not absolute at java.base/java.net.URL.fromURI(URL.java:721) at java.base/java.net.URI.toURL(URI.java:1139) at org.apache.fop.fo.extensions.svg.SVGElement.getDimension(SVGElement.java:77) ...
错误原因分析
- 直接触发点:FOP在尝试将SVG的
xml:base属性值转换为URL时,判定该URI不是绝对URI,抛出IllegalArgumentException。 - 可能的深层原因:
- 实际运行时
xml:base值被篡改:代码中写的是绝对URIhttp://example.org/today/,但如果XSLT转换过程中该值被替换为相对路径(比如变量赋值错误、输出时的路径处理问题),就会导致非绝对URI的错误。 - FOP版本兼容性问题:部分旧版本的Apache FOP在处理内嵌于
fo:instream-foreign-object的SVG时,对HTTP协议的绝对URI解析存在bug,无法正确识别其绝对属性。 - 内嵌SVG的
xml:base处理逻辑限制:FOP处理内嵌SVG时,可能期望xml:base指向本地文件系统的绝对路径,而非网络URI,导致网络URI被误判为非绝对URI。
- 实际运行时
- 额外提示:即使解决了当前base URI问题,后续还可能出现
sample.ttf字体加载失败的问题——如果xml:base指向网络地址,FOP需要能够正常访问该网络资源;如果是本地资源,建议使用本地绝对路径作为xml:base。
内容的提问来源于stack exchange,提问作者Rito Sarkar
相关产品推荐
相关产品推荐

