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?
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.
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.
j'ai trouvé une solution plus simple:
byte[] fileContents = null;
using(MemoryStream stream = new MemoryStream())
{
pdfDoc.Save(stream, true);
fileContents = stream.ToArray();
}
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
}