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.