代码之家  ›  专栏  ›  技术社区  ›  metersk

获取行和段落,而不是PDF上Google Vision API OCR的符号

  •  16
  • metersk  · 技术社区  · 7 年前

    我正在尝试使用现在支持的来自googlecloudvisionapi的PDF/TIFF文档文本检测。使用他们的示例代码,我可以提交一个PDF文件,并接收一个带有提取文本的JSON对象。我的问题是,保存到GCS的JSON文件只包含“符号”的边界框和文本,即每个单词中的每个字符。这使得JSON对象非常难以使用。我希望能够得到“行”、“段落”和“块”的文本和边框,但是我似乎找不到通过 AsyncAnnotateFileRequest() 方法。

    示例代码如下:

    def async_detect_document(gcs_source_uri, gcs_destination_uri):
        """OCR with PDF/TIFF as source files on GCS"""
        # Supported mime_types are: 'application/pdf' and 'image/tiff'
        mime_type = 'application/pdf'
    
        # How many pages should be grouped into each json output file.
        batch_size = 2
    
        client = vision.ImageAnnotatorClient()
    
        feature = vision.types.Feature(
            type=vision.enums.Feature.Type.DOCUMENT_TEXT_DETECTION)
    
        gcs_source = vision.types.GcsSource(uri=gcs_source_uri)
        input_config = vision.types.InputConfig(
            gcs_source=gcs_source, mime_type=mime_type)
    
        gcs_destination = vision.types.GcsDestination(uri=gcs_destination_uri)
        output_config = vision.types.OutputConfig(
            gcs_destination=gcs_destination, batch_size=batch_size)
    
        async_request = vision.types.AsyncAnnotateFileRequest(
            features=[feature], input_config=input_config,
            output_config=output_config)
    
        operation = client.async_batch_annotate_files(
            requests=[async_request])
    
        print('Waiting for the operation to finish.')
        operation.result(timeout=180)
    
        # Once the request has completed and the output has been
        # written to GCS, we can list all the output files.
        storage_client = storage.Client()
    
        match = re.match(r'gs://([^/]+)/(.+)', gcs_destination_uri)
        bucket_name = match.group(1)
        prefix = match.group(2)
    
        bucket = storage_client.get_bucket(bucket_name=bucket_name)
    
        # List objects with the given prefix.
        blob_list = list(bucket.list_blobs(prefix=prefix))
        print('Output files:')
        for blob in blob_list:
            print(blob.name)
    
        # Process the first output file from GCS.
        # Since we specified batch_size=2, the first response contains
        # the first two pages of the input file.
        output = blob_list[0]
    
        json_string = output.download_as_string()
        response = json_format.Parse(
            json_string, vision.types.AnnotateFileResponse())
    
        # The actual response for the first page of the input file.
        first_page_response = response.responses[0]
        annotation = first_page_response.full_text_annotation
    
        # Here we print the full text from the first page.
        # The response contains more information:
        # annotation/pages/blocks/paragraphs/words/symbols
        # including confidence scores and bounding boxes
        print(u'Full text:\n{}'.format(
            annotation.text))
    
    1 回复  |  直到 7 年前
        1
  •  23
  •   Dustin Ingram    7 年前

    不幸的是,当使用 DOCUMENT_TEXT_DETECTION 键入,则只能获取每页的全文或单个符号。不过,将符号中的段落和行放在一起并不太困难,类似的方法应该可以(从示例中扩展):

    breaks = vision.enums.TextAnnotation.DetectedBreak.BreakType
    paragraphs = []
    lines = []
    
    for page in annotation.pages:
        for block in page.blocks:
            for paragraph in block.paragraphs:
                para = ""
                line = ""
                for word in paragraph.words:
                    for symbol in word.symbols:
                        line += symbol.text
                        if symbol.property.detected_break.type == breaks.SPACE:
                            line += ' '
                        if symbol.property.detected_break.type == breaks.EOL_SURE_SPACE:
                            line += ' '
                            lines.append(line)
                            para += line
                            line = ''
                        if symbol.property.detected_break.type == breaks.LINE_BREAK:
                            lines.append(line)
                            para += line
                            line = ''
                paragraphs.append(para)
    
    print(paragraphs)
    print(lines)