2017-07-15 7 views
-1

J'ai généré un fichier PDF en utilisant PDFSharp.PDF vers MemoryStream puis de retour

J'appelle la méthode save, et l'enregistre sur le disque, et le fichier est parfait. J'ai ensuite besoin d'obtenir le fichier dans un MemorySteam, en préparation de l'envoyer à mon site Web pour le téléchargement. Cependant, le fichier est invalide. corrompu. Donc, pour voir où ça ne va pas, j'ai mis le fichier dans un MemoryStream, puis j'essaye d'écrire ce fichier dans un fichier, pour confirmer que tout est OK. Ce n'est pas.

Ici, je sav le fichier sur le disque, pour les vérifier (débogage), puis le mettre dans un cours d'eau:

  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; 

Je reviens donc « ms » à ma fonction d'appel et tenter d'écrire le diffuser dans un fichier:

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(); 
      } 

Mais 222.pdf n'est pas un fichier pdf valide. ggg.pdf était bien. Donc, je fais quelque chose de mal quand j'écris pour diffuser, et écrire sur le disque. Pourquoi le fichier est-il corrompu?

+0

Où êtes-vous remplissez le 'buffer'? –

+0

@ IanH.- Je ne suis pas sûr. Je pensais que c'était "ms.Read (buffer, 0, (int) ms.Length);", mais clairement pas? Vous avez peut-être repéré le problème. – Craig

+1

Pourquoi n'utilisez-vous pas simplement 'Stream.CopyTo' au lieu de gérer manuellement ces flux? Aussi, quel est le but de 'Flush()' et 'Read (..)' * après * vous avez déjà enregistré le document dans le 'MemoryStream'? –

Répondre

1

Je ne peux pas reproduire votre problème (PdfSharp 1.32.3057.0). Il me semble que vous vous trompez trop avec la copie manuelle de flux.

Essayez le code suivant, qui correctement crée un pdf, il flux en MemoryStream et qu'il enregistre dans un fichier:

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