静态图像不与飞碟和百里香叶一起显示生成的 pdf 文件



我正在使用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中的相关方法是resolveURIsetBaseURL

默认的resolveURIITextUserAgent方法(继承自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}"/>

相关内容

最新更新