licence ejemplos c# .net pdf stream pdfsharp

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?



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.