无法使用apache tika直接从扫描的pdf中提取内容,但在转换为jpg格式时工作正常

时间:2017-02-01 16:47:10

标签: pdfbox apache-tika

我无法以pdf格式从下面附加的图像中提取内容,但是当我将其转换为jpg格式时它可以正常工作。我的问题是我有大量扫描的PDF文件,里面有多个扫描页面。我想看看是否有直接的方法来提取内容,而不是将pdf转换为jpg然后提取文本的开销。我按照link

提供的解决方案
  

pdf版本的doc是pdfversion

     

我的java版本" 1.8.0_112",tesseract 3.04.01,leptonica-1.74.1,   libjpeg 8d:libpng 1.6.28:libtiff 4.0.7:zlib 1.2.8

pom.xml

<dependencies>
    <dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-core</artifactId>
        <version>1.14</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>1.14</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.tika/tika-parsers -->
    <dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-core</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>4.2.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.11</version>
    </dependency>
    <dependency>
        <groupId>com.levigo.jbig2</groupId>
        <artifactId>levigo-jbig2-imageio</artifactId>
        <version>1.6.5</version>
    </dependency>

</dependencies>

java代码

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.File;
import java.io.FileInputStream;
import java.io.IOException;
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();
        config.setTesseractPath("/usr/local/bin/");
        PDFParserConfig pdfConfig = new PDFParserConfig();
        pdfConfig.setExtractInlineImages(true);
        pdfConfig.setExtractUniqueInlineImagesOnly(false);
        ParseContext parseContext = new ParseContext();
        parseContext.set(TesseractOCRConfig.class, config);
        parseContext.set(PDFParserConfig.class, pdfConfig);
        parseContext.set(Parser.class, parser);
        FileInputStream stream = new FileInputStream(new File("path2pdf.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");
    }
}

但没有用,如果我在这里做错了,请建议。 [1]

1 个答案:

答案 0 :(得分:1)

问题似乎是Tika调用tesseract(一旦它验证了二进制存在且可以执行),如果没有明确设置配置参数,则不指定环境中tessdata目录的位置(这种默认设置可能适用于某些安装,但不适用于我的Mac)。可以按以下方式明确设置路径:

      TesseractOCRConfig config = new TesseractOCRConfig();
      config.setTesseractPath("/usr/local/bin");
      config.setTessdataPath("/usr/local/share");

然后产生预期的结果(至少在MacOS X上通过自制软件安装tesseract):

  

1关系学习的条件随机场简介

     查尔斯萨顿

     

美国马萨诸塞大学计算机科学系   casutton-@cs.umass.edu http://www.cs.umass.edu/~casutton

     

Andrew McCallum

     

美国马萨诸塞大学计算机科学系   mccallum@cs.umass.edu http://www.cs.umass.edu/~mccallum

     

1.1简介

     

关系数据有两个特征:第一,统计   我们希望建模的实体之间存在依赖关系,其次,   每个实体通常都有丰富的功能,可以提供帮助   CLASSI科幻阳离子。例如,在对Web文档进行分类时。页面的   text提供了有关类标签的大量信息。但超链接   定义可以改善分类的页面之间的关系   [Taskar等人,2002年]。图形模型是一种自然的形式主义   利用实体之间的依赖结构。传统上,   图形模型已被用于表示联合概率   分布p(y,x),其中变量y代表属性   我们希望预测的实体和输入变量x   代表我们观察到的有关实体的知识。但建模   当使用富裕的本地时,联合分配可能导致困难   关系数据中可能出现的功能。因为它需要   对分布p(x)进行建模,其中包括复数   依赖。在输入之间建模这些依赖关系可以导致   难以处理的模型,但忽略它们会导致性能下降。

     

此问题的解决方案是直接对条件建模   分布p(y] x),足以进行分类。这是   有条件的随机场所采取的方法[Lafferty等,2001]。   条件随机场只是一个条件分布p(ylx)   具有相关的图形结构。因为模型是