2009-07-02 24 views
25

Quiero guardar un PdfSharp.Pdf.PdfDocument por su método Guardar en un Stream, pero no le adjunta la configuración del encabezado 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?PDFsharp guardar en MemoryStream

Respuesta

20

Así que 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); 
} 

No es esto MigraDoc que viene con PDFsharp, pero apenas encontró ninguna adecuada doc/Preguntas para ello. Después de horas buscando en Google he encontrado un fragmento que era algo como esto. Ahora funciona.

+5

¿Qué hay pDoc? ¿Es eso lo mismo que doc? –

+0

funcionó para mí de esta manera: pdfRenderer.Document = doc; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save (transmisión); – vicentedealencar

+0

¿Qué es pDoc ???? – Zafar

30

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). Su "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 conseguir un byte [] que contiene un archivo PDF, es suficiente con llamar:

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

Las primeras versiones de PDFsharp No restaurar la posición corriente.

Así que hay que llamar

ms.Seek(0, SeekOrigin.Begin); 

para restablecer la posición corriente antes de la lectura de la corriente; 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.

Edición 2: en lugar de stream.ToArray() puede ser más eficaz utilizar stream.GetBuffer(), pero este buffer es generalmente mayor que el archivo PDF y sólo tiene que utilizar stream.Length bytes desde ese búfer. Muy útil para el método que toma un byte[] junto con un parámetro de longitud.

5

Para MigraDoc (ver 1.30) pudiera salvarla 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 

}