Come scrivereste una funzione `is_pdf (path_to_file)` in Python?

Oct 08 2020

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:

  1. La prima richiesta avvia il processo di compilazione e ritorna None.
  2. 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

AntiqTech Oct 08 2020 at 23:30

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.