2015-09-02 51 views
6

Sto riscontrando qualche problema con Apache TIKA (versione 1.10). Ho dei file PDF che sono solo dei pezzi di carta scansionati. Ciò significa che ogni pagina è solo un'immagine. Il mio obiettivo è comunque estrarre il testo dei file PDF.Apache Tika estrae i file PDF scansionati

Il mio tesseract è impostato correttamente e l'estrazione di file JPG e PNG funziona come un incantesimo. Il codice sto usando sembra così (non mente la gestione excetion mancante):

public String extractText(InputStream stream) { 
    AutoDetectParser parser = new AutoDetectParser(); 
    BodyContentHandler handler = new BodyContentHandler(Integer.MAX_VALUE); 
    Metadata metadata = new Metadata(); 
    ParseContext context = new ParseContext(); 
    parser.parse(stream, handler, metadata, context); 
    String text = handler.toString(); 
    return text; 
} 

ho cercato molto, ma non ho trovato alcuna soluzione che lavorano per me. Ho già provato il metodo setExtractInlineImages della classe PDFParserConfig ma questo non ha cambiato nulla. Estrarre i documenti incorporati utilizzando un codice personalizzato ParsingEmbeddedDocumentExtractor ha estratto le risorse incorporate di un file doc ma non per i miei file PDF.

Sarebbe fantastico se qualcuno di voi potrebbe fornire qualche aiuto :)

+0

Ha fatto si allega un 'PDFParserConfig' al contesto con quel set di opzioni? – Gagravarr

+0

Sì, l'ho fatto. Ma questo non ha avuto alcun effetto:/ – LorisBachert

+0

Puoi pubblicare il codice che hai usato per farlo, quindi possiamo verificare se è corretto? – Gagravarr

risposta

11

Tim Allison ha portato la soluzione:

Parser parser = new AutoDetectParser(); 
BodyContentHandler handler = new BodyContentHandler(Integer.MAX_VALUE); 

TesseractOCRConfig config = new TesseractOCRConfig(); 
PDFParserConfig pdfConfig = new PDFParserConfig(); 
pdfConfig.setExtractInlineImages(true); 

ParseContext parseContext = new ParseContext(); 
parseContext.set(TesseractOCRConfig.class, config); 
parseContext.set(PDFParserConfig.class, pdfConfig); 
parseContext.set(Parser.class, parser); //need to add this to make sure recursive parsing happens! 

parser.parse(stream, handler, new Metadata(), parseContext); 

questo funziona per me :)

EDIT: Ecco la soluzione completa:

import org.apache.tika.exception.TikaException; 
import org.apache.tika.metadata.Metadata; 
import org.apache.tika.parser.AutoDetectParser; 
import org.apache.tika.parser.ParseContext; 
import org.apache.tika.parser.Parser; 
import org.apache.tika.parser.ocr.TesseractOCRConfig; 
import org.apache.tika.parser.pdf.PDFParserConfig; 
import org.apache.tika.sax.BodyContentHandler; 
import org.xml.sax.SAXException; 

import java.io.FileInputStream; 
import java.io.IOException; 

/** 
* @since 8/26/16 
*/ 
public class Sample { 
    public static void main(String[] args) 
      throws IOException, TikaException, SAXException { 
     Parser parser = new AutoDetectParser(); 
     BodyContentHandler handler = new BodyContentHandler(Integer.MAX_VALUE); 

     TesseractOCRConfig config = new TesseractOCRConfig(); 
     PDFParserConfig pdfConfig = new PDFParserConfig(); 
     pdfConfig.setExtractInlineImages(true); 

     ParseContext parseContext = new ParseContext(); 
     parseContext.set(TesseractOCRConfig.class, config); 
     parseContext.set(PDFParserConfig.class, pdfConfig); 
     //need to add this to make sure recursive parsing happens! 
     parseContext.set(Parser.class, parser); 

     FileInputStream stream = new FileInputStream("samplepdf.pdf"); 
     Metadata metadata = new Metadata(); 
     parser.parse(stream, handler, metadata, parseContext); 
     System.out.println(metadata); 
     String content = handler.toString(); 
     System.out.println("==============="); 
     System.out.println(content); 
     System.out.println("Done"); 
    } 
} 

Maven Dipendenze:

<dependencies> 
    <dependency> 
     <groupId>org.apache.tika</groupId> 
     <artifactId>tika-parsers</artifactId> 
     <version>1.13</version> 
    </dependency> 
    <dependency> 
     <groupId>com.levigo.jbig2</groupId> 
     <artifactId>levigo-jbig2-imageio</artifactId> 
     <version>1.6.5</version> 
    </dependency> 
    </dependencies> 
+1

Ho provato la soluzione e ho seguito Apache Tika-Jira ma non funziona. Non ricevo alcun errore, ma l'output è vuoto. – Rana

+1

Il mio problema è stato risolto. Segui: http://stackoverflow.com/questions/39762841/unable-to-extract-scanned-pdf-using-tesseractocrconfig-apache-tika/39792337#39792337 – Rana

+0

Thamme, grazie per questo.Si prega di aggiornare per includere la seguente dipendenza (grazie al collegamento di Rana sopra) e un avvertimento sulle implicazioni di licenza di levigo e jai. com.github.jai-ImageIO jai-ImageIO-core 1.3.1