2017-07-15 113 views
-1

我已經使用PDFSharp生成了pdf。PDF到MemoryStream然後返回

我調用保存方法,並將其保存到磁盤,該文件是完美的。

然後我需要將文件存入MemorySteam,準備將其發送到我的網站下載。但是,該文件最終無效。腐敗。

因此,要查看錯誤發生的位置,我已將該文件放入MemoryStream中,然後嘗試將文件寫入文件,以確認一切正常。事實並非如此。

在這裏,我的文件SAV到磁盤,以檢查它(調試),然後把它變成一個流:

  document.Save("c:\\temp\\ggg.pdf"); 

      MemoryStream ms = new MemoryStream(); 
       document.Save(ms, false); 
       byte[] buffer = new byte[ms.Length]; 
       ms.Seek(0, SeekOrigin.Begin); 
       ms.Flush(); 
       ms.Read(buffer, 0, (int)ms.Length); 
       return ms; 

然後我回到「MS」到我的調用函數,並嘗試寫流到文件:

var doc = GeneratePdf(1); 

      using (FileStream file = new FileStream("c:\\temp\\222.pdf", FileMode.Create, System.IO.FileAccess.Write)) 
      { 
       byte[] bytes = new byte[doc.Length]; 
       doc.Read(bytes, 0, (int)doc.Length); 
       file.Write(bytes, 0, bytes.Length); 
       doc.Close(); 
      } 

但是222.pdf不是有效的pdf。 ggg.pdf很好。所以當我寫入流,並寫入磁盤時,我做錯了什麼。爲什麼文件被損壞?

+0

你在哪裏填補了'buffer'? –

+0

@ IanH.-我不確定。我認爲它是「ms.Read(buffer,0,(int)ms.Length);」,但顯然不是?你可能已經發現了這個問題。 – Craig

+1

爲什麼不使用'Stream.CopyTo'來代替手動應對這些流呢?在你已經將文檔保存到'MemoryStream'後的'Flush()'和'Read(..)'*的目的是什麼? –

回答

1

我無法重現您的問題(PdfSharp 1.32.3057.0)。在我看來,你手動流複製太麻煩了。

嘗試下面的代碼,它正確地創建一個PDF,溪流成一個MemoryStream,比它保存到一個文件:

var pdf = new PdfSharp.Pdf.PdfDocument(); 

var page = pdf.AddPage(); 
var gfx = XGraphics.FromPdfPage(page); 
var font = new XFont("Verdana", 20, XFontStyle.BoldItalic); 
gfx.DrawString("Hello, World!", font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), XStringFormats.Center); 

var ms = new MemoryStream(); 
pdf.Save(ms, false); 
ms.Position = 0; 

using (var file = File.OpenWrite("test.pdf")) 
    ms.CopyTo(file); // no need for manual stream copy or buffers 
相關問題