我正在开发一个应用程序,该应用程序通过HTML和CSS显示带有信息的多个选项卡。我正在使用Spring创建后端,并使用Thymeleaf渲染前端。现在,我想将显示为HTML站点的每个选项卡导出为一个大PDF文件。
我当前正在实现的解决方案将使用Thymeleaf渲染一些HTML / CSS / JQuery模板,然后Flying-Saucer应该使用渲染的xHTML数据生成PDF。
我的下载程序类是:
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是什么,为什么使用它。该错误如何解决?
此外,我想知道是否可以通过Java将PDF文件返回到调用的AJAX方法以自动下载生成的PDF吗?
更新1 由于对SpringStandard方言的描述,我更新了我的方法。这是我现在的课程:
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
,但这会在我的代码中引发错误。