2009-07-02 6 views
25

Je souhaite enregistrer un fichier PdfSharp.Pdf.PdfDocument par sa méthode Save dans un flux, mais sans y attacher les paramètres d'en-tête PDF. Donc quand je relis le Stream et le renvoie à l'utilisateur, il voit que le fichier PDF est invalide. Y at-il une solution pour attacher les paramètres d'en-tête PDF lorsque PDFsharp enregistre en mémoire?PDFsharp enregistrer dans MemoryStream

Répondre

20

donc la solution:

MigraDoc.DocumentObjectModel.Document doc = new MigraDoc.DocumentObjectModel.Document(); 
MigraDoc.Rendering.DocumentRenderer renderer = new DocumentRenderer(doc); 
MigraDoc.Rendering.PdfDocumentRenderer pdfRenderer = new MigraDoc.Rendering.PdfDocumentRenderer(); 
pdfRenderer.PdfDocument = pDoc; 
pdfRenderer.DocumentRenderer = renderer; 
using (MemoryStream ms = new MemoryStream()) 
{ 
    pdfRenderer.Save(ms, false); 
    byte[] buffer = new byte[ms.Length]; 
    ms.Seek(0, SeekOrigin.Begin); 
    ms.Flush(); 
    ms.Read(buffer, 0, (int)ms.Length); 
} 

Il y a ce genre de choses de MigraDoc qui vient avec PdfSharp, mais je ne trouve guère une doc/faq bon pour elle. Après des heures de googling j'ai trouvé un extrait qui était quelque chose comme ça. Maintenant ça marche.

+5

Qu'est-ce pDoc? Est-ce la même chose que doc? –

+0

cela a fonctionné pour moi comme ceci: pdfRenderer.Document = doc; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save (flux); – vicentedealencar

+0

Qu'est-ce que pDoc ???? – Zafar

30

Si vous pensez qu'il y a un problème avec PdfDocument.Save, veuillez le signaler sur le forum PDFsharp (mais soyez plus précis avec la description de votre erreur). Votre "solution" ressemble à un hack pour moi. "PdfRenderer.Save" appelle "PdfDocument.Save" en interne. Quel que soit le problème, votre "solution" appelle toujours la même routine de sauvegarde.

Edit: Pour obtenir un octet [] contenant un fichier PDF, il suffit d'appeler:

MemoryStream stream = new MemoryStream(); 
document.Save(stream, false); 
byte[] bytes = stream.ToArray(); 

Les premières versions de PdfSharp ne réinitialise pas la position de flux.

Vous devez appeler

ms.Seek(0, SeekOrigin.Begin); 

pour réinitialiser la position de flux avant de lire à partir du flux; ceci n'est plus requis pour les versions actuelles.

L'utilisation de ToArray peut souvent être utilisée à la place de la lecture du flux.

Edit 2: au lieu de stream.ToArray() il peut être plus efficace d'utiliser stream.GetBuffer(), mais ce tampon est généralement plus grand que le fichier PDF et il vous suffit d'utiliser stream.Length octets de ce tampon. Très utile pour la méthode qui prend un byte[] avec un paramètre de longueur.

5

Pour MigraDoc (ver 1.30) je pouvais l'enregistrer avec

PdfDocumentRenderer renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always); 
renderer.Document = report.m_Document; 

renderer.RenderDocument(); 


using (MemoryStream stream = new MemoryStream()) 
{ 
    renderer.PdfDocument.Save(stream, false); 
    ... your code in here 

} 
Questions connexes