Error al leer documento PDF: PDF header signature not found


Durante esta semana he estado trabajando en un proyecto en el que es necesario determinar cuándo se ha añadido un fichero a un Azure Storage, obtenerlo y leerlo para extraer la información que contiene mediante la URI del mismo.

Los documentos que necesitamos tratar son PDF, para lo que utilizamos el paquete nuget iTextSharp.LGPLv2.Core para .Net Core 2.1. Es aquí donde viene el problema, una vez descargamos el  documento obtenemos la excepción "PDF header signature not found" al intentar instanciar la clase PdfReader pasando el stream del documento en cuestión.

A continuación ilustramos el caso comentado con una versión muy simplificada del código:


        var ­­­storageAccouont = CloudStorageAccount.Parse(connectionString);
        var client = storageAccount.CreateCloudBlobClient();
        var cloudBlob = new CloudBlockBlob(documentUri, client);

        MemoryStream documentStream = new MemoryStream();
        await cloudBlob.DownloadToStreamAsync(documentStream);
        try
        {
            var reader = new PdfReader(documentStream);
            ...
        }
        catch (Exception ex) {

        }


La razón de que esto ocurra es que cuando obtenemos el stream desde Azure Storage mediante:

        MemoryStream documentStream = new MemoryStream();     
        await cloudBlob.DownloadToStreamAsync(documentStream);

dejamos posicionado el stream justo después del contenido descargado. De ahí que obtengamos el error anteriormente descrito y que el índice se encuentre fuera de rango.

Para corregir esto tendremos que volver a posicionar el stream al comienzo de este de la siguiente forma:
           
        var storageAccouont = CloudStorageAccount.Parse(connectionString);
        var client = storageAccount.CreateCloudBlobClient();
        var cloudBlob = new CloudBlockBlob(documentUri, client);

        MemoryStream documentStream = new MemoryStream();
        await cloudBlob.DownloadToStreamAsync(documentStream);
        try
        {
     documentStream.Position = 0; // nos posicionamos al comienzo
            var reader = new PdfReader(documentStream);
            ...
        }
        catch (Exception ex) {

        }


Esta solución se ha obtenido tras leer esta entrada de StackOverflow.

Comentarios