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 utilizziamorequire
per includere il filescanner.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,. Utilizziamohtmlspecialchars
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.