PDF 到 MemoryStream 然后返回

PDF to MemoryStream and then back

我已经使用 PDFSharp 生成了一个 pdf。

调用save方法,存盘,文件完美

然后我需要将文件放入 MemorySteam,准备将其发送到我的网站进行下载。但是,该文件最终无效。腐败。

因此,为了查看哪里出了问题,我将文件放入 MemoryStream,然后尝试将该流写入文件,以确认一切正常。不是。

这里我将文件保存到磁盘,检查它(调试),然后将它放入流中:

            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;

然后我 return '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 很好。所以当我写入流和写入磁盘时,我做错了什么。为什么文件会损坏?

我无法重现您的问题 (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