MVC PDF流生成

时间:2017-07-10 14:15:55

标签: c# asp.net-mvc pdf

我正在开发一个项目,要求我连接存储在我们服务器上的大量PDF文件,并将其呈现在网页中。 此PDF数据将被隐藏,并用于允许用户只需按一下按钮即可打印多个PDF。

我目前正在使用iframe通过将帧源指向处理此功能的URL来实现此目的。

这适用于单个文件:

public ActionResult PrintInvoice(string invoiceNumber)
{
    string fileloc = GetInvoiceFileLocation(invoiceNumber);
    FileStream fs = new FileStream(fileloc, FileMode.Open, FileAccess.Read);
    return File(fs, "application/pdf");
}

这也适用于单个文件:

public ActionResult PrintInvoice(string invoiceNumber)
{
    string fileloc = GetInvoiceFileLocation(invoiceNumber);
    fileBytes = System.IO.File.ReadAllBytes(fileloc);
    ms = new MemoryStream(fileBytes);
    return File(ms, "application/pdf");
}

但是,这不起作用(iFrame报告无法读取PDF):

public ActionResult PrintInvoice(string invoiceNumber)
{
    string fileloc = GetInvoiceFileLocation(invoiceNumber);
    fileBytes = System.IO.File.ReadAllBytes(fileloc);
    ms = new MemoryStream();
    ms.Write(fileBytes, 0, fileBytes.Length);
    return File(ms, "application/pdf");
}

第三个代码示例方法似乎很有希望按字节连接文件,但MemoryStream在向其写入字节时似乎不起作用,而不是使用字节初始化流(如示例2所示)。

我想我记得读过PDF数据没有存储为字节? 这里发生了什么会导致示例2工作(对于单个PDF),但是示例3(应该做同样的事情),对于单个PDF不起作用?

感谢您的帮助,

马修

1 个答案:

答案 0 :(得分:0)

https://msdn.microsoft.com/en-us/library/system.io.memorystream.write(v=vs.110).aspx

  

如果写操作成功,则当前位置在   stream按写入的字节数提前。

public ActionResult PrintInvoice(string invoiceNumber)
{
    string fileloc = GetInvoiceFileLocation(invoiceNumber);
    fileBytes = System.IO.File.ReadAllBytes(fileloc);
    ms = new MemoryStream();
    ms.Write(fileBytes, 0, fileBytes.Length);

    ms.Position = 0;    

    return File(ms, "application/pdf");
}