Я разрабатываю приложение, которое отображает несколько вкладок с информацией через HTML и CSS.Я использую Spring для создания бэкенда и Thymeleaf для рендеринга внешнего интерфейса.Теперь я хочу экспортировать каждую вкладку, которая отображается в виде HTML-сайта, в виде одного большого файла PDF.
В настоящее время реализуемое мной решение будет использовать Thymeleaf для рендеринга некоторых шаблонов HTML / CSS / JQuery, а затем Flying-Saucer долженсгенерировать PDF с визуализированными данными xHTML.
Мой класс загрузчиков:
private static final String UTF_8 = "UTF-8";
public String downloadBM001(Map<String, Object> data) throws Exception {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setPrefix("pdf/bm001/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setCharacterEncoding(UTF_8);
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
Context context = new Context();
context.setVariables(data);
String renderedHtmlContent = templateEngine.process("tab1", context);
String xHtml = convertToXhtml(renderedHtmlContent);
ITextRenderer renderer = new ITextRenderer();
String baseUrl = FileSystems.getDefault().getPath("src", "main", "resources").toUri().toURL().toString();
renderer.setDocumentFromString(xHtml, baseUrl);
renderer.layout();
OutputStream outputStream = new FileOutputStream("test.pdf");
renderer.createPDF(outputStream);
outputStream.close();
return "hallo";
}
private String convertToXhtml(String html) throws UnsupportedEncodingException {
Tidy tidy = new Tidy();
tidy.setInputEncoding(UTF_8);
tidy.setOutputEncoding(UTF_8);
tidy.setXHTML(true);
ByteArrayInputStream inputStream = new ByteArrayInputStream(html.getBytes(UTF_8));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
tidy.parseDOM(inputStream, outputStream);
return outputStream.toString(UTF_8);
}
Здесь data
- это та же карта, которую я использую для заполнения шаблонов для отображения в браузере.
Когда я вызываю функцию downloadBM001
, выдается ошибка java.lang.NoClassDefFoundError: ognl/PropertyAccessor
.Я понятия не имею, что такое ognl и почему он используется.Как устранить ошибку?
Кроме того, я хочу знать, возможно ли вернуть PDF-файл через Java вызывающему методу AJAX для автоматической загрузки сгенерированного PDF-файла?
ОБНОВЛЕНИЕ 1 Я обновил свой метод из-за описания SpringStandard Dialect.Теперь это мой класс:
public String downloadBM001(Map<String, Object> data) throws Exception {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("/pdf/bm001/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding(UTF_8);
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
Context context = new Context();
context.setVariables(data);
String renderedHtmlContent = templateEngine.process("tab1", context);
String xHtml = convertToXhtml(renderedHtmlContent);
ITextRenderer renderer = new ITextRenderer();
String baseUrl = FileSystems.getDefault().getPath("src", "main", "resources").toUri().toURL().toString();
renderer.setDocumentFromString(xHtml, baseUrl);
renderer.layout();
OutputStream outputStream = new FileOutputStream("test.pdf");
renderer.createPDF(outputStream);
outputStream.close();
return "hallo";
}
Теперь я получаю следующую ошибку:
java.lang.IllegalArgumentException: Application Context cannot be null
Как я могу получить контекст приложения?В документации Thymeleaf + Spring this.applicationContext
используется, но это вызовет ошибку в моем коде.