Estrazione di immagini da PDF e riconoscimento OCR

Introduzione

Questo appunto su come utilizzare Python per automatizzare l'estrazione di immagini dai documenti PDF e sottoporle a un processo di riconoscimento ottico dei caratteri (OCR). Attraverso l'uso di potenti librerie come PyMuPDF, Pillow e pytesseract, riusciremo a salvare le immagini e trasformare il contenuto visivo in testo leggibile. Questo processo risulta particolarmente utile quando si lavora con PDF che contengono documenti scannerizzati o immagini di testo. Andiamo a vedere nel dettaglio il codice necessario per mettere in pratica questa procedura!

Step da sviluppare

  • Lettura PDF: Utilizziamo la libreria PyMuPDF (nota come fitz) per aprire il PDF e estrarre le immagini.
  • Salvataggio delle immagini: Salviamo tutte le immagini estratte in una directory temporanea.
  • Riconoscimento OCR: Utilizziamo pytesseract per eseguire l'OCR sulle immagini estratte.
  • Salvataggio del testo: Scriviamo il testo ottenuto da ogni immagine in un file di testo.

Prerequisiti

Dovrai installare le seguenti librerie:

Bash output
$ pip install PyMuPDF Pillow pytesseract

Inoltre, installa Tesseract-OCR sul tuo sistema operativo (assicurati che tesseract sia accessibile dal tuo PATH).

Codice Python:

Bash output
import fitz  # PyMuPDF
import io
from PIL import Image
import pytesseract
import os

# Funzione per estrarre immagini dal PDF
def extract_images_from_pdf(pdf_path, output_dir):
    # Apri il file PDF
    pdf_document = fitz.open(pdf_path)
    
    # Itera su ogni pagina del PDF
    for page_number in range(len(pdf_document)):
        page = pdf_document.load_page(page_number)
        image_list = page.get_images(full=True)
        
        # Estrai le immagini
        for img_index, img in sorted(enumerate(image_list)):
            xref = img[0]
            base_image = pdf_document.extract_image(xref)
            image_bytes = base_image["image"]
            image_ext = base_image["ext"]
            image = Image.open(io.BytesIO(image_bytes))

            # Salva l'immagine nella directory di output
            image_filename = f"image_{page_number + 1:03d}_{img_index + 1:03d}.{image_ext}"
            image_path = os.path.join(output_dir, image_filename)
            image.save(image_path)

            print(f"Immagine estratta e salvata: {image_path}")
    
    pdf_document.close()

# Funzione per eseguire OCR su immagini e salvare testo
def ocr_images_to_text(image_dir, output_text_file):
    with open(output_text_file, 'w', encoding='utf-8') as text_file:
        # Itera su ogni immagine nella directory
        for image_filename in os.listdir(image_dir):
            if image_filename.endswith((".png", ".jpg", ".jpeg", ".tiff")):
                image_path = os.path.join(image_dir, image_filename)

                # Esegui OCR con pytesseract
                image = Image.open(image_path)
                text = pytesseract.image_to_string(image)

                # Scrivi il testo nel file di output
                text_file.write(f"--- Testo estratto da {image_filename} ---\n")
                text_file.write(text + "\n")
                print(f"Testo OCR estratto da {image_filename} e salvato.")

# Funzione principale
def main(pdf_path, output_dir, output_text_file):
    # Crea la directory di output se non esiste
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # Estrazione immagini dal PDF
    extract_images_from_pdf(pdf_path, output_dir)
    
    # Esecuzione OCR sulle immagini estratte
    ocr_images_to_text(output_dir, output_text_file)

# Esegui il processo
pdf_path = "documento.pdf"  # Percorso del file PDF
output_dir = "immagini_estratte"  # Directory per salvare le immagini
output_text_file = "output_text.txt"  # File di testo per salvare il risultato OCR

main(pdf_path, output_dir, output_text_file)

Spiegazione del codice Python:

  • Estrazione delle immagini:
    • Usa fitz per accedere a ogni pagina del PDF e trovare le immagini, salvandole come file.
  • OCR sulle immagini:
    • pytesseract viene utilizzato per leggere il testo da ogni immagine estratta.
  • Salvataggio del testo:
    • Tutti i risultati OCR vengono concatenati in un unico file di testo.

Risultati:

Tutte le immagini estratte dal PDF verranno salvate nella cartella immagini_estratte.
Il testo riconosciuto tramite OCR verrà scritto nel file output_text.txt.