es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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();
Tags:  , , ,

Answer

  1. Avatar for 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:

    MemoryStream baos = new MemoryStream();
    PdfWriter writer = new PdfWriter(baos);
    PdfDocument pdfDocument = new PdfDocument(writer);
    Document d = new Document(pdfDocument, PageSize.LETTER);
    d.Add(new Paragraph("¡Hola mundo!"));
    
    // Crea un PdfDocumentRenderer con tu PdfDocument
    PdfDocumentRenderer renderer = new PdfDocumentRenderer(true);
    renderer.Document = pdfDocument;
    // Configura tus encabezados y pies de página
    // ...
    
    // Renderiza tu documento con encabezados y pies de página
    renderer.RenderDocument();
    
    // Escribe tu archivo PDF final en el disco
    FileStream file = new FileStream("C:\\test.pdf", FileMode.Create, FileAccess.Write);
    baos.WriteTo(file);
    file.Close();
    

    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.

Comments are closed.