如何在mvc3中保存客户机中的pdf文件?

时间:2013-08-30 09:14:30

标签: c# asp.net-mvc asp.net-mvc-3

我动态生成pdf文件并将其保存到服务器端,但我需要将其保存到客户端计算机。如何实现这一目标..

 Document doc = new Document();
 MemoryStream memoryStream = new MemoryStream();
 string PDFName = ProjectName + ".pdf";
 PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(Server.MapPath("~/ProjectFiles") + "/" + 
 PDFName, FileMode.Create));
 doc.Open();
       //PDF Content
 doc.Close();

 Response.ContentType = "application/pdf";
 Response.AddHeader("content-disposition", "attachment;filename=" + PDFName);
 Response.Buffer = true;
 Response.Clear();
 Response.OutputStream.Write(memoryStream.GetBuffer(), 0, memoryStream.GetBuffer().Length);
 Response.OutputStream.Flush();
 Response.End();

     In Response.OutputStream.Write(memoryStream.GetBuffer(), 0, memoryStream.GetBuffer().Length); 

memoryStream长度为0.我需要将保存的pdf下载到Cleint机器中。 请帮我解决这个问题..

2 个答案:

答案 0 :(得分:1)

您没有向memoryStream写任何内容。

由于您在每个请求上生成PDF,因此无需将其保存到文件中。您可以直接生成PDF MemoryStream

MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

如果您的PDF不是动态的(例如,不需要在每个请求中生成它们)您可以像现在一样将它们生成到文件系统,然后只从磁盘读取它们:

using (MemoryStream ms = new MemoryStream()) 
{
    using (FileStream file = new FileStream(YourPdfFile, FileMode.Open, FileAccess.Read)) {
        byte[] bytes = new byte[file.Length];
        file.Read(bytes, 0, (int)file.Length);
        ms.Write(bytes, 0, (int)file.Length);
    }
}

但是只有在生成一次PDF然后才从磁盘提供时才会产生感觉。

编辑:写入流之后,有必要将memoryStream位置设置为零,因为它在最后。

答案 1 :(得分:0)

你必须像这样影响内存流:

PdfWriter pdfWriter = PdfWriter.GetInstance(document, memoryStream);