Vai al contenuto principale
Durante l’elaborazione di un documento, ABBYY FineReader Engine ne analizza innanzitutto il layout e rileva determinate aree nelle pagine del documento. Queste aree sono chiamate “blocchi”. I blocchi determinano come e in quale ordine devono essere riconosciute le aree dell’immagine. In ABBYY FineReader Engine, l’oggetto Layout funge da contenitore per i blocchi e il testo riconosciuto. Gli scenari di base di elaborazione dei documenti utilizzano il layout all’interno dell’oggetto FRDocument, che rappresenta il documento in corso di elaborazione. Per accedere al layout di una pagina del documento, utilizzare la proprietà IFRPage::Layout. Se gli utenti di FRE per Windows o Linux utilizzano l’oggetto Engine caricato come server out-of-process, è possibile velocizzare l’iterazione dell’oggetto Layout con lo schema seguente: Per Windows:
  1. Utilizzare l’oggetto OutprocLoader per elaborare un documento e ottenere un layout per ogni pagina. Scrivere il layout ottenuto in un flusso di dati tramite il metodo SaveToStream.
  2. Utilizzare l’oggetto InprocLoader per ripristinare una copia del layout originale con il metodo CreateLayoutFromStream. Utilizzare questa copia per la successiva iterazione del contenuto del layout.
Per Linux:
  1. Utilizzare l’oggetto Engine caricato come server out-of-process per elaborare un documento e ottenere un layout per ogni pagina. Scrivere il layout ottenuto come array di byte tramite il metodo SaveToArray.
  2. Utilizzare l’oggetto Engine caricato in modo nativo (ossia caricato nel processo corrente dalla libreria libFREngine.so) per leggere l’array di byte ottenuto con la propria implementazione dell’interfaccia IReadStream.
  3. Utilizzare l’oggetto Engine caricato in modo nativo per ripristinare una copia del layout originale con il metodo CreateLayoutFromStream. Utilizzare questa copia per la successiva iterazione del contenuto del layout.
I blocchi ottenuti dal layout di una FRPage diventano non validi dopo una chiamata a uno qualsiasi dei metodi che eseguono l’analisi del layout (come Analyze o Process) per questa pagina o per il documento a cui appartiene. Dopo l’analisi, individuare i blocchi necessari nel nuovo layout e continuare a lavorare con i nuovi oggetti Block.

Blocchi di Layout

L’oggetto Layout fornisce l’accesso alla struttura del layout tramite le proprietà Blocks e BlackSeparators. Entrambe queste proprietà consentono di accedere ai sotto-oggetti LayoutBlocks, che rappresentano raccolte di blocchi. La prima si riferisce all’insieme principale dei blocchi di layout, che contiene testi, tabelle, immagini, Barcode e segni di spunta. La seconda si riferisce alla raccolta di blocchi dei separatori. I separatori sono linee nere rilevate durante l’analisi del layout della pagina. Vengono utilizzati per ricostruire il layout della pagina in modo più preciso durante la sintesi e l’esportazione. Inoltre, è possibile ottenere i blocchi in ordine logico tramite la proprietà SortedBlocks dell’oggetto Layout. Ogni blocco ha una propria regione, composta da diversi rettangoli. Una regione è rappresentata dall’oggetto Region. A seconda del tipo di dati contenuti nel blocco, i blocchi possono essere di tipi diversi, ciascuno con proprietà specifiche. Queste proprietà sono accessibili tramite i corrispondenti oggetti del tipo di blocco, che possono essere ottenuti usando i metodi dell’oggetto Block. Le corrispondenti interfacce dei tipi di blocco derivano dall’interfaccia IBlock e ne ereditano tutte le proprietà. Sono disponibili i seguenti tipi di blocco:
Questo tipo di blocco corrisponde a una zona dell’immagine riconosciuta come testo formattato. È possibile accedere alle proprietà di questo blocco tramite l’oggetto TextBlock. Questo oggetto fornisce anche l’accesso al testo riconosciuto nella parte dell’immagine racchiusa dal blocco.
Questo tipo di blocco corrisponde a una tabella. I blocchi di questo tipo possono essere solo rettangolari, poiché la regione contiene un solo rettangolo. Alle proprietà di questo tipo di blocco si accede tramite l’oggetto TableBlock. La struttura della tabella è descritta da due raccolte di separatori di tabella, orizzontali e verticali (gli oggetti TableSeparators), e da una raccolta di celle della tabella (l’oggetto TableCells). Ogni cella della tabella viene trattata come un blocco di un determinato tipo. Il testo riconosciuto è una proprietà della singola cella, non dell’intera tabella. Se una cella è un’immagine, l’immagine contenuta nei limiti della cella non viene riconosciuta e viene visualizzata come immagine nel testo riconosciuto. I separatori di tabella possono essere di tipi diversi. Il tipo di separatore viene definito per un segmento di separatore compreso tra le intersezioni più vicine con altri separatori. I separatori possono essere dei seguenti tipi:
  • Assente. Questo tipo viene assegnato ai separatori di tabella che “dovrebbero passare” attraverso celle unite.
  • Sconosciuto. Questo tipo viene assegnato per impostazione predefinita a ogni nuovo separatore di tabella aggiunto.
  • Invisibile. Questo tipo viene assegnato a un separatore di tabella “immaginario” creato come risultato dell’analisi della struttura della tabella in un punto in cui la tabella di origine non ne aveva uno, ma in cui logicamente dovrebbe esserci.
  • Esplicito. I separatori di tabella di questo tipo compaiono dove si trovano le linee nere della tabella di origine.
  • Multiplo. Questo tipo di separatore può comparire come risultato della modifica della tabella. Table
