图像不使用Spring Boot,飞碟和Thymeleaf在PDF模板中显示

时间:2017-09-26 05:09:00

标签: html spring thymeleaf flying-saucer

我使用Spring Boot,fly saucer,thymeleaf从html模板创建文件pdf。但是图片没有显示在我的文件中。

项目结构:

Project structure

代码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)

4 个答案:

答案 0 :(得分:2)

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

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

有关classpath:的更多信息,请参阅official documentation

答案 1 :(得分:1)

使用标准的html src属性和从项目根目录开始的相对路径。

您可以将图像放在项目的根目录中,并按以下方式使用它:

<img src="mastercard.png" />

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

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

答案 2 :(得分:1)

为了将图像嵌入到飞碟生成的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)在百里香上下文中设置base64编码的图像

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

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

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

<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,您可以选择将其存储到文件服务器或以您选择的格式提供给客户端。

答案 3 :(得分:0)

我遇到了同样的问题但是从磁盘读取图像文件的成本很低,我建议你使用uri-data

http://www.tothenew.com/blog/using-data-urls-for-embedding-images-in-flying-saucer-generated-pdfs/

因为您无论如何都要阅读图片来生成PDF,最好将其保存在模板中。