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 puedo abrir un archivo PDF, comprimirlo en formato ZIP y luego crear una cadena codificada en Base64 en C#?

Tengo la tarea de incrustar un archivo PDF comprimido recuperado del sistema de archivos en un documento XML en C#. La especificación establece:

Por ejemplo, recuperar el archivo ‘INV001.pdf’

Comprimirlo para obtener un archivo ‘INV001.zip’

2/ Codificar cada archivo .zip en formato Base64

El objetivo es transformar el archivo zip, que es un objeto binario, en un archivo de texto.

El contenido del archivo de texto será una cadena de texto que podremos copiar/pegar en el archivo .xml

Aquí es donde llegué con el código:

string docText = null;
using (FileStream originalFileStream = File.Open(myFilePath, FileMode.Open))
{
    using (FileStream compressedFileStream = File.Create("compressed.gz"))
    {
        using (var compressor = new GZipStream(compressedFileStream, CompressionMode.Compress, true))
        {
            originalFileStream.CopyTo(compressor);
            using (StreamReader sr = new StreamReader(compressor))
            {
                docText = sr.ReadToEnd();
            }
        }
    }
}

El código lanza una excepción en la línea:

using (StreamReader sr = new StreamReader(compressor))

“El flujo no era legible”.
¿Estoy en el camino correcto aquí? No hay requisito de almacenar el archivo ZIP, solo de pegarlo como texto Base64 en un archivo XML. He encontrado algunos artículos en SO que sugieren algunos enfoques, ¡pero ninguno parece funcionar!
Muchas gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    Necesitas eliminar el bloque using (StreamReader sr = new StreamReader(compressor)) ya que no necesitas leer el archivo comprimido. En su lugar, necesitas codificar el archivo comprimido en formato de cadena Base64. Aquí tienes un ejemplo de cómo hacerlo:

    c#
    string base64String = null;
    using (FileStream originalFileStream = File.Open(myFilePath, FileMode.Open))
    {
    using (MemoryStream compressedStream = new MemoryStream())
    {
    using (var compressor = new GZipStream(compressedStream, CompressionMode.Compress, true))
    {
    originalFileStream.CopyTo(compressor);
    }
    byte[] compressedBytes = compressedStream.ToArray();
    base64String = Convert.ToBase64String(compressedBytes);
    }
    }

    Explicación:

    1. Abre el archivo PDF original usando un FileStream.
    2. Crea un nuevo MemoryStream para almacenar los datos comprimidos.
    3. Crea un nuevo GZipStream utilizando el MemoryStream y comprime el archivo PDF.
    4. Convierte los datos comprimidos a un arreglo de bytes.
    5. Convierte el arreglo de bytes a una cadena Base64 usando Convert.ToBase64String().

    Luego puedes pegar la variable base64String en tu archivo XML. Recuerda que no necesitas guardar el archivo comprimido en el disco, por lo que puedes eliminar la línea File.Create("compressed.gz").

Comments are closed.