2013-08-30 41 views
1

我立即生成一個pdf文件並將其保存到服務器端,但我需要將它保存到客戶端機器。如何實現此目的..如何在mvc3客戶端機器上保存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機器中。 請幫我解決這個問題..

+0

看來你不隨地填寫的MemoryStream。在OutputStream.Write中使用FileStream與在PdfWriter.GetInstance中相同。 – mswietlicki

+0

如何編寫@mswietlicki ...任何代碼? –

+0

它是否保存在服務器上 - 你可以打開pdf文件嗎? –

回答

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的位置設置爲零,因爲它在最後。

+0

這裏memorystream.getbuffer長度=投擲型「System.ObjectDisposedException」的一個例外,它不會被保存在客戶端 –

+0

我貼錯段第一時間,請現在檢查 –

+0

讓我試試你的代碼.. –

0

你有可能影響到的MemoryStream這樣的:

PdfWriter pdfWriter = PdfWriter.GetInstance(document, memoryStream); 
相關問題