Spring Boot 2: получить вывод html в контроллере - PullRequest
3 голосов
/ 23 мая 2019

Я следую учебникам Spring Getting Started и ломаю голову над тем, как сделать что-то, что должно быть относительно простым, например, получить доступ к результату другого пути в том же контроллере.

Что я пытаюсь сделать:

  1. Вернуть заполненный шаблон Thymeleaf в виде HTML в браузер <- this работает из коробки </li>
  2. Вернуть ту же страницу, что и PDF

GreetingController:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.thymeleaf.TemplateEngine;

@Controller
@RequestMapping(path = "/")
public class GreetingController {

    @Autowired private TemplateEngine templateEngine;

    @RequestMapping(value = "/index", method = RequestMethod.GET, produces = "application/html")
    public String html(Model model) {
        model.addAttribute("some_data", some_data.getIt());
        return "some_template";
    }

    @RequestMapping(value = "/pdf", method = RequestMethod.GET, produces = "application/pdf")
    public String pdf() {
        // Option 1: get HTML output from html path
        // Option 2: put the same data in some_template via the template engine and get the resulting HTML
        // write HTML to a file using FileWriter
        // then print the temporary file with HTML to PDF via wkhtml2pdf
        return "generated_pdf";
    }

}`

Может быть, я все делаю неправильно, и есть гораздо более простой способ получить заполненный HTML, пожалуйста, сообщите.

EDIT:

Зависимости Gradle для людей, пытающихся сделать что-то подобное:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-devtools")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

1 Ответ

2 голосов
/ 24 мая 2019

Если вы заинтересованы в получении сгенерированного HTML, возможно, самое простое решение - использовать TemplateEngine Thymeleaf, как вы уже сделали:

Context context = new Context(Locale.getDefault());
context.setVariable("some_data", someData.getIt());
String html = templateEngine.process("some_template", context);

После этого вы можете обработать его с помощью любой библиотеки HTML в PDF. Например, если вы используете Летающая тарелка , вы можете написать что-то вроде этого:

try (ServletOutputStream stream = response.getOutputStream()) {
    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocumentFromString(html);
    renderer.layout();
    renderer.createPDF(stream);
    renderer.finishPDF();
} catch (IOException | DocumentException ex) {
    // Error handling
}

Поскольку ITextRenderer позволяет напрямую писать в OutputStream, вы можете использовать HttpServletResponse.getOutputStream() для этого:

@GetMapping("/pdf")
public void pdf(HttpServletResponse response) {
    // Generate HTML + PDF
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...