iText7使用convertToImage方法无法添加嵌套SVG问题求助
iText处理嵌套SVG的convertToImage方法报错解决方案
报错原因
c.i.s.r.r.ResourceResolver : Unable to retrieve image with data URI data:image/svg+xml;base64,xxxx
该报错是因为iText默认的资源解析器不支持解析嵌套在SVG内部的base64编码SVG子资源,对image/svg+xml类型的data URI识别、解码逻辑存在默认限制,无法完成内嵌资源的拉取解析。
解决步骤
- 自定义资源解析器类,继承iText的
ResourceResolver,重写retrieveImage方法,新增对svg类型data URI的处理逻辑,手动完成转义还原、base64解码、嵌套SVG转换:
import com.itextpdf.svg.processors.impl.SvgConverterProperties; import com.itextpdf.svg.converter.SvgConverter; import org.apache.commons.lang3.StringEscapeUtils; import java.util.Base64; import java.io.ByteArrayInputStream; import java.io.IOException; public class NestedSvgSupportResourceResolver extends ResourceResolver { private final PdfDocument pdfDocument; public NestedSvgSupportResourceResolver(String baseUri, PdfDocument pdfDocument) { super(baseUri); this.pdfDocument = pdfDocument; } @Override public PdfXObject retrieveImage(String src) throws IOException { // 处理svg类型的data URI if (src.startsWith("data:image/svg+xml;base64,")) { // 先还原HTML转义字符(比如将/还原为/) String unescapedSrc = StringEscapeUtils.unescapeHtml4(src); String base64Content = unescapedSrc.substring("data:image/svg+xml;base64,".length()); byte[] svgByteData = Base64.getDecoder().decode(base64Content); try (ByteArrayInputStream svgInputStream = new ByteArrayInputStream(svgByteData)) { // 递归处理嵌套SVG return SvgConverter.convertToImage(svgInputStream, this.pdfDocument); } } // 其他类型资源走默认逻辑 return super.retrieveImage(src); } }
- 调用
convertToImage方法时,传入配置了自定义资源解析器的SvgConverterProperties参数,替换默认解析逻辑:
// 初始化转换配置 SvgConverterProperties converterProps = new SvgConverterProperties(); converterProps.setBaseUri("your-local-base-uri"); converterProps.setResourceResolver(new NestedSvgSupportResourceResolver("your-local-base-uri", pdfDocument)); // 执行主SVG文件转换 try (InputStream mainSvgStream = new FileInputStream("/path/to/your/main/svg/file")) { Image resultSvgImage = SvgConverter.convertToImage(mainSvgStream, pdfDocument, converterProps); // 后续将生成的Image对象添加到PDF对应位置即可 }
- 如果转换仍失败,先单独提取报错日志中的base64字符串解码,验证嵌套的子SVG文件本身不存在语法错误、标签闭合问题。
内容的提问来源于stack exchange,提问作者haris5sani
相关产品推荐
相关产品推荐

