我使用 thymeleaf 作为我的模板引擎,将 XHTML 映射到 HTML,然后使用 Flying Saucer 生成 pdf 文件。
现在我无法在生成的 pdf 文件中显示位于/src/main/resources/的静态图像。文件本身将显示良好,只有图像消失。
甚至/src/main/resources/static 或/src/main/resources/public 等其他位置也没有帮助。
我的 HTML/XHTML 看起来像:
<img src="images/logo_black.png"></img>
<img src="/images/logo_black.png"></img>
<img alt="mastercard" th:src="@{classpath:static/images/logo_black.png}" />
<div data-src="images/logo_black.png"></div>
<div data-src="/images/logo_black.png"></div>
<div data-src="@{classpath:static/images/logo_black.png}"></div>
它们都不能正常工作。
图像本身在 localhost:8048/logo_black.png 可见
我不想用完整的 url ( http://.. .) 引用我的图片
最佳答案
您可以包含来自任何 URL(来自 Internet 或您的文件系统)的资源。无论哪种方式,都涉及几个步骤:
从 Thymeleaf 模板生成 HTML 时,您可以使用
@{/some/url}
解析相对于您的 Web 上下文的路径(假设您有 Web 上下文),或者@{classpath:/some/url}
只会将 URL 保留为classpath:/some/url
,或者- 只是一个字符串值常量或来自变量的值 (
${var}
),如果它是绝对 URLhttps://some/url
则无关紧要> 或相关的,Thymleaf 将在生成的 HTML 中保持它们不变。
在将 HTML 传递给 Flying Saucer 之前,请确保 URL 正确无误。然后 Flying Saucer 将使用 UserAgentCallback
处理所有 URL,默认为 ITextUserAgent
。
UserAgentCallBack
中的相关方法是resolveURI
和setBaseURL
。
ITextUserAgent
(继承自 NaiveUserAgent
)的默认 resolveURI
方法中存在一些奇怪的逻辑。如果 baseURL
为 null,它将尝试设置它,因此最好始终自行设置。我通过覆盖 resolveURI
获得了更好的结果,以下足以保留绝对 URL 并解析相对于 baseURL
的相对 URL:
@Override
public String resolveURI(String uri) {
if (URI(uri).isAbsolute())
return uri;
else
return Paths.get(getBaseURL(), uri).toUri().toString();
}
最后,为了解析classpath:
协议(protocol),you need to define an URLStreamHandler
除非已经定义好了(比如Spring Boot的嵌入式Tomcat已经支持了)。
关于java - 对于生成的 pdf 文件,静态图像不会与 Flying Saucer 和 thymeleaf 一起显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50203842/