Статические изображения не отображаются с летающей тарелкой и тимьяном для созданных 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}
), не имеет значения, является ли это абсолютным URLhttps://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"/>
Такой подход гарантирует, что вы предоставите полный путь к изображению, расположенному в ресурсах вашего проекта, что повышает ясность и точность ссылки на изображение.