2010-02-02 124 views
8

Estoy intentando crear un archivo pdf con iTextSharp. Mi intento escribe el contenido del pdf en un MemoryStream para que pueda escribir el resultado en un archivo y un BLOB de base de datos. El archivo se crea, tiene un tamaño de aproximadamente 21kB y se ve como un pdf cuando se abre con Notepad ++. Pero mi visor de PDF dice que está agotado. Aquí hay un pequeño fragmento de código (sólo intenta escribir en un archivo, no a una base de datos):iTextSharp + FileStream = Archivo PDF dañado

Document myDocument = new Document(); 
MemoryStream myMemoryStream = new MemoryStream(); 
PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream); 
myDocument.Open(); 
// Content of the pdf gets inserted here 
using (FileStream fs = File.Create("D:\\...\\aTestFile.pdf")) 
{ 
    myMemoryStream.WriteTo(fs); 
} 
myMemoryStream.Close(); 

dónde está el error que hago?

Gracias, Norbert

+0

qué necesita que MemoryStream? ¿cerró ese myDocument antes de escribir en FileStream? –

Respuesta

27

Creo que su problema fue que no estaba agregando correctamente contenido a su PDF. Esto se hace mediante el método Document.Add() y finaliza llamando a Document.Close().

Cuando llama a Document.Close(), sin embargo, su MemoryStream también se cierra, por lo que no podrá escribirlo en FileStream como lo hizo. Puede evitar esto almacenando el contenido de su MemoryStream en una matriz de bytes.

El siguiente fragmento de código funciona para mí:

using (MemoryStream myMemoryStream = new MemoryStream()) { 
    Document myDocument = new Document(); 
    PdfWriter myPDFWriter = PdfWriter.GetInstance(myDocument, myMemoryStream); 

    myDocument.Open(); 

    // Add to content to your PDF here... 
    myDocument.Add(new Paragraph("I hope this works for you.")); 

    // We're done adding stuff to our PDF. 
    myDocument.Close(); 

    byte[] content = myMemoryStream.ToArray(); 

    // Write out PDF from memory stream. 
    using (FileStream fs = File.Create("aTestFile.pdf")) { 
     fs.Write(content, 0, (int)content.Length); 
    } 
} 
+1

Gracias, esto lo hizo por mí – Norbert

+0

tenía el mismo problema, y ​​esto solución funcionó. Gracias! –

+0

Gracias por la solución funcionó para mí ... – ssmsnet

0

Sólo algunos pensamientos - ¿Qué ocurre si se reemplaza la secuencia de memoria con una secuencia de archivo? ¿Esto le da el resultado que necesita? Esto al menos te dirá dónde podría estar el problema.

Si esto funciona, ¿cómo difieren los archivos (en tamaño y representación binaria)?

Solo supongo, pero ¿ha intentado buscar el principio de la secuencia de memoria antes de escribir?

myMemoryStream.Seek(0, SeekOrigin.Begin); 
+0

Lo siguiente tampoco funcionó: 'Document myDocument = new Document(); PdfWriter myPDFWriter = PdfWriter.GetInstance (myDocument, new FileStream (ruta, FileMode.Create)); myDocument.Open(); // contenido ... myDocument.Close();?! ' archivo dañado ... :( – Norbert

+0

Ha intentado tirar de la corriente – matt

0

Intente verificar dos veces su código que manipula el PDF con iText. Asegúrese de estar llamando al método EndText apropiado de cualquier objeto PdfContentByte, y asegúrese de llamar a myDocument.Close() antes de escribir el archivo en el disco. Esas son cosas con las que he tenido problemas en el pasado al generar archivos PDF con iTextSharp.

0
documentobject.Close(); 
using (FileStream fs = System.IO.File.Create(path)){       
    Memorystreamobject.WriteTo(fs); 
}   
Cuestiones relacionadas