Augusto Humire Martinez web blog

algo de web-in

Convertir iText pdf a MemoryStream a Stream a byte[]

El escenario requiere crear un archivo pdf en forma de Stream para poder enviarlo a un Servicio Web, asi que lo se hace es Se crea un MemoryStream conteniendo el stream a escribir usando PdfWriter,

PdfWriter writer = PdfWriter.GetInstance(documentoPdf, memoryStream);

 aperturamos el documento y luego agregamos un parrafo sencillo con Paragraph

y asi a partir del MemoryStream creamos un Stream con

Stream stream = newMemoryStream(memoryStream.ToArray());

para verificar que contiene la misma informacion probamos creando un archivo a partir de un array de bytes provenientes del Stream

byte[] array2 = ToArray(stream);
File.WriteAllBytes(string.Format(@”{0}\Requisito2.pdf”, “C:\temp\”), array2);

Atencion que la clase Stream no contiene el Metodo ToArray entonces emularemos un Stream.ToArray() con la funcion ToArray

 codigo Completo:

private void CreatePdfFile()

{
MemoryStream memoryStream = newMemoryStream();
Document documentoPdf = newDocument();
PdfWriter writer = PdfWriter.GetInstance(documentoPdf, memoryStream);
documentoPdf.Open();

Paragraph
tituloParagraph = newParagraph(newChunk(“Texto Aqui”, FontFactory.GetFont(“Arial”, 10, iTextSharp.text.Font.BOLD)));
tituloParagraph.Alignment =Element.ALIGN_CENTER;
tituloParagraph.Add(“\n\n”);
documentoPdf.Add(tituloParagraph);
documentoPdf.Close();
writer.Flush();

Stream
stream = newMemoryStream(memoryStream.ToArray());
byte[] array2 = ToArray(stream);
File.WriteAllBytes(string.Format(@”{0}\Requisito2.pdf”, Application.StartupPath), array2);

}

private byte[] ToArray(Stream stream)
{
byte[] byteArray = newbyte[stream.Length];
int numBytesToRead = (int)stream.Length;
int numBytesRead = 0;
while(numBytesToRead > 0)
{
// Lectura que nos podria devolver entre cero y byteArray.Length
int n = stream.Read(byteArray, numBytesRead, byteArray.Length);
// Cuando llega al final
if (n == 0)
break;

numBytesRead += n;
numBytesToRead -= n;

}
return byteArray;

}

Nota: Cuando se se ejecuta la linea documento.Close(), el objeto memoryStream se cierra y eso hace no posible la lectura posterior de sus miembros como por ejemplo memoryStream.Length y el error se describe como “Cannot access a closed Stream” que es lo mismo que “no se puede tener acceso al Stream cerrado”, por esa razon se realiza una casi copia del stream usando la liena
Stream stream = newMemoryStream(memoryStream.ToArray());
para poder tener el stream abierto y manipularlo.

Dudas,aportes y/o comentarios,  escribir aqui mismo.

octubre 10, 2011 - Posted by | Uncategorized

3 comentarios »

  1. StartupPath me lanza un error

    Comentario por Anónimo | septiembre 20, 2012

  2. ” Application.StartupPath” el problema al parecer es que “Application” solo me lo reconoce como una propiedad no como una clase …

    Comentario por Anónimo | septiembre 20, 2012

  3. La aplicacion que puse en el ejemplo es del tipo WindowsForm probablemente alli tengas la respuesta. StartupPath describe la ruta desde donde se ejecuta la aplicacion.
    saludos cordiales.

    Comentario por augustohumire | septiembre 21, 2012


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: