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

C#如何通过字节数组在Web浏览器中展示PDF文件

问题修复方案

你的代码无法正常返回PDF的核心原因有三个:

  • 首行字符串变量定义末尾缺少分号,会触发编译错误
  • iText完成文档写入后,内存流的读取指针默认停在流的末尾位置,直接读取会得到空内容
  • 错误使用FileStream包装内存流:FileStream仅用于操作物理磁盘文件,内存流不需要该包装层

正确实现代码

直接调整流指针位置后返回内存流即可,不需要额外做文件落盘或者流包装,ASP.NET Core会自动完成资源释放:

string beneficiarioRelatorio = "Test";

var stream = new MemoryStream();
PdfWriter writer = new PdfWriter(stream);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);

document.Add(new Paragraph(beneficiarioRelatorio));
document.Close();
// 关键操作:将流读取指针重置到流的起始位置
stream.Position = 0;

return new FileStreamResult(stream, "application/pdf")
{
    // 配置下载文件名,需要浏览器预览PDF而非下载的话,删除该行配置即可
    FileDownloadName = "relatorio_beneficiario.pdf"
};

可选替代写法

如果你更习惯用字节数组返回,也可以直接把内存流转为字节数组返回,效果完全一致:

string beneficiarioRelatorio = "Test";

using (var stream = new MemoryStream())
{
    PdfWriter writer = new PdfWriter(stream);
    PdfDocument pdf = new PdfDocument(writer);
    Document document = new Document(pdf);
    document.Add(new Paragraph(beneficiarioRelatorio));
    document.Close();
    
    byte[] pdfBytes = stream.ToArray();
    return new FileContentResult(pdfBytes, "application/pdf")
    {
        FileDownloadName = "relatorio_beneficiario.pdf"
    };
}

补充说明

  • 上述写法在浏览器、Insomnia等接口调试工具中都能正常识别,工具会自动触发PDF预览或下载逻辑
  • 不需要手动调用流的Dispose方法,框架返回结果执行完成后会自动回收相关资源,不会造成内存泄漏
  • 你注释中写的本地落盘代码System.IO.File.WriteAllBytes("hello.pdf", stream.ToArray())本身没有问题,仅用于本地测试时验证PDF生成是否正常,正式接口返回不需要这行。

内容的提问来源于stack exchange,提问作者José Eronaldo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:12:23