从Thymeleaf模板生成PDF文件会引发java.lang.ClassNotFoundException:ognl.PropertyAccessor错误

时间:2019-04-26 14:57:27

标签: java spring thymeleaf flying-saucer

我正在开发一个应用程序,该应用程序通过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,但这会在我的代码中引发错误。

0 个答案:

没有答案