Apache Tika извлекает отсканированные PDF файлы

У меня проблемы с Apache TIKA (версия 1.10). У меня есть некоторые PDF файлы, которые только что отсканированы. Это означает, что каждая страница - это просто изображение. Моя цель - в любом случае извлечь текст PDF файлов.

Мой tesseract настроен правильно, и извлечение файлов JPG и PNG работает как шарм. Код, который я использую, выглядит так (не обращайте внимания на недостающую обработку excetion):

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;
}

Я много искал, но я не нашел решений, которые работают на меня. Я уже пробовал метод setExtractInlineImages класса PDFParserConfig, но это ничего не меняло. Извлечение встроенных документов с использованием пользовательского ParsingEmbeddedDocumentExtractor извлекило встроенные ресурсы файла doc, но не для моих файлов PDF.

Было бы здорово, если бы кто-нибудь из вас мог оказать некоторую помощь:)

1 ответ

Тим Эллисон привёл решение:

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);

Это работает для меня:)

EDIT: Вот полное решение:

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:

<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>

licensed under cc by-sa 3.0 with attribution.