2011-05-31 47 views
18

¿Hay alguna manera de verificar si un byte [] es un pdf sin abrir?Determine si un byte [] es un archivo pdf

Tengo un código para mostrar una lista de bytes [] como miniaturas en PDF. Sabía que todo el byte [] eran PDF porque filtramos el servlet para que solo devuelva estos. Ahora el requisito ha cambiado y necesito recuperar todos los tipos de archivos. ¿Hay alguna manera de verificar qué es el byte [], o más específicamente determinar si no lo es, un pdf?

+1

Tal vez esto puede ser de alguna ayuda: http://stackoverflow.com/questions/2731917/how-to-detect-if-a -file-is-pdf-or-tiff –

+1

-1: abra un editor hexadecimal y vea el encabezado de un PDF. No dificil. Respuesta: '% PDF' es los primeros 4 bytes. – leppie

+0

@leppie: algunos formatos no tienen tales especificaciones (como csv, por ejemplo). Entonces, hasta que encuentre la especificación "oficial", es muy malo simplemente "abrir un editor hexadecimal". Por ejemplo, el formato JPEG no es tan fácil :) – chopikadze

Respuesta

39

Compruebe los primeros 4 bytes de la matriz.

Si esos son 0x25 0x50 0x44 0x46 entonces es muy probablemente un archivo PDF.

+0

Por alguna razón he votado esta respuesta, cuando quise votar. Y no puedo cambiarlo ahora. –

+4

Utilicé esta respuesta durante algunos años y ahora estoy mirando un PDF que comienza con 0xEF 0XBB 0XBF. ¿Alguna idea? – MichaelD

+4

Parece que estos bytes se anteponen a un PDF con formato UTF-8. Esto significa que no puede verificar ciegamente en 0x25 0x50 ... – MichaelD

8

Por lo que sé, todos los PDF comienzan con %PDF, por lo que puede consultar los primeros bytes en esta cadena.

14

Los primeros cuatro bytes deben ser: 0x25 0x50 0x44 0x46 (en formato hexadecimal, en ASCII es %PDF). "Números mágicos" para otros formatos que puede encontrar here

3

Si bien la respuesta correcta y las otras respuestas son correctas, no serán exitosas el 100% del tiempo. El problema es que la especificación de PDF dice que% PDF-1.x solo necesita estar en los primeros 1024 bytes y no en los primeros 4. Algunos programas agregarán información antes de% PDF y seguirán siendo válidos.

recomendaría ver la respuesta a la siguiente pregunta de desbordamiento de pila: How to detect if a file is PDF or TIFF?

+1

* El problema es que la especificación PDF dice que% PDF-1.x solo necesita estar en los primeros 1024 bytes y no los primeros 4 * - Esto está mal, la especificación (ISO 32000-1) dice claramente "** La primera línea de un archivo PDF debe ser un encabezado que consta de los 5 caracteres% PDF, seguido de una versión número de la forma 1.N, donde N es un dígito entre 0 y 7 ** ". Incluso las referencias de Adobe PDF dicen de manera similar: "La primera línea de un archivo PDF es un encabezado que identifica la versión de la especificación PDF a la que se ajusta el archivo" y ofrece las mismas variantes que la especificación. Simplemente ... – mkl

+0

... Simplemente las *** notas de implementación *** de las referencias de Adobe PDF dicen que "** Los visualizadores de Acrobat solo requieren que el encabezado aparezca en algún lugar dentro de los primeros 1024 bytes del archivo. **" , "Algunos programas agregarán información antes de% PDF y aún serán válidos". es incorrecto, los archivos PDF creados son *** no válidos ***, simplemente son aceptados y mostrados por un número de espectadores a pesar de estar rotos; también son rechazados por muchos otros procesadores de PDF. – mkl

+0

Los valores de% PDF-1.x pueden aparecer más allá de los primeros caracteres y seguir siendo válidos, al contrario de lo que menciona. Tengo varios archivos PDF válidos que tienen% PDF-1.x fuera de los primeros 8 caracteres.Por lo tanto, la razón por la que estaba buscando una buena respuesta para resolver este problema. Lamentablemente, todas las publicaciones menos una dicen que usan los primeros caracteres y coinciden con% PDF-1.x. Tener unos pocos archivos que son válidos y fallar en ese enfoque me llevó a señalar que el método de solo verificar los primeros caracteres no siempre es válido, como dije en la publicación y recomendé el otro método. –

Cuestiones relacionadas