【问题标题】:how to save pdf file in client machine in mvc3?如何在mvc3的客户端机器中保存pdf文件?
【发布时间】:2013-09-02 16:07:04
【问题描述】:

我即时生成一个 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 机器中。 请帮我解决这个问题..

【问题讨论】:

  • 看来你没有在任何地方填充 memoryStream。在 OutputStream.Write 中使用 FileStream.Write 与 PdfWriter.GetInstance 中相同。
  • 如何写@mswietlicki...任何代码?
  • 它是否保存在服务器上 - 你可以打开 pdf 文件吗?
  • 是的,它保存在服务器上..是的,我可以打开它..

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


【解决方案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 位置设置为零,因为它位于末尾。

【讨论】:

  • 这里的 memorystream.getbuffer 长度 = 抛出了 'System.ObjectDisposedException' 类型的异常,它不会被保存在客户端
  • 任何细节?您尝试了哪种解决方案?
  • 但是为什么呢?有什么问题?内存流是空的吗?有什么例外吗?您是否尝试与调试器连接流中的任何检查位置?也许您应该在写入后重置流?给我一些信息来帮助你。
  • 我用过,PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(Server.MapPath("~/ProjectFiles") + "/" + PDFName, FileMode.Create));而不是 memoryStream..
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多