java - 对于生成的 pdf 文件,静态图像不会与 Flying Saucer 和 thymeleaf 一起显示

标签 java image static thymeleaf flying-saucer

我使用 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}),如果它是绝对 URL https://some/url 则无关紧要> 或相关的,Thymleaf 将在生成的 HTML 中保持它们不变。

在将 HTML 传递给 Flying Saucer 之前,请确保 URL 正确无误。然后 Flying Saucer 将使用 UserAgentCallback 处理所有 URL,默认为 ITextUserAgent

UserAgentCallBack中的相关方法是resolveURIsetBaseURL

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/

相关文章:

Java正则表达式到groovy

java - 如何减少 Elasticsearch 滚动响应时间?

html - 多个 div 的一张背景图片

android - 我的应用程序的键盘永久可见

java - 如何取消定时器的多个实例?

java - 如何添加glassfish工具来 eclipse 氧3a

python - 在 linux 中使用 python 将图像复制到剪贴板

jquery - CSS3 淡出/淡入文本和图像透明

c++ - 函数内部和外部静态变量之间的区别?

java - 如果类没有成员变量,所有方法都应该是静态的吗