Saltar al contenido

¿Cómo puedo determinar si un archivo es un archivo PDF?

Posterior a consultar expertos en el tema, programadores de diversas ramas y profesores dimos con la solución al dilema y la plasmamos en este post.

Solución:

Esto es lo que uso en mis pruebas de NUnit, que debe validarse con varias versiones de PDF generadas con Crystal Reports:

public static void CheckIsPDF(byte[] data)
    
        Assert.IsNotNull(data);
        Assert.Greater(data.Length,4);

        // header 
        Assert.AreEqual(data[0],0x25); // %
        Assert.AreEqual(data[1],0x50); // P
        Assert.AreEqual(data[2],0x44); // D
        Assert.AreEqual(data[3],0x46); // F
        Assert.AreEqual(data[4],0x2D); // -

        if(data[5]==0x31 && data[6]==0x2E && data[7]==0x33) // version is 1.3 ?
                          
            // file terminator
            Assert.AreEqual(data[data.Length-7],0x25); // %
            Assert.AreEqual(data[data.Length-6],0x25); // %
            Assert.AreEqual(data[data.Length-5],0x45); // E
            Assert.AreEqual(data[data.Length-4],0x4F); // O
            Assert.AreEqual(data[data.Length-3],0x46); // F
            Assert.AreEqual(data[data.Length-2],0x20); // SPACE
            Assert.AreEqual(data[data.Length-1],0x0A); // EOL
            return;
        

        if(data[5]==0x31 && data[6]==0x2E && data[7]==0x34) // version is 1.4 ?
        
            // file terminator
            Assert.AreEqual(data[data.Length-6],0x25); // %
            Assert.AreEqual(data[data.Length-5],0x25); // %
            Assert.AreEqual(data[data.Length-4],0x45); // E
            Assert.AreEqual(data[data.Length-3],0x4F); // O
            Assert.AreEqual(data[data.Length-2],0x46); // F
            Assert.AreEqual(data[data.Length-1],0x0A); // EOL
            return;
        

        Assert.Fail("Unsupported file format");
    

puede averiguar el tipo mime de un archivo (o byte array), por lo que no confía tontamente en la extensión. Lo hago con MimeExtractor de apertura (http://aperture.sourceforge.net/) o vi hace unos días una biblioteca solo para eso (http://sourceforge.net/projects/mime-util)

Utilizo la apertura para extraer texto de una variedad de archivos, no solo pdf, sino que también tengo que modificar las ideas para los pdf, por ejemplo (aperture usa pdfbox, pero agregué otra biblioteca como alternativa cuando falla pdfbox)

Como usa PDFBox, simplemente puede hacer:

PDDocument.load(file);

Fallará con una excepción si el PDF está dañado, etc.

Si tiene éxito, también puede verificar si el PDF está encriptado usando .isEncrypted()

Nos puedes sustentar nuestro estudio fijando un comentario o dejando una valoración te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *