You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PDFBox生成PDF后通过ResponseEntity返回为空的问题求助

解决PDFBox生成PDF本地正常但ResponseEntity返回空白问题

我之前也碰到过一模一样的情况——本地生成的PDF打开完全正常,但通过Spring的ResponseEntity返回前端就变成空白页。结合你的POST请求场景,给你几个针对性的修复方案:

1. 先检查字节流的位置是否重置

这是最常见的坑!当你用ByteArrayOutputStream存储PDF内容后,如果没有把流的指针重置到开头,返回的字节数组就是空的。

试试用try-with-resources自动管理资源,同时确保流的状态正确:

@PostMapping(value="/documents/generate", produces = MediaType.APPLICATION_PDF_VALUE)
public ResponseEntity<byte[]> generateSampleTag(@RequestBody SampleTag sampleTag) {
    log.info("inside generatePdfFromHtml method in DocumentController");
    
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
         PDDocument document = new PDDocument()) { // 自动关闭资源,避免泄漏
        
        // 你的PDF生成逻辑:添加页面、填充内容等
        PDPage page = new PDPage();
        document.addPage(page);
        // 示例:添加文本内容(根据你的业务逻辑调整)
        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);
        contentStream.beginText();
        contentStream.newLineAtOffset(100, 700);
        contentStream.showText("Sample Tag Content: " + sampleTag.getSomeField());
        contentStream.endText();
        contentStream.close();
        
        document.save(baos);
        
        // 准备响应头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_PDF);
        // 设置下载文件名,支持中文需指定字符集
        headers.setContentDisposition(ContentDisposition.attachment()
                .filename("sample-tag.pdf", StandardCharsets.UTF_8)
                .build());
        headers.setContentLength(baos.size());
        
        return new ResponseEntity<>(baos.toByteArray(), headers, HttpStatus.OK);
    } catch (IOException e) {
        log.error("Failed to generate PDF", e);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }
}

2. 确保响应头设置完整

如果头信息不对,浏览器可能无法正确解析PDF流,看起来就是空白。必须设置这几个关键头:

  • Content-Type: application/pdf:明确告诉浏览器返回的是PDF文件
  • Content-Disposition:如果要让用户下载就设为attachment; filename=xxx.pdf,要在线预览就设为inline
  • Content-Length:指定字节数组的长度,避免浏览器因长度猜测错误导致解析失败

3. 检查PDF生成逻辑是否真的写入了内容

有时候看似本地生成正常,但可能是因为你本地保存时流的处理正确,但在返回时因为参数绑定问题,生成逻辑根本没添加内容。建议:

  • 在日志里打印sampleTag的参数,确认请求体的参数都正确接收到了
  • 生成后打印baos.size(),如果长度为0,说明PDF生成逻辑有问题,不是返回环节的锅

4. 避免资源泄漏导致的流不完整

一定要确保PDDocument和PDPageContentStream这类资源被正确关闭,用try-with-resources是最省心的方式,它会在代码块结束后自动关闭资源,避免因为资源未释放导致流中的内容不完整。

内容的提问来源于stack exchange,提问作者hasti123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:50:31