Статические изображения не отображаются с летающей тарелкой и тимьяном для созданных PDF-файлов

Я использую тимилеф в качестве своего шаблона для отображения XHTML на HTML и летающую тарелку для создания PDF-файла впоследствии.

Теперь мне не удалось отобразить мои статические изображения, расположенные в / src / main / resources / внутри y сгенерированного PDF-файла. Сам файл будет отображаться нормально только изображения исчезают.

Даже другие места, такие как / 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:)

3 ответа

Вы можете включить ресурсы с любого URL (из Интернета или из вашей файловой системы). В любом случае, есть несколько этапов:

При создании HTML-кода из шаблона Thymeleaf вы можете использовать

  • @{/some/url} разрешить путь относительно вашего веб-контекста (при условии, что у вас есть веб-контекст), или
  • @{classpath:/some/url} с просто оставит URL как classpath:/some/url, или же
  • просто константа строкового значения или значение из переменной (${var}), не имеет значения, является ли это абсолютным URL https://some/url или относительный, Thymleaf оставит их без изменений в результирующем HTML.

Прежде чем передать HTML-файл Flying Saucer, убедитесь, что URL-адреса верны. Затем Flying Saucer обработает все URL с UserAgentCallback, по умолчанию ITextUserAgent,

Соответствующие методы в UserAgentCallBack являются resolveURI а также setBaseURL,

По умолчанию происходит какая-то странная логика resolveURI метод ITextUserAgent (наследуется от NaiveUserAgent). Если baseURL имеет значение null, он попытается установить его, поэтому лучше всегда устанавливать его самостоятельно. У меня были лучшие результаты с переопределением resolveURIследующего достаточно для сохранения абсолютных URL и разрешения относительных URL относительно baseURL:

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

Наконец, чтобы решить classpath: протокол, вам нужно определитьURLStreamHandler если он еще не определен (например, встроенный Tomcat of Spring Boot уже поддерживает это).

Вы можете визуализировать изображение с помощью базы 64 . Вы просто конвертируете свое изображение на базе 64, и оно будет отображаться на вашей веб-странице, а также в мобильном представлении. Теги:

<img th:src="@{data:image/png ;base64,your base 64}"/>

У вас есть возможность указать полный путь к файлу вместо использования относительного пути «images/logo_black.png» в атрибуте источника изображения Thymeleaf. Для этого вы можете создать каталог с именем «шаблоны» в папке «ресурсы» вашего проекта. Внутри этого каталога «шаблоны» вы можете разместить свои изображения в подкаталоге с именем «images». Например, вы можете структурировать его следующим образом: «templates/images/image.png».

При такой настройке вы можете затем ссылаться на изображение, используя полный путь в атрибуте Thymeleaf th:src, например:

      <img th:src="@{classpath:/templates/images/image.png}" alt="image"/>

Такой подход гарантирует, что вы предоставите полный путь к изображению, расположенному в ресурсах вашего проекта, что повышает ясность и точность ссылки на изображение.

Другие вопросы по тегам