Come scrivereste una funzione `is_pdf (path_to_file)` in Python?
Ho un progetto Django che crea PDF utilizzando Java come attività in background. A volte il processo può richiedere del tempo, quindi il client utilizza il polling in questo modo:
- La prima richiesta avvia il processo di compilazione e ritorna
None. - Ogni richiesta successiva verifica se il PDF è stato creato.
- Se lo è stato, restituisce il PDF.
- In caso contrario, ritorna di
Nonenuovo e il client pianifica un'altra richiesta per ricontrollare in n secondi.
Il problema che ho è che non so come controllare se la creazione del PDF è terminata. Il processo Java crea il file in più fasi. Se controllo solo se il PDF esiste, il PDF che viene restituito spesso non è valido, perché è ancora in fase di creazione. Quindi, ciò di cui ho bisogno è una is_pdf(path_to_file)funzione che restituisca Truese il file è un PDF valido e Falsealtrimenti.
Mi piacerebbe farlo senza una libreria se possibile, ma userò una libreria se necessario.
Sono su Linux.
Ecco una soluzione che funziona utilizzando pdfminer , ma mi sembra eccessivo.
from pdfminer.high_level import extract_text
def is_pdf(path_to_file):
"""Return True if path_to_file is a readable PDF"""
try:
extract_text(path_to_file, maxpages=1)
return True
except:
return False
Spero in una soluzione che non comporti l'installazione di una grande libreria solo per verificare se un file è un PDF valido.
Risposte
Ho trovato questo pypi.org/project/pdfminer.six. Ho prodotto un semplice esempio. Vedi se ti è utile. a.pdf è un file vuoto. Non so cosa farà quando proverò a leggere un file pdf che è ancora in fase di elaborazione da un altro programma.
from pdfminer.high_level import extract_text
try:
text = extract_text("D:\\a.pdf")
print(text)
except :
print("invalid PDF file")
else:
pass
--- aggiornare --
In alternativa, ho visto un esempio di PDFDocument su pdfminer github, https://github.com/pdfminer/pdfminer.six/blob/develop/tools/pdfstats.py sulla linea 53.
Ho prodotto un codice di esempio simile:
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfparser import PDFParser
try:
pdf_file = open("D:\\a.pdf", 'rb')
parser = PDFParser(pdf_file)
password = ''
document = PDFDocument(parser, password)
print(document.info)
print(document.xrefs)
except :
print("invalid PDF file")
else:
pass
Nel mio esempio, poiché a.pdf è vuoto; La funzione open () genera l'eccezione. Nel tuo caso, immagino che sarà in grado di aprire il file ma PDFParser o PDFDocument potrebbero generare un'eccezione. Se non viene generata alcuna eccezione, l'attributo PDFDocument.info potrebbe essere utile.
- aggiornamento 2 -
Mi sono reso conto che l'oggetto documento ha l'attributo xrif. c'è una spiegazione nella classe PdfParser: "Legge anche XRefs alla fine di ogni file PDF." Potrebbe essere utile controllare il valore di document.xrefs.