对于生成的pdf文件,静态图像不显示飞碟和百里香

7 java static image flying-saucer thymeleaf

我使用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>
Run Code Online (Sandbox Code Playgroud)

他们都没有正常工作.

图像本身可由localhost:8048/logo_black.png看到

我不想用完整的网址引用我的图片(http:// ..)

Dar*_*idl 1

您可以包含来自任何 URL(来自 Internet 或来自您的文件系统)的资源。无论哪种方式,都涉及几个步骤:

从 Thymeleaf 模板生成 HTML 时,您可以使用

  • @{/some/url}解析相对于您的 Web 上下文的路径(假设您有一个 Web 上下文),或者
  • @{classpath:/some/url}with 只会将 URL 保留为classpath:/some/url, 或
  • 只是一个字符串值常量或变量 ( ) 中的值${var},无论它是绝对 URLhttps://some/url还是相对 URL,Thymleaf 都会在生成的 HTML 中保持它们不变。

在将 HTML 传递给 Flying Saucer 之前,请确保 URL 正确。UserAgentCallback那么 Flying Saucer 将默认处理所有带 , 的 URL ITextUserAgent

中的相关方法UserAgentCallBackresolveURIsetBaseURL

(继承自)resolveURI的默认方法中存在一些奇怪的逻辑。如果为空,它将尝试设置它,所以最好总是自己设置它。我通过覆盖 获得了更好的结果,以下内容足以保留绝对 URL 并解析相对于 的相对 URL :ITextUserAgentNaiveUserAgentbaseURLresolveURIbaseURL

@Override
public String resolveURI(String uri) {
   if (URI(uri).isAbsolute())
       return uri;
   else
       return Paths.get(getBaseURL(), uri).toUri().toString();
}
Run Code Online (Sandbox Code Playgroud)

最后,为了解析classpath:协议,您需要定义一个URLStreamHandler协议,除非已经定义了一个(例如,Spring Boot的嵌入式Tomcat已经支持这一点)。