Image 使用ApacheTika从PDF中提取图像

Image 使用ApacheTika从PDF中提取图像,image,pdf,apache-tika,Image,Pdf,Apache Tika,ApacheTika 1.6能够从PDF文档中提取内联图像。然而,我一直在努力让它发挥作用 我的用例是,我需要一些代码来从任何文档(不一定是PDF)中提取内容和单独的图像。然后将其传递到ApacheUIMA管道中 我已经能够从其他文档类型中提取图像,方法是使用自定义解析器(构建在自动解析器上)将文档转换为HTML,然后单独保存图像。但是,当我尝试使用PDF时,这些标记甚至不会出现在HTML中,更不用说让我访问这些文件了 是否有人可以建议我如何实现上述目标,最好是提供一些代码示例,说明如何使用Ti

ApacheTika 1.6能够从PDF文档中提取内联图像。然而,我一直在努力让它发挥作用

我的用例是,我需要一些代码来从任何文档(不一定是PDF)中提取内容和单独的图像。然后将其传递到ApacheUIMA管道中

我已经能够从其他文档类型中提取图像,方法是使用自定义解析器(构建在自动解析器上)将文档转换为HTML,然后单独保存图像。但是,当我尝试使用PDF时,这些标记甚至不会出现在HTML中,更不用说让我访问这些文件了


是否有人可以建议我如何实现上述目标,最好是提供一些代码示例,说明如何使用Tika 1.6从PDF中进行内联图像提取?

试试下面的代码,ContentHandler包含您的xml内容

public ContentHandler convertPdf(byte[] content, String path, String filename)throws IOException, SAXException, TikaException{           

    Metadata metadata = new Metadata();
    ParseContext context = new ParseContext();
    ContentHandler handler =   new ToXMLContentHandler();
    PDFParser parser = new PDFParser(); 

    PDFParserConfig config = new PDFParserConfig();
    config.setExtractInlineImages(true);
    config.setExtractUniqueInlineImagesOnly(true);

    parser.setPDFParserConfig(config);


    EmbeddedDocumentExtractor embeddedDocumentExtractor = 
            new EmbeddedDocumentExtractor() {
        @Override
        public boolean shouldParseEmbedded(Metadata metadata) {
            return true;
        }
        @Override
        public void parseEmbedded(InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml)
                throws SAXException, IOException {
            Path outputFile = new File(path+metadata.get(Metadata.RESOURCE_NAME_KEY)).toPath();
            Files.copy(stream, outputFile);
        }
    };

    context.set(PDFParser.class, parser);
    context.set(EmbeddedDocumentExtractor.class,embeddedDocumentExtractor );

    try (InputStream stream = new ByteArrayInputStream(content)) {
        parser.parse(stream, handler, metadata, context);
    }

    return handler;
}

可以使用
AutoDetectParser
提取图像,而不依赖
PDFParser
。这段代码同样适用于从docx、pptx等文件中提取图像

这里我有一个
parseDocument()
和一个
setPdfConfig()
函数,它使用了一个
AutoDetectParser

  • 我创建了一个
    AutoDetectParser
  • EmbeddedDocumentExtractor
    附加到
    ParseContext
  • AutoDetectParser
    附加到相同的
    ParseContext
  • PDFParserConfig
    附加到相同的
    ParseContext
  • 然后将
    ParseContext
    赋予
    AutoDetectParser.parse()
  • 图像将保存到与源文件位于同一位置的文件夹中,名称为
    \uu/

    private static void setPdfConfig(ParseContext上下文){
    PDFParserConfig pdfConfig=新的PDFParserConfig();
    pdfConfig.setExtractInlineImages(true);
    pdfConfig.setExtractUniqueInlineImagesOnly(true);
    set(PDFParserConfig.class,pdfConfig);
    }
    私有静态字符串解析文档(字符串路径){
    字符串xhtmlContents=“”;
    AutoDetectParser=新的AutoDetectParser();
    ContentHandler=new-ToXMLContentHandler();
    元数据=新元数据();
    ParseContext=新的ParseContext();
    EmbeddedDocumentExtractor EmbeddedDocumentExtractor=
    新的EmbeddedDocumentExtractor(){
    @凌驾
    公共布尔值shouldParseEmbedded(元数据){
    返回true;
    }
    @凌驾
    public void parseEmbedded(InputStream流、ContentHandler处理程序、元数据、布尔outputHtml)
    抛出SAXException,IOException{
    Path outputDir=新文件(路径+“”).toPath();
    Files.createDirectories(outputDir);
    Path outputPath=新文件(outputDir.toString()+“/”+metadata.get(metadata.RESOURCE_NAME_KEY)).toPath();
    Files.deleteIfExists(outputPath);
    复制(流、输出路径);
    }
    };
    set(EmbeddedDocumentExtractor.class,EmbeddedDocumentExtractor);
    set(AutoDetectParser.class,解析器);
    setPdfConfig(上下文);
    try(InputStream=新文件InputStream(路径)){
    parser.parse(流、处理程序、元数据、上下文);
    xhtmlContents=handler.toString();
    }捕获(IOE异常){
    e、 printStackTrace();
    }捕获(SAXException | TIKAE异常){
    e、 printStackTrace();
    }
    返回XHTML内容;
    }
    
    和都在1.6中标记为已修复,你确定你真的在使用Tika 1.6吗?假设网站上标记为1.6的Tika-app-1.6.jar实际上是Tika 1.6,那么我确定!您正在使用带有--extract标志的Tika应用程序来测试图像提取?我尝试以编程方式进行,但我尝试了--extract标志并使用GUI,但没有成功地使用这两种方法找到文档中的图像。听起来您需要跳到其中一个错误上,并指出它没有被正确修复。我想你指的是指定AutoParser.class的AutoDetectParser.class?@dnuttle fixed!我已经在一些PDF上使用了您的解决方案。一方面,它找到了两个图像并保存了它们。另一方面,它只保存了十幅图像中的一幅。陌生人,这不是文件中出现的第一个。你对可能发生的事有什么想法吗?在这种情况下,对parseEmbedded的调用只发生一次。@dnuttle如果将此行设置为false,是否有帮助
    pdfConfig.setExtractUniqueInlineImagesOnly(true)谢谢;是的。这没用。(我修改了很多配置设置。)由于我们无法确定的原因,某些PDF会导致各种问题,这就是其中之一。(最大的问题是提取图像需要花费大量的时间。)我们正在努力解决这个问题。我认为原因是JAIAPI中的某个地方,它太低了以至于无法考虑进去。但是谢谢你上面的代码和你的回复。