Генерация PDF-файла из шаблона Thymeleaf создает исключение java.lang.ClassNotFoundException: ошибка ognl.PropertyAccessor - PullRequest
0 голосов
/ 26 апреля 2019

Я разрабатываю приложение, которое отображает несколько вкладок с информацией через 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 используется, но это вызовет ошибку в моем коде.

...