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

使用iTextSharp生成PDF后下载显示空白,请求代码问题排查与解决

问题原因及解决方案

核心问题

下载的PDF显示空白,是因为生成PDF时的文件流未被正确释放,导致调用File.ReadAllBytes时,PDF内容还没完全写入磁盘。虽然document.Close()会关闭文档对象,但它不一定会立即刷新并关闭底层的FileStream,此时读取到的字节数组是不完整的空文件,所以下载后显示空白;而后续系统会自动回收未关闭的流,服务器上的文件最终会被写入完整内容,因此直接打开是正常的。

修复方案

需要确保生成PDF时的FileStream被正确关闭和释放,推荐使用using语句自动管理资源(using会在代码块结束时自动调用Dispose(),确保流被关闭并将内容完全刷新到磁盘)。

修改后的代码

public HttpResponseMessage InvoicePdfDownload()
{
    string file = Guid.NewGuid().ToString() + ".pdf";
    string filePath = MyServer.MapPath("Assets/" + file);
    
    // 使用using包裹FileStream,确保资源正确释放
    using (var fileStream = new FileStream(filePath, FileMode.Create))
    {
        Document document = new Document();
        PdfWriter writer = PdfWriter.GetInstance(document, fileStream);
        document.Open();
        document.Add(new Paragraph("Hello, World!"));
        document.Close();
    } // 此处自动关闭fileStream,确保内容完全写入磁盘

    if (File.Exists(filePath))
    {
        byte[] bytes = File.ReadAllBytes(filePath);
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new ByteArrayContent(bytes);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue(MimeMapping.GetMimeMapping(Path.GetFileName(filePath)));
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = Path.GetFileName(filePath) };
        return result;
    }

    // 补充文件不存在时的返回逻辑,避免返回null引发异常
    return new HttpResponseMessage(HttpStatusCode.NotFound);
}

额外注意点

  • 原代码中字符串拼接的""".pdf"""是语法错误,应改为".pdf"(大概率是输入时的转义失误)。
  • 原方法缺少文件不存在时的返回分支,补充返回404状态码可以避免程序抛出空引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:04:56