web-dev-qa-db-fra.com

Comment vérifier si PDF est une image numérisée ou contient du texte

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

13
Jinu Joseph

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

2
Rahul Agarwal

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.

2
Vito Gentile

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

1
m.borhan

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")
1
Anjaly Vijayan

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")
1
ExtractTable.com
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
0
Vikas Goel