2017-07-15 115 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 
相关问题