2014-09-11 5 views
0

Apache Tika 1.6은 PDF 문서에서 인라인 이미지를 추출 할 수 있습니다. 그러나, 나는 그것이 작동하도록 고투하고있다.Apache Tika로 PDF에서 이미지 추출

필자는 콘텐츠를 추출하고 모든 문서 (PDF가 아닐 수도 있음)에서 이미지를 개별적으로 추출하는 코드를 원합니다. 그런 다음 Apache UIMA 파이프 라인으로 전달됩니다.

사용자 지정 파서 (AutoParser에서 작성)를 사용하여 문서를 HTML로 변환 한 다음 이미지를 개별적으로 저장하여 다른 문서 형식의 이미지를 추출 할 수있었습니다. PDF로 시도 할 때 태그가 HTML에 나타나지 않아 파일에 대한 액세스 권한을 부여합니다.

누군가가 Tika 1.6을 사용하여 PDF에서 인라인 이미지 추출을 수행하는 방법에 대한 코드 예제를 통해 위의 내용을 달성 할 수있는 방법을 제안 할 수 있습니까?

+0

[티카-1268 (https://issues.apache.org/jira/browse/TIKA-1268) 및 [티카-1396 (https://issues.apache.org/jira/browse/TIKA-1396)은 모두 1.6으로 고정되어 표시되었습니다. 실제로이 경우 Tika 1.6을 사용하고 있습니까? – Gagravarr

+0

웹 사이트에서 1.6이라고 표시된 것과 tika-app-1.6.jar라고하면 실제로 Tika 1.6이라고 가정하고 그렇습니다. –

+0

그리고 이미지 추출을 테스트하기 위해'--extract' 플래그로 Tika 앱을 사용하고 있습니까? – Gagravarr

답변

0

다음 코드를 사용해보십시오. ContentHandler turned your xml content.

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