在 ResponseEntity 中创建 PDF 和 return

Create PDF and return it in ResponseEntity

我正在尝试创建一个 PDF,然后自动下载它。我正在使用 PDFBox 创建 PDF,它在本地保存得很好,但是一旦我通过 ResponseEntitybyte[] return 它就会变成空白。我想使用 post,因为我想发送 PDF 所需的 body 个参数。

这是我的控制器

    @PostMapping(value="/documents/generate")
    ResponseEntity<?> generateSampleTag(@RequestBody SampleTag sampleTag) {
        log.info("inside generatePdfFromHtml method in DocumentController");
        try(ByteArrayOutputStream byteArrayOutputStream = freePdfService.generatePdf(sampleTag)) {
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF_VALUE);
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=sampleTag.pdf");
            headers.add("Expires", "0");
            headers.setCacheControl(CacheControl.noCache());
            headers.add("Pragma", "public");
            ByteArrayResource resource = new ByteArrayResource(byteArrayOutputStream.toByteArray());
            return new ResponseEntity<>(resource, headers, HttpStatus.OK);
        } catch (Exception e) {
            log.error(e.getMessage());
            return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }

    }

我一直在尝试各种 input/output 流和 header 值,目前我只是在猜测。感谢您的帮助!

我在下面做了回答,但我的问题是 Swagger 无法正确下载它。邮递员工作。

我没有使用过 PDFBox,但它在发送 inputStream 作为 PDF mime 类型的响应之前对我有用 header。

类似...

ByteArrayOutputStream byteArrayOutputStream = freePdfService.generatePdf(sampleTag)
headers.setContentType(MediaType.parseMediaType(MediaType.APPLICATION_PDF_VALUE));
return new ResponseEntity<>(new InputStreamResource(byteArrayOutputStream), headers, HttpStatus.OK);

我的问题是 Swagger 无法正确下载我的 PDF。我在 Postman 中试过了,它成功了...