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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:09:03