Существует типичная задача, когда нужно сгенерировать PDF-файл на сервере и предоставить его для скачивания пользователю. Например, это может быть отчет, который формируется на основе данных из базы данных, и пользователь должен иметь возможность скачать его в виде PDF-файла.
Идеально для решения этой задачи подходит сочетание двух технологий: шаблонизатора freemarker для формирования HTML-шаблона отчета и библиотеки iText для преобразования HTML в PDF. Однако возникает вопрос — как организовать загрузку этого файла через Spring контроллер?
Генерация PDF
Для начала требуется сгенерировать сам PDF. В качестве шаблона используется HTML, который заполняется данными при помощи freemarker. Затем этот HTML преобразуется в PDF с помощью iText.
String html = freemarkerTemplateEngine.process("reportTemplate", model); ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream(); PdfRendererBuilder builder = new PdfRendererBuilder(); builder.withHtmlContent(html, "/"); builder.toStream(pdfOutputStream); builder.run();
Метод freemarkerTemplateEngine.process
заполняет HTML-шаблон данными, а PdfRendererBuilder
преобразует HTML в PDF.
Отправка файла через Spring контроллер
Теперь, когда PDF сгенерирован, его можно отправить пользователю. Для этого в контроллере Spring создается новый метод, который возвращает ResponseEntity.
@RequestMapping(value = "/download", method = RequestMethod.GET) public ResponseEntity<byte[]> downloadReport() { byte[] pdfData = generatePdfReport(); // метод, который генерирует PDF HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF); headers.setContentDispositionFormData("filename", "report.pdf"); return new ResponseEntity<>(pdfData, headers, HttpStatus.OK); }
В этом методе генерируется PDF, затем создается новый объект HttpHeaders, в котором устанавливается тип контента и имя файла. Затем создается и возвращается новый объект ResponseEntity, который содержит данные PDF, заголовки и статус HTTP.
Таким образом, при запросе к данному контроллеру пользователь получает PDF-файл, который можно скачать.
Это один из возможных способов решения задачи. Важно помнить, что в разных ситуациях могут потребоваться разные подходы.
Добавить комментарий