我正在使用thymeleaf作为我的模板,将XHTML映射到HTML,然后飞碟生成pdf文件。
现在我无法在 y 生成的 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>
它们都无法正常工作。
图像本身由本地主机:8048/logo_black.png
我不想用完整的网址引用我的图片(http://...
您可以包含来自任何 URL(来自互联网或文件系统)的资源。无论哪种方式,都涉及几个步骤:
从百里香叶模板生成 HTML 时,您可以使用
@{/some/url}
解析相对于 Web 上下文- 的路径(假设您有 Web 上下文),或者
@{classpath:/some/url}
将只将 URL 保留为classpath:/some/url
,或者- 只是一个字符串值常量或来自变量(
${var}
)的值,无论它是绝对URLhttps://some/url
还是相对的,Thymleaf都会在生成的HTML中保持它们不变。
在将 HTML 传递给飞碟之前,请确保 URL 正确无误。然后飞碟会用一个UserAgentCallback
处理所有网址,默认ITextUserAgent
。
UserAgentCallBack
中的相关方法是resolveURI
和setBaseURL
。
默认的resolveURI
ITextUserAgent
方法(继承自NaiveUserAgent
)中存在一些奇怪的逻辑。如果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:
协议,你需要定义一个URLStreamHandler
除非已经定义了一个(例如,Spring Boot 的嵌入式 Tomcat 已经支持这一点)。
您可以在 base 64 的帮助下渲染图像。您只需在 base 64 上转换图像,它就会显示在您的网页和移动视图中。标签是:
<img th:src="@{data:image/png ;base64,your base 64}"/>