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

Spring Boot中如何将生成的PDF保存为Blob并返回给客户端

问题解答

1. 是否需要先保存Blob文件?

不需要直接创建并保存Blob文件到磁盘。你可以直接在内存中生成PDF的二进制数据,通过HTTP响应直接返回给客户端,客户端就能将其解析为Blob并打开PDF。跳过磁盘存储步骤能提升性能,避免不必要的IO操作。

2. 如何从PDF生成供客户端使用的二进制数据(对应前端Blob)?

核心思路是将PDF内容转换为字节数组,具体实现取决于你使用的PDF生成库:

  • 如果你的Pdf类支持直接输出到字节流,可直接写入ByteArrayOutputStream获取字节数组:
// 替代原代码中的pdf.saveAs(filePath)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
pdf.saveToStream(baos); // 假设你的Pdf类提供输出到流的方法
byte[] pdfBytes = baos.toByteArray();
  • 如果Pdf类只能先保存到文件,也可以读取已生成的PDF文件字节,之后可删除临时文件释放磁盘空间:
String filePath = request.getDownloadPath()+ "/"+ request.getItemUuid()+ ".pdf";
pdf.saveAs(filePath);
byte[] pdfBytes = Files.readAllBytes(Paths.get(filePath));
Files.deleteIfExists(Paths.get(filePath)); // 删除临时文件

3. 生成的二进制数据应该以什么类型返回?

  • MultipartFile不合适,它是Spring用于接收客户端上传文件的类型,不适合作为接口返回值。
  • 推荐使用ResponseEntity<Resource>作为返回类型,直接返回内存中的二进制数据,无需先保存到磁盘:
@Override
public ResponseEntity<Resource> downloadPdfFromUrl(final PdfRequest request, final String html) {
    // 省略PDF生成的前置逻辑...
    
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    pdf.saveToStream(baos);
    byte[] pdfBytes = baos.toByteArray();
    
    ByteArrayResource resource = new ByteArrayResource(pdfBytes);
    
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + request.getItemUuid() + ".pdf\"")
            .contentType(MediaType.APPLICATION_PDF)
            .contentLength(pdfBytes.length)
            .body(resource);
}

客户端收到该响应后,可直接将响应体解析为Blob并打开PDF。如果需要返回自定义响应结构,也可以在自定义响应类中添加字节数字段,但返回ResponseEntity是更标准的RESTful接口实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:57:41