¿Cómo escribir un archivo PDF desde un MemoryStream utilizando iText 7 y C#?
Tengo un documento PDF (usando iText 7/C# 4.01) que estoy creando en un MemoryStream y al final, quiero escribirlo en un archivo. Parte de la razón por la que lo estoy creando en un MemoryStream es porque quiero agregar encabezados y pies de página al final y esperaba evitar escribirlo en un archivo y luego leer el archivo nuevamente, agregar los encabezados y pies de página, y luego escribir un nuevo archivo (como parecen hacer los ejemplos que encuentro en el sitio web de iText). Sin embargo, parece que estoy teniendo algún tipo de escenario de “huevo o gallina” en el siguiente código. Parece que debes cerrar el documento para que iText lo forme completamente. Sin embargo, si lo cierro, obtengo una excepción ObjectDisposedException al intentar escribirlo (ejemplo simplificado a continuación). Debo estar pasando por alto algo simple, ¿verdad? Gracias.
MemoryStream baos = new MemoryStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument pdfDocument = new PdfDocument(writer.SetSmartMode(true));
//writer.SetCloseStream(true);
//pdfDocument.SetCloseWriter(true);
//pdfDocument.SetCloseReader(true);
//pdfDocument.SetFlushUnusedObjects(true);
Document d = new Document(pdfDocument, iText.Kernel.Geom.PageSize.LETTER);
d.Add(new Paragraph("¡Hola mundo!"));
//d.Close();
FileStream file = new FileStream("C:\test.pdf",
FileMode.Create, FileAccess.Write);
baos. WriteTo(file);
file.Close();
//baos.Close();
//d.Close();
davy.ai
Parece que el problema que estás enfrentando está relacionado con cuándo cerrar el documento en tu proceso de creación de PDF con iText. Dado que deseas agregar un encabezado y un pie de página a tu documento PDF, estás utilizando un MemoryStream para evitar leer y escribir en un archivo varias veces. Sin embargo, necesitas cerrar el documento para formarlo completamente, pero luego no puedes escribirlo en un archivo sin obtener una ObjectDisposedException.
Una solución potencial a este problema es crear un PdfDocument utilizando un PdfWriter y un MemoryStream, luego agregar tu contenido al documento como de costumbre. Sin embargo, en lugar de cerrar el documento, puedes inicializar un PdfDocumentRenderer con tu PdfDocument y llamar a su método render para estampar los encabezados y pies de página en el documento. De esta manera, evitas el escenario de “huevo o la gallina” de necesitar cerrar el documento para formarlo completamente, pero también necesitar que esté abierto para estampar los encabezados y pies de página.
Aquí tienes un ejemplo de cómo podrías modificar tu código para lograr esto:
Al utilizar este enfoque, puedes crear tu documento PDF, estampar tus encabezados y pies de página, y escribir la salida final en memoria sin la necesidad de realizar operaciones de E/S de archivo intermedias.