c# - ejemplos - PDFsharp guardar en MemoryStream
pdfsharp nuget (4)
Quiero guardar un PdfSharp.Pdf.PdfDocument por su método Save en un Stream, pero no adjunta la configuración del encabezado del PDF. Entonces, cuando leo nuevamente Stream y se lo devuelvo al usuario, ve que el archivo PDF no es válido. ¿Hay alguna solución para adjuntar la configuración del encabezado PDF cuando PDFsharp se guarda en la memoria?
Encontré una solución más simple:
byte[] fileContents = null;
using(MemoryStream stream = new MemoryStream())
{
pdfDoc.Save(stream, true);
fileContents = stream.ToArray();
}
Entonces la solución:
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);
}
Hay este material de MigraDoc que viene con PdfSharp, pero apenas encontré ningún doc / faq adecuado para él. Después de horas buscando en Google he encontrado un fragmento que era algo como esto. Ahora funciona.
Para MigraDoc (ver 1.30) podría guardarlo con
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
}
Si cree que hay un problema con PdfDocument.Save, informe esto en el foro de PDFsharp (pero sea más específico con la descripción de su error). Tu "solución" parece un truco para mí. "pdfRenderer.Save" llama "PdfDocument.Save" internamente. Cualquiera que sea el problema, su "solución" sigue llamando a la misma rutina de Guardar.
Editar: para obtener un byte [] que contenga un archivo PDF, solo tiene que llamar:
MemoryStream stream = new MemoryStream();
document.Save(stream, false);
byte[] bytes = stream.ToArray();
Las primeras versiones de PDFsharp no restablecen la posición de la secuencia.
Entonces tienes que llamar
ms.Seek(0, SeekOrigin.Begin);
para restablecer la posición de la secuencia antes de leer desde la secuencia; esto ya no es necesario para las versiones actuales.
El uso de ToArray a menudo se puede utilizar en lugar de leer de la transmisión.
Editar 2: en lugar de stream.ToArray()
, puede ser más eficiente usar stream.GetBuffer()
, pero este búfer suele ser más grande que el archivo PDF y solo tiene que usar stream.Length
bytes desde ese búfer. Muy útil para el método que toma un byte[]
junto con un parámetro de longitud.