如何用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
相关产品推荐
相关产品推荐

