2017-07-15 3 views
-1

PDFSharpを使用してPDFを生成しました。PDFをMemoryStreamに転送してから

私はsaveメソッドを呼び出してディスクに保存し、ファイルは完璧です。

私はダウンロードするために私のウェブサイトに送るためにファイルを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; 

私はその後、私の呼び出し元の関数に「ミリ秒」を返し、書き込みを試行ファイルへのストリーム:

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

正しくPDFファイルを作成する次のコードを、試してみてください、それをファイルに保存しMemoryStreamへと比べて、それをストリーミング? –

+0

@ IanH.-わかりません。私はそれが "ms.Read(バッファ、0、(int)ms.Length);"だと思ったが、はっきりしない?あなたは問題を発見したかもしれません。 – Craig

+1

これらのストリームを手動でコピーするのではなく、単に 'Stream.CopyTo'を使うのはなぜですか?また、 'MemoryStream'に文書を保存した後の' Flush() 'と' Read(..) '*の目的は何ですか? –

答えて

1

問題を再現できません(PdfSharp 1.32.3057.0)。手動ストリームのコピーをあまりにも邪魔しているようです。あなたは `buffer`を充填している

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 
関連する問題