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

如何用iText7加载HTML元素并动态替换<img>的src属性?

在iText7中动态替换HTML模板里的标签src属性

要实现动态替换HTML中<img>标签的src属性,你需要通过自定义TagWorker工厂拦截img标签的处理流程,替换属性后再交给iText完成渲染。具体实现步骤如下:

  • 自定义ImageTagWorker子类,重写processEnd方法替换src属性:
public class CustomImageTagWorker extends ImageTagWorker {
    public CustomImageTagWorker(IElementNode element, ProcessorContext context) {
        super(element, context);
    }

    @Override
    public void processEnd(IElementNode element, ProcessorContext context) {
        // 获取原模板中的src占位符
        String originalSrc = element.getAttribute("src");
        // 替换为从数据库或其他来源获取的真实图片路径/URL
        String dynamicSrc = getRealImagePath(originalSrc);
        
        // 更新元素的src属性
        element.setAttribute("src", dynamicSrc);
        
        // 调用父类方法完成后续渲染逻辑
        super.processEnd(element, context);
    }

    // 模拟根据占位符获取动态图片路径的逻辑
    private String getRealImagePath(String placeholder) {
        // 示例:将模板中的"{user_avatar}"替换为真实路径
        if ("{user_avatar}".equals(placeholder)) {
            return "/data/user/avatar/123.png";
        }
        // 其他占位符替换规则...
        return placeholder;
    }
}
  • 创建自定义TagWorkerFactory,指定img标签使用我们的自定义处理类:
public class CustomTagWorkerFactory extends DefaultTagWorkerFactory {
    @Override
    public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
        if ("img".equals(tag.name())) {
            return new CustomImageTagWorker(tag, context);
        }
        return super.getCustomTagWorker(tag, context);
    }
}
  • 在解析HTML模板时,将自定义工厂传入转换配置:
// 读取HTML模板文件内容
String htmlTemplate = new String(Files.readAllBytes(Paths.get("/path/to/template.html")));

// 配置HTML转PDF的属性
ConverterProperties converterProps = new ConverterProperties();
converterProps.setTagWorkerFactory(new CustomTagWorkerFactory());

// 生成PDF文档
PdfDocument pdfDoc = new PdfDocument(new PdfWriter("output.pdf"));
Document doc = new Document(pdfDoc);
List<IElement> elements = HtmlConverter.convertToElements(htmlTemplate, converterProps);
for (IElement element : elements) {
    doc.add(element);
}
doc.close();

特殊场景处理:直接使用数据库中的图片字节流

如果图片是存储在数据库中的字节数组而非文件路径,可以修改CustomImageTagWorker的逻辑,直接生成Image对象替换:

@Override
public void processEnd(IElementNode element, ProcessorContext context) {
    // 从数据库读取图片字节数组
    byte[] imageBytes = getImageBytesFromDB(element.getAttribute("data-img-id"));
    if (imageBytes != null) {
        ImageData imageData = ImageDataFactory.create(imageBytes);
        Image dynamicImage = new Image(imageData);
        // 可选:设置图片尺寸、对齐样式
        dynamicImage.setWidth(150);
        dynamicImage.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 将自定义图片添加到渲染结果中
        getElementResult().add(dynamicImage);
        return;
    }
    // 未获取到动态图片时,执行默认处理逻辑
    super.processEnd(element, context);
}

// 模拟从数据库根据ID获取图片字节的方法
private byte[] getImageBytesFromDB(String imgId) {
    // 数据库查询逻辑...
    return null;
}

内容的提问来源于stack exchange,提问作者Monset

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:32:06