Como você escreveria uma função `is_pdf (path_to_file)` em Python?
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:
- A primeira solicitação inicia o processo de construção e retorna
None. - 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
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.