J'ai un grand nombre de fichiers, certains d'entre eux sont des images numérisées dans PDF et certains sont du texte intégral/partiel PDF.
Existe-t-il un moyen de vérifier ces fichiers pour vous assurer que nous ne traitons que des fichiers numérisés et non ceux qui sont du texte intégral/partiel PDF fichiers?
environnement: PYTHON 3.6
Le code ci-dessous fonctionnera, pour extraire des données de texte de données provenant des PDF consultables et interrogeables.
import fitz
text=""
path = ("Your_scanned_or_partial_scanned.pdf")
doc = fitz.open(path)
for page in doc:
text+=(page.getText())
Si vous n'avez pas fitz
module, vous devez le faire:
pip install --upgrade pymupdf
Bâtiment sur le dessus de solution de Rahul Agarwal , avec quelques extraits que j'ai trouvés à ce lien , voici un algorithme possible qui devrait résoudre votre problème.
Vous devez installer fitz
et PyMuPDF
modules. Vous pouvez le faire au moyen de pip
:
pip3 install fitz PyMyPDF
Et voici la mise en œuvre Python3:
import fitz
def check_pdf_scanned_plain(file_name):
# This algorithm calculates the percentage of document that is covered by (searchable) text
page_num = 0
text_perc = 0.0
doc = fitz.open(contract_file_name)
for page in doc:
page_num = page_num + 1
page_area = abs(page.rect)
text_area = 0.0
for b in page.getTextBlocks():
r = fitz.Rect(b[:4]) # rectangle where block text appears
text_area = text_area + abs(r)
text_perc = text_perc + (text_area / page_area)
text_perc = text_perc / page_num
# If the percentage of text is very low, the document is most likely a scanned PDF
if text_perc < 0.01:
print("fully scanned PDF - no relevant text")
else:
print("not fully scanned PDF - text is present")
Bien que cette réponse vous réponde (c'est-à-dire la distinction entre les PDF textuelles entièrement numérisées et entièrement numérisées), cette solution n'est pas capable de distinguer les PDF textuelles complets et les PDF numérisés qui ont également des textes en eux.
Vous pouvez utiliser pdfpplumber. Si le code suivant revient "Aucun", c'est un PDF numérisé sinon c'est interrogeable.
with pdfplumber.open(file_name) as pdf:
page = pdf.pages[0]
text = page.extract_text()
print(text)
Pour extraire le texte du PDF numérisé, vous pouvez utiliser OCRMYPDF. Paquet facile
Essayez OCRMYPDF . Vous pouvez utiliser cette commande pour convertir un PDF numérisé en PDF numérique.
ocrmypdf input_scanned.pdf output_digital.pdf
Si l'entrée PDF est numérique, la commande jettera une erreur "PriorocfoundRorror: la page a déjà du texte!".
import subprocess as sp
import re
output = sp.getoutput("ocrmypdf input.pdf output.pdf")
if not re.search("PriorOcrFoundError: page already has text!",output):
print("Uploaded scanned pdf")
else:
print("Uploaded digital pdf")
Que diriez-vous de PDF MetaData vérifier '/Resources'
?!
Je crois que pour tout texte dans A PDF (document électronique), il y a plus de chances d'avoir une police, en particulier du PDF, dont l'objectif est de créer un fichier portable, il contient donc la définition de police .
Si vous êtes un PyPDF2
utilisateur, essayez
pdf_reader = PyPDF2.PdfFileReader(input_file_location)
page_data = pdf_reader.getPage(page_num)
if '/Font' in page_data['/Resources']:
print("[Info]: Looks like there is text in the PDF, contains:", page_data['/Resources'].keys())
Elif len(page_data1['/Resources'].get('/XObject', {})) != 1:
print("[Info]: PDF Contains:", page_data['/Resources'].keys())
for obj in x_object:
obj_ = x_object[obj]
if obj_['/Subtype'] == '/Image':
print("[Info]: PDF is image only")
def get_pdf_searchable_pages(fname):
# pip install pdfminer
from pdfminer.pdfpage import PDFPage
searchable_pages = []
non_searchable_pages = []
page_num = 0
with open(fname, 'rb') as infile:
for page in PDFPage.get_pages(infile):
page_num += 1
if 'Font' in page.resources.keys():
searchable_pages.append(page_num)
else:
non_searchable_pages.append(page_num)
if page_num > 0:
if len(searchable_pages) == 0:
print(f"Document '{fname}' has {page_num} page(s). "
f"Complete document is non-searchable")
Elif len(non_searchable_pages) == 0:
print(f"Document '{fname}' has {page_num} page(s). "
f"Complete document is searchable")
else:
print(f"searchable_pages : {searchable_pages}")
print(f"non_searchable_pages : {non_searchable_pages}")
else:
print(f"Not a valid document")
if __name__ == '__main__':
get_pdf_searchable_pages("1.pdf")
get_pdf_searchable_pages("1Scanned.pdf")
Production:
Document '1.pdf' has 1 page(s). Complete document is searchable
Document '1Scanned.pdf' has 1 page(s). Complete document is non-searchable