Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

PHP e Tesseract per estrarre testo dalle immagini (OCR)

Come realizzare un'applicazione PHP che utilizza Tesseract per estrarre testo dalle immagini con l'OCR (Optical Character Recognition)
Come realizzare un'applicazione PHP che utilizza Tesseract per estrarre testo dalle immagini con l'OCR (Optical Character Recognition)
Link copiato negli appunti

L'estrazione di testo dalle immagini è una pratica comune che trova applicazione in vari ambiti, come la digitalizzazione di documenti, la lettura automatica di segnali e molto altro. In questo articolo scopriremo come configurare un'applicazione PHP che utilizza Tesseract OCR (Optical Character Recognition) per eseguire questa operazione. Inizieremo con l'installazione di PHP e delle dipendenze necessarie. Poi passeremo alla scrittura del codice.

Requisiti di sistema, non solo PHP

Prima di iniziare, assicurati di avere i seguenti requisiti di sistema:

  • PHP: assicurati di avere installato PHP (versione 8.1 o successiva).
  • Composer: è necessario avere Composer installato per gestire le dipendenze PHP.
  • Tesseract: dovrai installare Tesseract OCR sul tuo sistema.

Installazione di Composer

Se non hai già installato Composer, puoi farlo seguendo questi passaggi:

Su Windows:

  • scarica il programma di installazione di Composer da getcomposer.org.
  • Segui le istruzioni per completare l'installazione.

Su Linux o Mac apri il terminale e esegui i seguenti comandi:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21cc3a01d5d67f2d7c22a8431b928c9be486f42c02db8d46f32e80fcd241d62da68253f736d3b7e2c91c45f25f5a8a9f') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Creazione del progetto

Crea una cartella per il tuo progetto, ad esempio SCANNER, e naviga al suo interno:

mkdir SCANNER
cd SCANNER

Configurazione di Composer

Crea un file composer.json nella cartella del tuo progetto con il seguente contenuto:

{
    "name": "nyash/come-and-go",
    "autoload": {
        "psr-4": {
            "Nyash\\ComeAndGo\\": "src/"
        }
    },
    "authors": [
        {
            "name": "lucio",
            "email": "tuaemail@email.com"
        }
    ],
    "require": {
        "thiagoalessio/tesseract_ocr": "^2.13",
        "intervention/image": "^3.8"
    },
    "require-dev": {
        "symfony/var-dumper": "^7.1"
    }
}

Quindi, esegui il seguente comando per installare le dipendenze:

composer install

Struttura del progetto

Crea la seguente struttura di cartelle all'interno della tua cartella di progetto SCANNER:

SCANNER
│
├── functions
│   └── scanner.php
├── uploads
├── index.php
└── composer.json

Il file PHP index.php

Crea un file chiamato index.php e aggiungi il seguente codice:

<?php require __DIR__ . '/functions/scanner.php'; ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document Reader</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.1/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <div class="row mt-5">
            <div class="col-sm-8 mx-auto">
                <div class="jumbotron">
                    <h1 class="display-4">Scanner</h1>
                    <p class="lead">
                        <?php if ($_POST) : ?>
                    <div class="card mt-4">
                        <div class="card-header bg-primary text-white">
                            <h4>Risultato dell'OCR</h4>
                        </div>
                        <div class="card-body bg-light p-4 rounded">
                            <p class="text-dark text-center" style="white-space: pre-wrap; word-wrap: break-word;">
                                <?php echo htmlspecialchars($fileRead ?? '', ENT_QUOTES, 'UTF-8'); ?>
                            </p>
                        </div>
                    </div>
                <?php endif; ?>
                    </p>
                    <hr class="my-4">
                </div>
            </div>
        </div>
        <div class="row col-sm-8 mx-auto">
            <div class="card mt-5">
                <div class="card-body">
                    <form action="" method="post" enctype="multipart/form-data">
                        <div class="form-group">
                            <label for="filechoose">Choose File</label>
                            <input type="file" name="file" class="form-control-file" id="filechoose">
                            <button class="btn btn-success mt-3" type="submit" name="submit">Upload</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
    <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
</body>
</html>

Spiegazione del codice

  • inclusione del file scanner.php: all'inizio utilizziamo require per includere il file scanner.php, dove gestiremo l'elaborazione dell'immagine.
  • Struttura HTML: abbiamo una semplice interfaccia utente costruita con Bootstrap. Include un titolo, un modulo per caricare file e una sezione per mostrare i risultati dell'OCR.
  • Visualizzazione dei risultati: se il modulo viene inviato (controllato con $_POST) quando disponibile verrà visualizzato il risultato dell'OCR,. Utilizziamo htmlspecialchars per evitare problemi di sicurezza legati a XSS.

Creazione del file PHP scanner.php

Ora creiamo un file chiamato scanner.php all'interno della cartella functions. Questo file conterrà la logica per gestire il caricamento dell'immagine, l'elaborazione con Tesseract e la visualizzazione del testo estratto:

