File size: 1,815 Bytes
153d307
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from unstructured.partition.pdf import partition_pdf
import tempfile
from typing import List, Union, Optional
from indexify_extractor_sdk import Content, Extractor, Feature
from pydantic import BaseModel, Field

class UnstructuredIOConfig(BaseModel):
    strategy: Optional[str] = Field(default="auto") # "auto", "hi_res", "ocr_only", and "fast"
    hi_res_model_name: Optional[str] = Field(default="yolox")
    infer_table_structure: Optional[bool] = True

class UnstructuredIOExtractor(Extractor):
    name = "tensorlake/unstructuredio"
    description = "This extractor uses unstructured.io to extract pieces of pdf document into separate plain text content data."
    system_dependencies = ["libmagic-dev", "poppler-utils", "tesseract-ocr"]
    input_mime_types = ["application/pdf"]

    def __init__(self):
        super(UnstructuredIOExtractor, self).__init__()

    def extract(self, content: Content, params: UnstructuredIOConfig) -> List[Union[Feature, Content]]:
        contents = []
        strategy = params.strategy
        hi_res_model_name = params.hi_res_model_name
        infer_table_structure = params.infer_table_structure
        
        with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as inputtmpfile:
            inputtmpfile.write(content.data)
            inputtmpfile.flush()

            elements = partition_pdf(inputtmpfile.name, strategy=strategy, hi_res_model_name=hi_res_model_name, infer_table_structure=infer_table_structure)
            for el in elements:
                feature = Feature.metadata(value={"type": type(el).__name__, "page_number": el.metadata.page_number})
                contents.append(Content.from_text(el.text, features=[feature]))

        return contents

    def sample_input(self) -> Content:
        return self.sample_scientific_pdf()