PDFsharp save to MemoryStream

je veux sauver un PdfSharp.PDF.PdfDocument par sa méthode Save à un flux, mais il ne fixe pas les paramètres D'en-tête PDF à lui. Donc quand je relis le flux et le renvoie à l'utilisateur, il voit que le fichier PDF est invalide. Existe-t-il une solution pour fixer les paramètres D'en-tête PDF lorsque PDFsharp sauvegarde en mémoire?

26
demandé sur The sky is the limit 2009-07-02 13:02:29

4 réponses

si vous pensez qu'il y a un problème avec PdfDocument.Enregistrez, puis reportez ceci sur le forum PDFsharp (mais s'il vous plaît soyez plus précis avec votre description d'erreur). Votre "solution" ressemble à un piratage pour moi. "pdfRenderer.Sauvegardez "calls" PdfDocument.Enregistrer" en interne. Quel que soit le problème - votre "solution" appelle toujours la même routine de sauvegarde.

Modifier: Pour obtenir un byte[] contenant un fichier PDF, vous n'avez qu'à contacter:

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

les premières versions de PDFsharp ne réinitialisent pas position du flux.

vous devez donc appeler

ms.Seek(0, SeekOrigin.Begin); 

pour réinitialiser la position du flux avant de lire dans le flux; ce n'est plus nécessaire pour les versions actuelles.

utiliser ToArray peut souvent être utilisé au lieu de lire dans le 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 vous n'aurez qu'à utiliser stream.Length octets de la mémoire tampon. Très utile pour la méthode que prendre un byte[] avec un paramètre de durée.

37
répondu The sky is the limit 2015-06-30 08:03:13

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 truc de MigraDoc qui vient avec PdfSharp, mais j'ai à peine trouvé un doc/faq approprié pour ça. Après des heures de recherche sur Google, j'ai trouvé un morceau qui était quelque chose comme ça. Maintenant, il fonctionne.

23
répondu misnyo 2009-07-03 11:25:28

j'ai trouvé une solution plus simple:

byte[] fileContents = null; 
using(MemoryStream stream = new MemoryStream()) 
{ 
    pdfDoc.Save(stream, true); 
    fileContents = stream.ToArray(); 
}

Source: http://usefulaspandcsharp.wordpress.com/2010/03/09/save-a-pdf-to-a-byte-array-using-pdf-sharpmigradoc/

9
répondu eCorke 2017-04-19 01:23:22

Pour MigraDoc (ver 1.30) j'ai pu 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

}
5
répondu Alex G 2015-06-30 08:06:14