spring 使用Sping Boot 、Flying Saucer和Thymeleaf时,图像无法在PDF模板中显示

jecbmhm3  于 2023-06-28  发布在  Spring
关注(0)|答案(5)|浏览(378)

我使用Sping Boot ,flying saucer,thymeleaf从HTML模板创建一个PDF文件。但是图像没有显示在我的文件中。

项目结构:

代码html:

<div class="col-xs-6 invoice-col-2">
   <img src="../static/images/mastercard.png" alt="mastercard"></img>
</div>

当我将img标签更改为:

<img src="../static/images/mastercard.png" alt="mastercard" th:src="@{static/images/mastercard.png}"></img>

当我创建PDF文件时,我得到一个错误:
org.thymeleaf.exceptions.TemplateProcessingException:链接库“static/images/mastercard.png”不能是上下文相对(/)或页面相对,除非您实现org.thymeleaf.context.IWebContext接口(上下文的类为:org.thymeleaf.context.Context)

fzwojiic

fzwojiic1#

尝试使用Spring的classpath:前缀。这将直接从类路径加载文件,无论您是从.jar还是在IDE中运行。下面是一个例子:

<img alt="mastercard" th:src="@{classpath:static/images/mastercard.png}" />

关于classpath:的更多信息可以在官方文档中找到。

amrnrhlw

amrnrhlw2#

为了在Flying Saucer生成的PDF中嵌入图像,
1)将图像转换为base64编码的字符串。

Path path = Paths.get("src/main/resources/static/images/mastercard.png");
String base64Image = convertToBase64(path);

函数将存储在如上所示路径中的图像转换为base64编码的字符串

private String convertToBase64(Path path) {
    byte[] imageAsBytes = new byte[0];
    try {
      Resource resource = new UrlResource(path.toUri());
      InputStream inputStream = resource.getInputStream();
      imageAsBytes = IOUtils.toByteArray(inputStream);

    } catch (IOException e) {
      System.out.println("\n File read Exception");
    }

    return Base64.getEncoder().encodeToString(imageAsBytes);
  }

2)在thymeleaf上下文中设置base64编码的图像

Context context = new Context();
    String image = "data:image/png;base64, " + base64Image;
    context.setVariable("image",  image);

    String html = templateEngine.process("template", context);

3)在HTML中,设置image的值,如下所示:

<img th:src="${image}" style="width: 200px; height=100px"/>

4)最后,将HTML模板呈现为PDF

ITextRenderer renderer = new ITextRenderer();
  renderer.setDocumentFromString(html); // html -> String created in Step 2
  renderer.layout();
  final ByteArrayOutputStream baos = new ByteArrayOutputStream();
  renderer.createPDF(baos)

现在您有了生成的PDF的byteArrayOutputStream,您可以选择将它们存储到文件服务器或以您选择的格式将其提供给客户端。

zpf6vheq

zpf6vheq3#

使用标准的html源属性和项目根目录的相对路径。
你可以把你的图像放在项目的根目录下,并像这样使用它:

<img src="mastercard.png" />

如果你想要资源文件夹,你可以这样设置:

<img src="src/main/resources/static/images/mastercard.png" />
igetnqfo

igetnqfo4#

我面临着同样的问题,但从磁盘阅读图像文件是一点代价,我建议你去与uri-数据
http://www.tothenew.com/blog/using-data-urls-for-embedding-images-in-flying-saucer-generated-pdfs/
因为你无论如何都要读取图像来生成PDF,最好将其保存在模板中。

goqiplq2

goqiplq25#

@sangeethapradeep的答案几乎对我有用,除了我需要将svg图像转换为base64。所以我用https://pixelied.com/convert/svg-converter/svg-to-base64来转换我的图像,并包含在代码中,它的工作。

相关问题