Come estrarre il testo da un PDF? [chiuso]


152

Qualcuno può raccomandare una libreria / API per estrarre il testo e le immagini da un PDF? Dobbiamo essere in grado di ottenere il testo contenuto nelle aree note del documento, quindi l'API dovrà fornirci informazioni sulla posizione di ciascun elemento della pagina.

Vorremmo che i dati fossero stampati xmlo jsonformattati. Stiamo attualmente esaminando PdfTextStream che sembra piuttosto buono, ma vorrei ascoltare le esperienze e i suggerimenti di altre persone.

Esistono alternative (commerciali o gratuite) per l'estrazione programmatica di un testo da un pdf?



1
Per coloro che necessitano di qualcosa di veramente semplice (senza informazioni di posizione), questo perl regex può essere sufficiente: /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Cerca solo l'operatore Tj / TJ, che indica tutto il testo normale in un PDF.
Alex R

1
usa la libreria TomRoush PdfBox che funziona bene su Android
FaisalAhmed

Risposte:


113

Mi è stato dato un file pdf di 400 pagine con una tabella di dati che dovevo importare - fortunatamente nessuna immagine. Ghostscript ha funzionato per me:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

Il file di output è stato suddiviso in pagine con intestazioni, ecc., Ma è stato quindi semplice scrivere un'app per eliminare le righe vuote, ecc. E aspirare tutti i 30.000 record. -dSIMPLEe -dCOMPLEXnon ha fatto alcuna differenza in questo caso.


37
Su Linux e Cygwin il comando è gsinvece di gswin64c. Funziona perfettamente. Nessuna merda pagata brevettata. Funziona e basta.
Jannes,

4
Sì, funziona benissimo! Ora posso usare "grep" con impunità sui miei file pdf. Dal momento che posso grep meglio di quanto possa leggere, è una vittoria! (:-) Voto positivo.
David Elson,

1
L'unico problema che ho avuto con questo era usarlo su pdf con caratteri "vecchi" incorporati. Funziona perfettamente con i pdf generati localmente, ma più difficile con fonti oscure. Altrimenti, uno scriptlet eccellente.
Jon M,

ciò che -sDEVICE=txtwritefare? Non capisco molto dopo aver letto Come usare Ghostscript | Selezione di un dispositivo di output
Ooker

Per l'output stdout invece di salvarlo come file di testo, utilizzare gswin64c -sDEVICE=txtwrite -o- input.pdf. Fonte (leggermente modificata da me): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH

33

Da oggi lo so: la cosa migliore per l'estrazione del testo dai PDF è TET, il toolkit di estrazione del testo . TET fa parte della famiglia di prodotti PDFlib.com.

PDFlib.com è la società di Thomas Merz. Nel caso in cui non riconoscessi il suo nome: Thomas Merz è l'autore della "Bibbia PostScript e PDF".

La prima incarnazione di TET è una biblioteca . Probabilmente uno può fare tutto ciò che Budda006 desidera, comprese le informazioni di posizione su ogni elemento della pagina. Oh, e può anche estrarre immagini. Ricombina immagini frammentate.

pdflib.com offre anche un'altra incarnazione di questa tecnologia, il plug-in TET per Acrobat . E la terza incarnazione è il PDFlib TET iFilter . Questo è uno strumento autonomo per i desktop degli utenti. Entrambi sono gratuiti (come nella birra) da utilizzare per scopi privati ​​e non commerciali.

Ed è davvero potente. Molto meglio dell'estrazione del testo di Adobe. Ha estratto il testo per me in cui altri strumenti (incluso Adobe) sputano solo immondizia.

Ho appena testato lo strumento autonomo desktop e ciò che dicono sulla loro pagina web è vero. Ha una riga di comando molto buona. Alcuni dei miei "problematici" file di test PDF lo strumento gestito con mia piena soddisfazione.

Questa cosa sarà d'ora in poi la mia raccomandazione per ogni esigenza sofisticata e impegnativa di estrazione del testo PDF.

TET è semplicemente fantastico. Rileva le tabelle. All'interno delle tabelle, identifica le celle che si estendono su più colonne. Identifica le righe e i contenuti di ciascuna cella di tabella separatamente. Si occupa molto bene delle sillabazioni: rimuove i trattini e ripristina le parole complete. Supporta lingue non ASCII (inclusi CJK, arabo ed ebraico). Quando incontra legature, ripristina i personaggi originali ...

Provaci.


32
Non esiste una versione di prova e $ 440 è un po 'troppo per "Provalo".
Rok Strniša,


Questo servizio è disponibile tramite un'API?
Bart

1
l'ho provato, non riconosce le colonne. Ho scannerizzato una prima pagina di tabloid inglese. Il testo è stato diviso in 3 colonne sul foglio, ma questo plugin ha mescolato del tutto le frasi facendole sembrare traballante. Ghostscript che era gratuito aveva esattamente lo stesso output.
NoWhereToBeSeen

1
@RedHotScalability: Anche BTW, il TET fa riconoscere colonne se utilizzato con i parametri corretti. Ma lascio come esercizio all'ambizioso programmatore JS di leggere la documentazione e scoprire come ...
Kurt Pfeifle

29

Un efficiente strumento da riga di comando, open source, gratuito, disponibile su Linux e Windows: semplicemente chiamato pdftotext. Questo strumento fa parte della libreria xpdf.

