Como você escreveria uma função `is_pdf (path_to_file)` em Python?

Oct 08 2020

Eu tenho um projeto Django que cria PDFs usando Java como uma tarefa em segundo plano. Às vezes, o processo pode demorar um pouco, então o cliente usa a pesquisa assim:

  1. A primeira solicitação inicia o processo de construção e retorna None.
  2. Cada solicitação subsequente verifica se o PDF foi criado.
    • Se tiver sido, ele retorna o PDF.
    • Se não tiver, ele retorna Nonenovamente e o cliente agenda outra solicitação para verificar novamente em n segundos.

O problema que tenho é que não sei como verificar se a construção do PDF terminou. O processo Java cria o arquivo em etapas. Se eu apenas verificar se o PDF existe, o PDF retornado geralmente é inválido, porque ainda está sendo criado. Então, o que eu preciso é de uma is_pdf(path_to_file)função que retorne Truese o arquivo for um PDF válido e Falsecaso contrário.

Gostaria de fazer isso sem uma biblioteca, se possível, mas usarei uma biblioteca se necessário.

Estou no Linux.

Aqui está uma solução que funciona usando o pdfminer , mas parece um exagero para mim.

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

Espero uma solução que não envolva a instalação de uma grande biblioteca apenas para verificar se um arquivo é um PDF válido.

Respostas

AntiqTech Oct 08 2020 at 23:30

Encontrei este pypi.org/project/pdfminer.six. Produzi um exemplo simples. Veja se é útil para você. a.pdf é um arquivo vazio. Não sei o que fará ao tentar ler um arquivo pdf que ainda está sendo processado por outro programa.

from pdfminer.high_level import extract_text

try:
 text = extract_text("D:\\a.pdf")
 print(text)
except :
 print("invalid PDF file")
else:
 pass

--- atualizar -

Como alternativa, vi um exemplo de PDFDocument no pdfminer github, https://github.com/pdfminer/pdfminer.six/blob/develop/tools/pdfstats.py na linha 53.

Produzi um exemplo de código semelhante:

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

No meu exemplo, já que a.pdf está vazio; A função open () lança a exceção. No seu caso, suponho que será capaz de abrir o arquivo, mas PDFParser ou PDFDocument podem lançar uma exceção. Se nenhuma exceção for lançada, o atributo PDFDocument.info pode ser útil.

- atualização 2 -

Percebi que o objeto de documento tem o atributo xrefs. há uma explicação na classe PdfParser: "Ele também lê XRefs no final de cada arquivo PDF." Verificar o valor de document.xrefs pode ser útil.