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!
Dovrai installare le seguenti librerie:
$ pip install PyMuPDF Pillow pytesseract
Inoltre, installa Tesseract-OCR sul tuo sistema operativo (assicurati che tesseract sia accessibile dal tuo PATH
).
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)
fitz
per accedere a ogni pagina del PDF e trovare le immagini, salvandole come file.pytesseract
viene utilizzato per leggere il testo da ogni immagine estratta.Tutte le immagini estratte dal PDF verranno salvate nella cartella immagini_estratte
.
Il testo riconosciuto tramite OCR verrà scritto nel file output_text.txt
.