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

Java中使用OpenHtmlToPdf生成PDF后下载空白问题求助

解决OpenHtmlToPdf生成PDF直接下载时文件空白的问题

嘿,我一眼就看出问题出在哪了——你设置HTTP响应头的时机完全搞反啦!你现在是先把PDF内容写入了响应输出流,之后才去设置Content-Type、Content-Disposition这些关键头信息,这会导致浏览器根本没法正确识别接收到的内容,最终显示空白PDF。

正确的逻辑应该是先把所有响应头配置好,再去渲染并写入PDF内容,这样浏览器能提前知道“哦,接下来要接收的是个PDF文件”,才能正确解析后续的流数据。

给你修正后的代码:

try {
    // 第一步:先搞定所有HTTP响应头的设置
    httpServletResponse.setContentType("application/pdf");
    httpServletResponse.setCharacterEncoding("UTF-8");
    httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"qr_codes.pdf\"");
    
    // 第二步:再执行PDF的渲染和写入操作
    PdfRendererBuilder builder = new PdfRendererBuilder();
    builder.useFastMode();
    builder.withW3cDocument(html5ParseDocument(htmlString, 80000000), "");
    builder.toStream(httpServletResponse.getOutputStream());
    builder.run();
    
    // 最后刷新缓冲区确保内容全部发送
    httpServletResponse.flushBuffer();
} catch (Exception e) {
    logger.error(e.getMessage(), e);
}

为啥这么改?给你唠两句关键原因:

  • HTTP协议的规则是响应头必须在响应体之前发送,如果先写响应体(PDF内容),Web容器可能会自动提交响应头,你后面手动设置的那些头就会被直接忽略。浏览器拿到没有PDF标识的响应,自然没法解析出正确内容。
  • 尽量在设置完所有头之后再获取输出流,避免容器提前触发响应提交,导致后续配置失效。
  • 把所有操作都包在同一个try块里,确保任何步骤出错都能被捕获,避免出现只写了部分内容的损坏PDF文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:01:49