我使用Spring Boot,fly 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)
答案 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,最好将其保存在模板中。