come funziona l'estrazione del testo dai pdf
Come funziona l'estrazione del testo da un PDF
In un PDF non ci sono parole. Ci sono glifi numerati a certe coordinate. Tutto ciò che un estrattore restituisce è una ricostruzione ragionata, ed è per questo che a volte è straordinariamente buona e a volte è incomprensibile.
01
Passo uno: trovare le istruzioni di disegno
L'estrattore decomprime il flusso di contenuto di ogni pagina e lo percorre cercando gli operatori di testo. Il testo vive tra `BT` ed `ET` — begin text, end text — e dentro quel blocco una manciata di operatori fa tutto il lavoro. `Tf` sceglie un font e un corpo. `Tm` e `Td` impostano la posizione. `Tj` e `TJ` disegnano una stringa.
Quindi la materia prima è un elenco così: a (72, 720), nel font F1 a 12 pt, disegna questi byte. Ripeti qualche migliaio di volte. È davvero tutto ciò che il file contiene.
02
Passo due: trasformare i codici di glifo in caratteri — la parte difficile
I byte dentro un `Tj` non sono Unicode. Sono indici nella tabella interna dei glifi di un font. Il byte 0x44 significa «disegna il glifo 68 di questo font», e il glifo 68 è la lettera D soltanto se il font lo dice.
Ci sono due modi per scoprirlo. I font semplici portano una codifica — spesso una standard come WinAnsi, a volte un vettore Differences su misura che rimappa singole caselle. I font compositi, cioè quasi tutti quelli incorporati moderni, hanno bisogno di una CMap `ToUnicode`: una tabella esplicita nel file che associa ogni codice di glifo a un carattere Unicode.
Quando quella CMap c'è ed è corretta, l'estrazione è esatta. Quando manca, l'estrattore tira a indovinare — di solito ripiegando sui nomi dei glifi nel font e, in mancanza di quelli, sui codici grezzi. È l'origine del testo estratto che esce come un fiume di consonanti accentate o di caratteri cinesi da un documento palesemente italiano. Non c'è niente di rotto; il file semplicemente non ha mai detto cosa significassero i suoi glifi.
I font in sottoinsieme peggiorano la cosa. Per risparmiare spazio, uno scrittore incorpora solo i glifi usati e li rinumera, quindi la corrispondenza è del tutto arbitraria e dipende interamente dalla CMap che lo scrittore può essersi preso o no la briga di includere.
- CMap ToUnicode presente
- Estrazione esatta. Il file dichiara cosa significa ciascun glifo.
- Codifica standard, nessuna CMap
- Di solito corretta per testo latino semplice. Accenti e simboli cominciano a scivolare.
- Font in sottoinsieme, nessuna CMap
- Mojibake. La numerazione dei glifi è arbitraria e niente nel file la decodifica.
- Testo convertito in tracciati
- Nessun testo affatto — le lettere sono forme vettoriali. Solo l'OCR può leggerlo, esattamente come per una scansione.
03
Passo tre: inventare gli spazi
Questo sorprende. Un PDF non è tenuto a conservare gli spazi. Due parole sono spesso disegnate come due stringhe separate con un salto di posizione in mezzo, oppure come un unico vettore `TJ` con un numero negativo nel mezzo — `[(Ci) -20 (ao)] TJ` — dove il numero è una correzione di crenatura in millesimi di em.
Quindi l'estrattore misura. Conosce dal font la larghezza di avanzamento di ogni glifo, quindi sa dove un carattere *avrebbe dovuto* finire. Se il carattere successivo comincia sensibilmente più a destra di lì, inserisce uno spazio. Se il divario è piccolo, non lo fa.
La soglia è un'euristica, ed è il motivo per cui il testo estratto a volte arriva come `q u e s t o è s p a z i a t o` o, all'opposto, come `paroleattaccate`. Il testo giustificato è il colpevole abituale: allargare una riga per riempire il margine dilata gli spazi veri finché la crenatura interna alla parola comincia a somigliare a uno di essi.
04
Passo quattro: ricostruire righe, colonne e ordine di lettura
Ora l'estrattore ha caratteri con coordinate e nessuna nozione di riga. Raggruppa per posizione verticale — i glifi che condividono una linea di base, entro una tolleranza, sono una riga — poi ordina ogni riga da sinistra a destra, poi ordina le righe dall'alto in basso.
Funziona per una colonna sola. Fallisce malamente con due, perché l'ordine del flusso di contenuto è l'ordine di disegno, e l'ordine per coordinata scendendo lungo la pagina attraversa dritto il corridoio bianco. Riga uno della colonna uno, poi riga uno della colonna due, poi riga due della colonna uno. Il risultato sono parole leggibili in un ordine illeggibile.
Gli estrattori migliori fanno prima l'analisi dell'impaginato: trovano i corridoi di spazio bianco, dividono la pagina in blocchi-colonna ed estraggono ogni blocco per intero prima di passare oltre. Le tabelle ricevono lo stesso trattamento una dimensione più su — le celle vengono raggruppate in righe e colonne per allineamento, perché niente nel file dice «tabella». Un bordo tracciato sono quattro linee disegnate sulla pagina, e per l'estrattore non significa nulla.
È anche qui che avviene la ricostruzione dei paragrafi, e dove la sillabazione va disfatta. Una parola spezzata su un'andata a capo sono due sequenze di glifi e un trattino; riunirle richiede una regola su quando un trattino finale è un'andata a capo e quando fa parte di una parola composta.
05
Le modalità di fallimento, e cosa significa ciascuna
Perché ora puoi risalire dal sintomo alla causa:
- Non esce niente
- Non c'è alcuno strato di testo. La pagina è un'immagine, oppure il testo è stato convertito in tracciati. Passa l'OCR.
- Caratteri illeggibili
- Una CMap ToUnicode mancante o sbagliata. I glifi si sono disegnati bene; niente li decodifica.
- Testo nell'ordine sbagliato
- Impaginato a più colonne, o un ordine di disegno che non coincide con l'ordine di lettura.
- Spazi mancanti o di troppo
- L'euristica del divario. Frequente nel testo giustificato e nei titoli con spaziatura larga.
- «fi» e «fl» nell'uscita
- Legature. Due lettere disegnate come un solo glifo, e la CMap l'ha associato al carattere di legatura singolo anziché alla coppia.
06
Perché è lo stesso problema di PDF verso Word
Convertire in Word è estrazione del testo più uno strato di deduzione in più. Ricostruiti caratteri, spazi, righe e colonne, il convertitore deve indovinare la semantica: questa sequenza è a 18 punti in grassetto e sta da sola sopra un paragrafo, quindi è probabilmente un titolo; queste righe cominciano tutte allo stesso rientro con un glifo di punto elenco, quindi questo è probabilmente un elenco.
Ognuna di quelle è un'ipotesi tratta da indizi visivi, perché il file registra l'aspetto e nient'altro. Ecco perché la qualità della conversione varia tanto con la sorgente. Un PDF esportato da Word, che magari porta ancora la marcatura, si converte bene. Un PDF prodotto da un motore di impaginazione non porta alcuna struttura, e il convertitore lo sta leggendo esattamente come lo leggeresti tu da un foglio stampato.