<?php
use thiagoalessio\TesseractOCR\TesseractOCR;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
require __DIR__ . '../vendor/autoload.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['submit'])) {
        $file_name = $_FILES['file']['name'];
        $tmp_file = $_FILES['file']['tmp_name'];
        // Inizio della sessione se non esiste già
        if (!session_id()) {
            session_start();
        }
        // Creazione di un nome file unico
        $unique_file_name = uniqid() . '_' . time() . '_' . str_replace(
            array('!', '@', '#', '$', '%', '^', '&', ' ', '*', '(', ')', ':', ';', ',', '?', '/' . '\\', '~', '`', '-'),
            '_',
            strtolower($file_name)
        );
        // Percorso completo del file caricato
        $image_path = 'uploads/' . $unique_file_name;
        // Sposta il file caricato nella directory "uploads"
        if (move_uploaded_file($tmp_file, $image_path)) {
            $manager = new ImageManager(new Driver());
            // Apri l'immagine caricata
            $image = $manager->read($image_path);
            // Converti l'immagine in PNG e applica le trasformazioni
            $image->toPng()->save($image_path);
            $image->greyscale()->save($image_path);
            $image->contrast(15); // Aumenta il contrasto
            $image->sharpen(10);  // Aumenta la nitidezza
            $image->save($image_path);
            // Controlla se il file esiste dopo il salvataggio
            if (file_exists($image_path)) {
                try {
                    // Esegui Tesseract OCR
                    $fileRead = (new TesseractOCR($image_path))
                        ->executable('C:\\Program Files\\Tesseract-OCR\\tesseract.exe') // Percorso completo di Tesseract
                        ->lang('eng') // Imposta la lingua
                        ->allowlist(range('A', 'Z'), range(0, 9)) // Limita i caratteri consentiti
                        ->run();
                } catch (Exception $e) {
                    echo "<div class='alert alert-danger'>Errore nell'elaborazione OCR: " . htmlspecialchars($e->getMessage()) . "</div>";
                }
            } else {
                echo "<p class='alert alert-danger'>Errore: Il file non esiste dopo il caricamento: " . $image_path . "</p>";
            }
        } else {
            echo "<p class='alert alert-danger'>Errore nel caricamento del file.</p>";
        }
    }
}

Il codice del file

  • inclusione delle dipendenze: utilizziamo require per caricare le librerie Tesseract e Intervention Image tramite Composer.
  • Controllo del metodo di richiesta: verifichiamo che il metodo di richiesta sia POST e che il modulo sia stato inviato.

Gestione del file caricato:

  • creiamo un nome file univoco per evitare conflitti.
  • Spostiamo l'immagine caricata nella cartella degli upload.

Elaborazione dell'Immagine:

  • utilizziamo ImageManager per aprire l'immagine.
  • Applichiamo vari filtri (conversione in PNG, scala di grigi, contrasto e nitidezza).

Esecuzione di Tesseract:

  • verifichiamo che il file esista e quindi eseguiamo Tesseract per estrarre il testo.
  • Gestiamo eventuali eccezioni per informare l'utente di errori durante l'elaborazione.

Struttura della cartella

Assicurati che la tua struttura delle cartelle sia simile a questa:

SCANNER/
│
├── functions/
│   └── scanner.php
│
├── uploads/
│   └── (immagini caricate qui)
│
├── index.php
│
└── composer.json

Test dell'applicazione PHP

Per testare l'applicazione, assicurati che il server web stia eseguendo PHP e che il percorso di Tesseract sia corretto. Puoi utilizzare anche dei server locali come XAMPP o MAMP. Apri il tuo browser e accedi a http://localhost/SCANNER/index.php.

Carica un'immagine contenente del testo e il sistema utilizzerà Tesseract per estrarlo e visualizzarlo nella pagina.

Conclusione

Hai ora configurato con successo un'applicazione che sfrutta Tesseract OCR per estrarre testo dalle immagini. Questo progetto rappresenta un'opportunità per approfondire le tue competenze in PHP e per familiarizzare con l'elaborazione delle immagini e le tecnologie OCR.

L'applicazione che abbiamo creato ti permette non solo di caricare immagini e ottenere il testo in esse contenuto. Offre anche una base su cui costruire funzionalità più avanzate. Potresti considerare di implementare il supporto per altre lingue, miglioramenti nella pre-elaborazione delle immagini e un'interfaccia utente più interattiva. Inoltre, l'aggiunta di un'opzione per esportare i risultati in vari formati potrebbe rendere il progetto ancora più versatile.

L'esperienza acquisita lavorando con Tesseract e le librerie di manipolazione delle immagini consentirà di affrontare progetti più complessi in futuro, ampliando le tue capacità nella programmazione web. In sintesi, questo progetto non è solo un esempio pratico di come utilizzare PHP e Tesseract insieme, ma è anche una piattaforma per esplorare nuove idee e migliorare continuamente le tue abilità.

Ti incoraggio a continuare a sperimentare, espandere e perfezionare l'applicazione, condividendo le tue scoperte. Con la crescente importanza dell'OCR in vari settori, le competenze in questo campo possono aprire nuove opportunità professionali e creative.

Ti consigliamo anche