Я оцениваю Thymeleaf и Flying Saucer для создания PDF-файлов из шаблонов, и у меня возникла проблема с применением CSS к моему шаблону Thymeleaf. Я уже прочитал соответствующие вопросы и ответы здесь , здесь и здесь ; но ни одно из предложенных решений не устранило мою проблему.
Вот так выглядит моя папка ресурсов:
Так что я использую каталоги по умолчанию, которые будет искать Spring. И вот как тег head выглядит в моем template.html
:
<head>
<title>Spring Boot and Thymeleaf Example</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="../static/css/style.css" th:href="@{/css/style.css}"/>
</head>
Если я вставлю свой CSS в template.html
, тогда сгенерированный файл PDF будет стилизован должным образом (поэтому не должно быть проблем с тем, как я генерирую PDF). Однако, когда я пытаюсь сделать ссылку на файл css, как показано выше, сгенерированный pdf не имеет стиля (поэтому css не применяется).
Наконец, я могу получить доступ к своему CSS-файлу на http://localhost:8080/css/style.css
, так что, похоже, у Spring нет проблем с обслуживанием статического содержимого.
Для полноты, вот как я генерирую PDF:
private final SpringTemplateEngine templateEngine;
private final Log log;
@Autowired
public PdfGenerator(SpringTemplateEngine templateEngine) {
this.templateEngine = templateEngine;
log = LogFactory.getLog(getClass());
}
public void generate(HttpServletRequest servletRequest, HttpServletResponse servletResponse, ServletContext servletContext) {
// Parse the pdf template with Thymeleaf
Locale locale = getLocale(servletRequest);
WebContext context = new WebContext(servletRequest, servletResponse, servletContext, locale);
context.setVariable("user", buildDummyUser());
context.setVariable("discounts", buildDummyDiscounts());
String html = templateEngine.process("template", context);
// Create the pdf with Flying Saucer
try (OutputStream outputStream = new FileOutputStream("generated.pdf")) {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(outputStream);
} catch (IOException | DocumentException e) {
log.error("Error while generating pdf", e);
}
}
Я использую WebContext
вместо Context
, потому что я получаю следующую ошибку с Context
:
org.thymeleaf.exceptions.TemplateProcessingException: Link base "/css/style.css" cannot be context relative (/...) unless the context used for executing the engine implements the org.thymeleaf.context.IWebContext interface
Чего мне здесь не хватает, почему мой style.css
не применяется к template.html
?