http://en.wikipedia.org/wiki/Pdftotext


4
Su un sidenote: usa l' -layoutinterruttore per conservare le tabelle, funziona abbastanza bene.
sebastian,


12

Ecco il mio suggerimento. Se desideri estrarre testo da PDF, puoi importare il file pdf in Google Documenti, quindi esportarlo in un formato più intuitivo come .html, .odf, .rtf, .txt, ecc. Tutto questo utilizzando l'API di Drive . È gratuito * e robusto. Date un'occhiata al:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

Poiché è un'API di riposo, è compatibile con TUTTI i linguaggi di programmazione. I link che ho postato sopra hanno esempi funzionanti per molte lingue tra cui: Java, .NET, Python, PHP, Ruby e altri.

Spero possa essere d'aiuto.


2
Ho usato questa opzione e non la consiglierei. L'estrazione del testo pdf di Google non è buona come molte alternative (specialmente per il non inglese) ed è anche molto sloooow.
Björn Lindqvist,

10

PdfTextStream (che hai detto di aver guardato) è ora gratuito per le applicazioni a thread singolo. A mio avviso, la sua qualità è molto migliore rispetto ad altre librerie (specialmente per cose come font funky incorporati, ecc.).

In alternativa, dovresti dare un'occhiata ad Apache PDFBox , open source.


PdfTextStream non è supportato in Android. Esistono delle buone librerie come questa disponibili per Android?
FaisalAhmed

@FaisalAhmed per quanto riguarda PDFBox?
Renaud

Sì, anche PdfBox non è supportato in Android .... sia PdfTextStream che PdfBox utilizzano una parte awt che non è supportata in Android
FaisalAhmed

sto usando questa libreria che funziona bene su Android github.com/TomRoush/PdfBox-Android
FaisalAhmed


6

Uno dei commenti qui ha usato gs su Windows. Ho avuto un certo successo anche su Linux / OSX, con la seguente sintassi:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

Ho usato dSIMPLEinvece dCOMPLEXperché quest'ultimo emette 1 carattere per riga.


5

Poiché la domanda riguarda in particolare strumenti alternativi per ottenere dati da PDF come XML, quindi potresti essere interessato a dare un'occhiata allo strumento commerciale "ByteScout PDF Extractor SDK" che è in grado di fare esattamente questo: estrarre testo da PDF come XML insieme a i dati di posizionamento (x, y) e le informazioni sul font:

Testo nel PDF di origine:

Products | Units | Price 

XML di output:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

PS: inoltre spezza anche il testo in una struttura basata su tabella.

Divulgazione: lavoro per ByteScout


3

La cosa migliore a cui riesco attualmente a pensare (all'interno dell'elenco di "semplici" strumenti) è Ghostscript (la versione corrente è v.8.71) e il programma di utilità PostScript ps2ascii.ps. Ghostscript lo spedisce nella sua libsottodirectory. Prova questo (su Windows):

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

Questo comando elabora le pagine 3-7 di input.pdf. Leggi i commenti nel ps2ascii.psfile stesso per vedere cosa significano i numeri "strani" e le informazioni aggiuntive ( indicano stringhe, posizioni, larghezze, colori, immagini, rettangoli, caratteri e interruzioni di pagina ... ). Per ottenere un output di testo "semplice", sostituire la -dCOMPLEXparte con -dSIMPLE.


2
Come indovineresti, questo emette solo test ASCII. Sebbene sia gratuito, non è un'ottima opzione per i software che prevedi con lingue diverse dall'inglese.
userx

3
@userx: Come puoi immaginare, questo è software libero: quindi codice sorgente disponibile. Possibile estendere per il supporto di non-ASCII ...
Kurt Pfeifle

@userx: oggi ho scoperto 'TET', il Text Extraction Toolkit da pdflib.com. Vedi la mia altra risposta.
Kurt Pfeifle,

ps2ascii di Ghostscript 9.07 ha funzionato magnificamente sul mio sistema OpenBSD. Ho appena convertito un PDF di 526 pagine in testo normale. Ora posso facilmente grep ed estrarre il testo per le note. Ho usato il comando semplice ps2ascii book.pdf notes.txt. Se il tuo documento è prevalentemente ASCII, sei fortunato.
Clint Pachl,

3

So che questo argomento è piuttosto vecchio, ma questa esigenza è ancora viva. Ho letto molti documenti, forum e script e ne ho costruito uno avanzato che supporta pdf compressi e non compressi:

https://gist.github.com/smalot/6183152

In alcuni casi, la riga di comando è vietata per motivi di sicurezza. Quindi una classe PHP nativa può soddisfare molte esigenze.

Spero che aiuti tutti





0

Sui miei sistemi Macintosh, trovo che "Adobe Reader" faccia un buon lavoro. Ho creato un alias sul mio desktop che punta a "Adobe Reader.app" e tutto ciò che faccio è rilasciare un file pdf sull'alias, che lo rende il documento attivo in Adobe Reader e quindi dal menu File, Ho scelto "Salva come testo ...", gli ho dato un nome e dove salvarlo, faccio clic su "Salva" e ho finito.


5
L'OP ha cercato una soluzione per l' estrazione di testo da un pdf a livello di codice . La tua risposta propone invece una routine manuale.
mkl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.