Questo tipo di blocco rappresenta una zona dell’immagine trattata come immagine raster. La parte dell’immagine racchiusa da questo blocco non viene riconosciuta e il blocco viene esportato “così com’è”. Le proprietà di questo tipo di blocco sono rappresentate dall’oggetto RasterPictureBlock.
Questo tipo di blocco rappresenta una zona dell’immagine trattata come immagine vettoriale. I blocchi di questo tipo possono comparire nel layout solo se una pagina è stata analizzata con la proprietà IPageAnalysisParams::DetectVectorGraphics impostata su TRUE. Di solito, le immagini di sfondo vengono riconosciute come blocchi di questo tipo. Le proprietà di questo tipo di blocco sono rappresentate dall’oggetto VectorPictureBlock.
Una parte dell’immagine racchiusa in un blocco di questo tipo viene trattata come un barcode. ABBYY FineReader Engine riconosce barcode di diversi tipi e può anche rilevarne automaticamente il tipo. Le informazioni lette da un barcode riconosciuto sono accessibili tramite le proprietà specifiche del blocco barcode rappresentate dall’oggetto BarcodeBlock.
Una parte dell’immagine racchiusa in un blocco di questo tipo viene trattata come un segno di spunta. Corrisponde a un’area dell’immagine riconosciuta come segno di spunta. Le informazioni lette da un segno di spunta riconosciuto sono accessibili tramite le proprietà specifiche del blocco segno di spunta rappresentate dall’oggetto CheckmarkBlock.
Una parte dell’immagine racchiusa in un blocco di questo tipo viene trattata come un gruppo di segni di spunta. Corrisponde a un’area dell’immagine riconosciuta come gruppo di segni di spunta. Le informazioni lette da un gruppo di segni di spunta riconosciuto sono accessibili tramite le proprietà specifiche del blocco gruppo di segni di spunta rappresentate dall’oggetto CheckmarkGroup.
Una parte dell’immagine racchiusa in un blocco di questo tipo viene trattata come un separatore. I separatori sono linee rilevate durante l’analisi del layout della pagina. Possono essere parti di una tabella, linee che separano diversi elementi di testo e così via. Le coordinate e il tipo di un separatore sono accessibili tramite l’oggetto SeparatorBlock.
Una parte dell’immagine racchiusa in un blocco di questo tipo viene trattata come un gruppo di separatori. Corrisponde a una zona dell’immagine riconosciuta come gruppo di separatori. Un gruppo di separatori include solitamente quattro separatori che formano un rettangolo. Ad esempio, le quattro linee del bordo di una tabella vengono riconosciute come un gruppo di separatori. Ogni gruppo di separatori contiene una raccolta di blocchi separatore. Le proprietà specifiche di un blocco gruppo di separatori sono rappresentate dall’oggetto SeparatorGroup.
Esistono anche i blocchi di autoanalisi, utilizzati solo nei Visual Components (parte di FRE per Windows). Non possono essere creati né riconosciuti tramite FineReader Engine API. Sono disponibili solo tramite la proprietà ILayout::VisualBlocks.

Aggiunta manuale dei blocchi

I blocchi vengono individuati automaticamente su una pagina durante l’analisi del layout. Tuttavia, può essere necessario disegnare i blocchi manualmente. In questo caso:
  1. Aprire l’oggetto FRPage e ottenere il layout della pagina tramite la proprietà Layout.
  2. Creare un oggetto Region per il blocco usando il metodo IEngine::CreateRegion e aggiungervi i rettangoli usando il metodo IRegion::AddRect.
  3. Creare un blocco del tipo richiesto e aggiungerlo alla raccolta dei blocchi del layout usando il metodo AddNew dell’oggetto LayoutBlocks.
  4. Impostare i parametri richiesti del blocco (usare l’oggetto delle proprietà del blocco corrispondente al tipo di blocco).

Modificare il tipo di blocco

Il tipo di blocco viene definito al momento della creazione e non può essere modificato. Se devi cambiare il tipo di blocco, dovrai eliminare il blocco e crearne un altro del tipo necessario esattamente nella stessa posizione:
  1. Crea un oggetto Region usando il metodo IEngine::CreateRegion e copia la regione del blocco che devi sostituire con il metodo IRegion::CopyFrom.
  2. Elimina il vecchio blocco dal Layout chiamando il metodo ILayoutBlocks::DeleteAt.
  3. Crea un nuovo blocco del tipo richiesto e aggiungilo alla raccolta di blocchi del Layout usando il metodo AddNew dell’oggetto LayoutBlocks. Passa la Region copiata dal vecchio blocco come uno dei parametri richiesti.

Vedi anche

Riconoscere i segni di spunta Lavorare con il testo