Python'da bir `is_pdf (path_to_file) 'işlevini nasıl yazarsınız?
Arka plan görevi olarak Java kullanarak PDF'ler oluşturan bir Django projem var. Bazen süreç biraz zaman alabilir, bu nedenle müşteri şu şekilde bir oylama kullanır:
- İlk istek, oluşturma sürecini başlatır ve geri döner
None. - Sonraki her istek, PDF'nin oluşturulup oluşturulmadığını kontrol eder.
- Öyleyse, PDF'yi döndürür.
- Değilse,
Nonetekrar geri döner ve müşteri n saniye içinde tekrar kontrol etmek için başka bir istek planlar .
Sahip olduğum sorun, PDF'nin oluşturulmasının tamamlanıp tamamlanmadığını nasıl kontrol edeceğimi bilmemem. Java işlemi dosyayı aşamalı olarak oluşturur. Sadece PDF'nin var olup olmadığını kontrol edersem, döndürülen PDF genellikle geçersiz çünkü hala oluşturuluyor. Bu yüzden, ihtiyacım olan şey , dosya geçerli bir PDF veya başka bir şeyse is_pdf(path_to_file)geri dönen bir işlev .TrueFalse
Mümkünse bunu bir kitaplık olmadan yapmak istiyorum, ancak gerekirse bir kitaplık kullanacağım.
Linux'tayım.
İşte pdfminer kullanarak çalışan bir çözüm , ancak bana fazla geliyor gibi görünüyor.
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
Yalnızca bir dosyanın geçerli bir PDF olup olmadığını kontrol etmek için büyük bir kitaplık yüklemeyi içermeyen bir çözüm umuyorum.
Yanıtlar
Bu pypi.org/project/pdfminer.six'i buldum. Basit bir örnek oluşturdum. Senin için yararlı olup olmadığına bak. a.pdf boş bir dosyadır. Hala başka bir program tarafından işlenmekte olan bir pdf dosyasını okumaya çalışırken ne yapacağını bilmiyorum.
from pdfminer.high_level import extract_text
try:
text = extract_text("D:\\a.pdf")
print(text)
except :
print("invalid PDF file")
else:
pass
--- Güncelleme --
Alternatif olarak, pdfminer github'da bir PDFDocument örneği gördüm, https://github.com/pdfminer/pdfminer.six/blob/develop/tools/pdfstats.py 53. satırda.
Benzer bir örnek kod ürettim:
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
Örneğimde a.pdf boş olduğu için; open () işlevi istisnayı atar. Sizin durumunuzda, dosyayı açabileceğini tahmin ediyorum ama PDFParser veya PDFDocument bir istisna oluşturabilir. Herhangi bir istisna atılmazsa, PDFDocument.info niteliği faydalı olabilir.
- güncelleme 2 -
Belge nesnesinin xrefs niteliğine sahip olduğunu fark ettim. PdfParser sınıfında bir açıklama vardır: "Ayrıca her PDF dosyasının sonunda XRef'leri okur." Document.xrefs değerinin kontrol edilmesi faydalı olabilir.