Solución:
Actualización 2020
Parece que pdfminer.six es un proyecto mantenido (los otros, incluido el de abajo, parecen muertos).
ReportLab es otro (marcado erróneamente como muerto por mí)
Respuesta original
Dado que aparentemente ninguno de los dos PyPdf
ni ya está disponible, la solución actual que encontré (a partir de 2015) es usar ReportLab
PyPDF2
y detectar excepciones (y posiblemente analizar getDocumentInfo()
)
import PyPDF2
with open("testfile.txt", "w") as f:
f.write("hello world!")
try:
PyPDF2.PdfFileReader(open("testfile.txt", "rb"))
except PyPDF2.utils.PdfReadError:
print("invalid PDF file")
else:
pass
En un proyecto, si es mío, necesito verificar el tipo de mimo de algún archivo cargado. Simplemente uso el comando de archivo como este:
from subprocess import Popen, PIPE
filetype = Popen("/usr/bin/file -b --mime -", shell=True, stdout=PIPE, stdin=PIPE).communicate(file.read(1024))[0].strip()
Por supuesto, es posible que desee mover el comando real a algún archivo de configuración, ya que también las opciones de la línea de comandos varían entre los sistemas operativos (por ejemplo, mac).
Si solo necesita saber si es un PDF o no y no necesita procesarlo de todos modos, creo que el comando de archivo es una solución más rápida que una lib. Por supuesto, hacerlo a mano también es posible, pero el comando de archivo le brinda tal vez más flexibilidad si desea verificar diferentes tipos.
Las dos bibliotecas PDF más utilizadas para Python son:
- pyPdf
- ReportLab
Ambos son Python puro, por lo que deberían ser fáciles de instalar y multiplataforma.
Con pyPdf probablemente sería tan simple como hacer:
from pyPdf import PdfFileReader
doc = PdfFileReader(file("upload.pdf", "rb"))
Esto debería ser suficiente, pero doc
ahora tendrá documentInfo()
y numPages()
métodos si desea realizar más comprobaciones.
Como respondió Carl, pdftotext también es una buena solución y probablemente sería más rápido en documentos muy grandes (especialmente aquellos con muchas referencias cruzadas). Sin embargo, podría ser un poco más lento en PDF pequeños debido a la sobrecarga del sistema de bifurcar un nuevo proceso, etc.