具備 Document AI 的光學字元辨識 (OCR) 功能 (Python)

1. 總覽

什麼是 Document AI?

Document AI 是一種文件解讀解決方案,能擷取非結構化資料 (例如文件、電子郵件、應付憑據、表單等),讓使用者更容易理解、分析及取用資料。這個 API 透過內容分類、實體擷取、進階搜尋等功能提供結構。

在本研究室中,您將學習如何使用 Document AI API 搭配 Python 來執行光學字元辨識。

我們會使用經典小說《Winnie the Pooh》的 PDF 檔案A.A. 製作Milne,最近成為美國公共領域資源的一部分。這個檔案是由 Google 圖書掃描並數位化。

課程內容

  • 如何啟用 Document AI API
  • 如何驗證 API 要求
  • 如何安裝 Python 適用的用戶端程式庫
  • 如何使用線上和批次處理 API
  • 如何剖析 PDF 檔案中的文字

軟硬體需求

  • Google Cloud 專案
  • 瀏覽器,例如 ChromeFirefox
  • 熟悉使用 Python (3.9 以上版本)

問卷調查

您會如何使用這個教學課程?

僅供閱讀 閱讀並完成練習

您對 Python 的使用體驗有何評價?

新手 中級 還算容易

針對使用 Google Cloud 服務的經驗,您會給予什麼評價?

新手 中級 還算容易

2. 設定和需求

自修環境設定

  1. 登入 Cloud 控制台建立新專案,或是重複使用現有專案。(如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶)。

選取專案

新增專案

取得專案 ID

請記住「專案 ID」,也就是所有 Google Cloud 專案中的專屬名稱。(很抱歉,上述專案 ID 已有人使用,無法讓您解決問題!)。您之後必須於 PROJECT_ID 提供這個 ID。

  1. 接下來,您必須在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。

請務必依照「清除所用資源」一節指示專區。本節將說明如何關閉資源,這樣您才不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆電遠端操作 Google Cloud,但本程式碼研究室會使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

啟用 Cloud Shell

  1. 在 Cloud 控制台中,按一下「啟用 Cloud Shell」 圖示 啟用 Cloud Shell

啟用 Cloud Shell

如果您先前從未啟動 Cloud Shell,您會看見中繼畫面 (需捲動位置),說明螢幕內容。如果出現這種情況,請按一下「繼續」 (之後不會再顯示)。以下是單次畫面的外觀:

Cloud Shell 簡介

佈建並連線至 Cloud Shell 只需幾分鐘的時間。Cloud Shell

在 Cloud Shell 中,您可以透過終端機存取託管於雲端的虛擬機器。虛擬機器包含您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可以透過瀏覽器完成。

連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。

  1. 在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list

指令輸出

 Credentialed Accounts
ACTIVE  ACCOUNT
*      <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如果尚未設定,請使用下列指令進行設定:

gcloud config set project <PROJECT_ID>

指令輸出

Updated property [core/project].

3. 啟用 Document AI API

您必須先啟用 API,才能開始使用 Document AI。您可以使用 gcloud 指令列介面或 Cloud 控制台完成這項操作。

使用 gcloud CLI

  1. 如果不是使用 Cloud Shell,請按照在本機電腦上安裝 gcloud CLI 中的步驟操作。
  2. 您可以使用下列 gcloud 指令啟用 API。
gcloud services enable documentai.googleapis.com storage.googleapis.com

畫面應如下所示:

Operation "operations/..." finished successfully.

使用 Cloud Console

在瀏覽器中開啟 Cloud 控制台

  1. 使用控制台頂端的搜尋列搜尋「Document AI API」,然後按一下「啟用」,即可在 Google Cloud 專案中使用該 API

Search API

  1. 重複執行上一個 Google Cloud Storage API 步驟。

您現在可以使用 Document AI 了!

4. 建立及測試處理器

您必須先建立要執行擷取作業的文件 OCR 處理器執行個體。可以使用 Cloud 控制台或 Processor Management API 完成這項操作。

Cloud Console

  1. 在控制台中前往 Document AI Platform OverviewDocument AI 總覽控制台
  2. 按一下「探索處理器」,然後選取「文件 OCR」處理器
  3. 輸入名稱 codelab-ocr (或其他您會記得的),然後從清單中選取最接近的區域。
  4. 點選「建立」來建立處理器
  5. 複製處理器 ID。稍後您必須在程式碼中使用此項目。處理器 ID

您可以在控制台中上傳文件,測試處理器。按一下「上傳測試文件」,然後選取要剖析的文件。

您可以在下方下載 PDF 檔案,其中包含我們小說的前 3 頁。

書名頁

輸出內容應如下所示:剖析後的圖書

Python 用戶端程式庫

請參考本程式碼研究室,瞭解如何使用 Python 用戶端程式庫管理 Document AI 處理器:

使用 Python 管理 Document AI 處理器 - 程式碼研究室

5. 驗證 API 要求

您必須使用服務帳戶,才能向 Document AI API 提出要求。服務帳戶屬於您的專案,可供 Python 用戶端程式庫發出 API 要求。就像任何其他使用者帳戶一樣,服務帳戶都是以電子郵件地址表示。在本節中,您將使用 Cloud SDK 建立服務帳戶,然後建立必要憑證以服務帳戶身分進行驗證。

首先,開啟 Cloud Shell 並使用 PROJECT_ID 設定環境變數,本程式碼研究室全程都會使用這個環境變數:

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)

接下來,使用下列方法建立新的服務帳戶來存取 Document AI API:

gcloud iam service-accounts create my-docai-sa \
  --display-name "my-docai-service-account"

接著,請授予服務帳戶在專案中存取 Document AI 和 Cloud Storage 的權限。

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/documentai.admin"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/storage.admin"

gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
    --member="serviceAccount:my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
    --role="roles/serviceusage.serviceUsageConsumer"

接下來,建立 Python 程式碼用來登入做為新服務帳戶的憑證。執行下列指令,建立憑證並儲存為 JSON 檔案 ~/key.json

gcloud iam service-accounts keys create ~/key.json \
  --iam-account  my-docai-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

最後設定 GOOGLE_APPLICATION_CREDENTIALS 環境變數,程式庫會使用這個變數尋找您的憑證。如要進一步瞭解這種驗證方式,請參閱指南。使用以下指令,環境變數應設為所建立 JSON 憑證檔案的完整路徑:

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

6. 安裝用戶端程式庫

安裝適用於 Document AI、Cloud Storage 和 Document AI Toolbox 的 Python 用戶端程式庫:

pip3 install --upgrade google-cloud-documentai
pip3 install --upgrade google-cloud-storage
pip3 install --upgrade google-cloud-documentai-toolbox

畫面應如下所示:

...
Installing collected packages: google-cloud-documentai
Successfully installed google-cloud-documentai-2.15.0
.
.
Installing collected packages: google-cloud-storage
Successfully installed google-cloud-storage-2.9.0
.
.
Installing collected packages: google-cloud-documentai-toolbox
Successfully installed google-cloud-documentai-toolbox-0.6.0a0

您現在可以使用 Document AI API 了!

7. 下載 PDF 範例

我們製作了一份範例文件,其中包含小說的前 3 頁。

你可以透過以下連結下載 PDF 檔案。然後將其上傳至 Cloud Shell 執行個體

您也可以使用 gsutil,從公開的 Google Cloud Storage 值區下載這個檔案。

gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh_3_Pages.pdf .

8. 提出線上處理要求

在這個步驟中,您將使用線上處理 (同步) API 處理小說的前 3 頁。此方法最適用於儲存在本機的小型文件。請參閱完整處理器清單,瞭解各種處理器類型的頁面和檔案大小上限。

透過本機電腦上的 Cloud Shell 編輯器或文字編輯器,建立名為 online_processing.py 的檔案,並使用以下程式碼。

YOUR_PROJECT_IDYOUR_PROJECT_LOCATIONYOUR_PROCESSOR_IDFILE_PATH 替換為您環境適用的值。

online_processing.py

from google.api_core.client_options import ClientOptions
from google.cloud import documentai


PROJECT_ID = "YOUR_PROJECT_ID"
LOCATION = "YOUR_PROJECT_LOCATION"  # Format is 'us' or 'eu'
PROCESSOR_ID = "YOUR_PROCESSOR_ID"  # Create processor in Cloud Console

# The local file in your current working directory
FILE_PATH = "Winnie_the_Pooh_3_Pages.pdf"
# Refer to https://cloud.google.com/document-ai/docs/file-types
# for supported file types
MIME_TYPE = "application/pdf"

# Instantiates a client
docai_client = documentai.DocumentProcessorServiceClient(
    client_options=ClientOptions(api_endpoint=f"{LOCATION}-documentai.googleapis.com")
)

# The full resource name of the processor, e.g.:
# projects/project-id/locations/location/processor/processor-id
# You must create new processors in the Cloud Console first
RESOURCE_NAME = docai_client.processor_path(PROJECT_ID, LOCATION, PROCESSOR_ID)

# Read the file into memory
with open(FILE_PATH, "rb") as image:
    image_content = image.read()

# Load Binary Data into Document AI RawDocument Object
raw_document = documentai.RawDocument(content=image_content, mime_type=MIME_TYPE)

# Configure the process request
request = documentai.ProcessRequest(name=RESOURCE_NAME, raw_document=raw_document)

# Use the Document AI client to process the sample form
result = docai_client.process_document(request=request)

document_object = result.document
print("Document processing complete.")
print(f"Text: {document_object.text}")

執行程式碼,將文字擷取並輸出到控制台。

如果使用範例文件,您應該會看到下列輸出結果:

Document processing complete.
Text: CHAPTER I
IN WHICH We Are Introduced to
Winnie-the-Pooh and Some
Bees, and the Stories Begin
Here is Edward Bear, coming
downstairs now, bump, bump, bump, on the back
of his head, behind Christopher Robin. It is, as far
as he knows, the only way of coming downstairs,
but sometimes he feels that there really is another
way, if only he could stop bumping for a moment
and think of it. And then he feels that perhaps there
isn't. Anyhow, here he is at the bottom, and ready
to be introduced to you. Winnie-the-Pooh.
When I first heard his name, I said, just as you
are going to say, "But I thought he was a boy?"
"So did I," said Christopher Robin.
"Then you can't call him Winnie?"
"I don't."
"But you said "

...

Digitized by
Google

9. 提出批次處理要求

現在,假設您想閱讀整冊小說中的文字。

  • 「線上處理」對可傳送的網頁和檔案大小設有限制,且每個 API 呼叫僅允許擁有一個文件檔案。
  • 批次處理允許以非同步方法處理較大的/多個檔案。

在這個步驟中,我們會處理整個「Winnie the Pooh」Document AI Batch Processing API 的創新工作,並將文字輸出至 Google Cloud Storage 值區。

批次處理會使用長時間執行的作業以非同步的方式管理要求,因此我們必須發出要求及擷取輸出內容,方式與線上處理方式不同。不過,無論是採用線上還是批次處理,輸出內容都會採用相同的 Document 物件格式。

這個步驟說明如何提供特定文件供 Document AI 處理。後續步驟將示範如何處理整個文件目錄。

將 PDF 上傳至 Cloud Storage

batch_process_documents() 方法目前接受來自 Google Cloud Storage 的檔案。如要進一步瞭解物件結構,可以參考 documentai_v1.types.BatchProcessRequest

在這個例子中,您可以直接從範例值區讀取檔案。

您也可以使用 gsutil,將檔案複製到自己的值區...

gsutil cp gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf gs://YOUR_BUCKET_NAME/

...或者透過下方連結下載小說的範例檔案,然後上傳至您的值區

您也會需要 GCS 值區來儲存 API 的輸出內容。

您可以參閱 Cloud Storage 說明文件,瞭解如何建立儲存空間值區

使用 batch_process_documents() 方法

建立名為 batch_processing.py 的檔案,並使用下方的程式碼。

YOUR_PROJECT_IDYOUR_PROCESSOR_LOCATIONYOUR_PROCESSOR_IDYOUR_INPUT_URIYOUR_OUTPUT_URI 替換為您環境適用的值。

確認 YOUR_INPUT_URI 直接指向 PDF 檔案,例如:gs://cloud-samples-data/documentai/codelabs/ocr/Winnie_the_Pooh.pdf

batch_processing.py

"""
Makes a Batch Processing Request to Document AI
"""

import re

from google.api_core.client_options import ClientOptions
from google.api_core.exceptions import InternalServerError
from google.api_core.exceptions import RetryError
from google.cloud import documentai
from google.cloud import storage

# TODO(developer): Fill these variables before running the sample.
project_id = "YOUR_PROJECT_ID"
location = "YOUR_PROCESSOR_LOCATION"  # Format is "us" or "eu"
processor_id = "YOUR_PROCESSOR_ID"  # Create processor before running sample
gcs_output_uri = "YOUR_OUTPUT_URI"  # Must end with a trailing slash `/`. Format: gs://bucket/directory/subdirectory/
processor_version_id = (
    "YOUR_PROCESSOR_VERSION_ID"  # Optional. Example: pretrained-ocr-v1.0-2020-09-23
)

# TODO(developer): If `gcs_input_uri` is a single file, `mime_type` must be specified.
gcs_input_uri = "YOUR_INPUT_URI"  # Format: `gs://bucket/directory/file.pdf` or `gs://bucket/directory/`
input_mime_type = "application/pdf"
field_mask = "text,entities,pages.pageNumber"  # Optional. The fields to return in the Document object.


def batch_process_documents(
    project_id: str,
    location: str,
    processor_id: str,
    gcs_input_uri: str,
    gcs_output_uri: str,
    processor_version_id: str = None,
    input_mime_type: str = None,
    field_mask: str = None,
    timeout: int = 400,
):
    # You must set the api_endpoint if you use a location other than "us".
    opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")

    client = documentai.DocumentProcessorServiceClient(client_options=opts)

    if not gcs_input_uri.endswith("/") and "." in gcs_input_uri:
        # Specify specific GCS URIs to process individual documents
        gcs_document = documentai.GcsDocument(
            gcs_uri=gcs_input_uri, mime_type=input_mime_type
        )
        # Load GCS Input URI into a List of document files
        gcs_documents = documentai.GcsDocuments(documents=[gcs_document])
        input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents)
    else:
        # Specify a GCS URI Prefix to process an entire directory
        gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri)
        input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix)

    # Cloud Storage URI for the Output Directory
    gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
        gcs_uri=gcs_output_uri, field_mask=field_mask
    )

    # Where to write results
    output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)

    if processor_version_id:
        # The full resource name of the processor version, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}
        name = client.processor_version_path(
            project_id, location, processor_id, processor_version_id
        )
    else:
        # The full resource name of the processor, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}
        name = client.processor_path(project_id, location, processor_id)

    request = documentai.BatchProcessRequest(
        name=name,
        input_documents=input_config,
        document_output_config=output_config,
    )

    # BatchProcess returns a Long Running Operation (LRO)
    operation = client.batch_process_documents(request)

    # Continually polls the operation until it is complete.
    # This could take some time for larger files
    # Format: projects/{project_id}/locations/{location}/operations/{operation_id}
    try:
        print(f"Waiting for operation {operation.operation.name} to complete...")
        operation.result(timeout=timeout)
    # Catch exception when operation doesn"t finish before timeout
    except (RetryError, InternalServerError) as e:
        print(e.message)

    # NOTE: Can also use callbacks for asynchronous processing
    #
    # def my_callback(future):
    #   result = future.result()
    #
    # operation.add_done_callback(my_callback)

    # Once the operation is complete,
    # get output document information from operation metadata
    metadata = documentai.BatchProcessMetadata(operation.metadata)

    if metadata.state != documentai.BatchProcessMetadata.State.SUCCEEDED:
        raise ValueError(f"Batch Process Failed: {metadata.state_message}")

    storage_client = storage.Client()

    print("Output files:")
    # One process per Input Document
    for process in list(metadata.individual_process_statuses):
        # output_gcs_destination format: gs://BUCKET/PREFIX/OPERATION_NUMBER/INPUT_FILE_NUMBER/
        # The Cloud Storage API requires the bucket name and URI prefix separately
        matches = re.match(r"gs://(.*?)/(.*)", process.output_gcs_destination)
        if not matches:
            print(
                "Could not parse output GCS destination:",
                process.output_gcs_destination,
            )
            continue

        output_bucket, output_prefix = matches.groups()

        # Get List of Document Objects from the Output Bucket
        output_blobs = storage_client.list_blobs(output_bucket, prefix=output_prefix)

        # Document AI may output multiple JSON files per source file
        for blob in output_blobs:
            # Document AI should only output JSON files to GCS
            if blob.content_type != "application/json":
                print(
                    f"Skipping non-supported file: {blob.name} - Mimetype: {blob.content_type}"
                )
                continue

            # Download JSON File as bytes object and convert to Document Object
            print(f"Fetching {blob.name}")
            document = documentai.Document.from_json(
                blob.download_as_bytes(), ignore_unknown_fields=True
            )

            # For a full list of Document object attributes, please reference this page:
            # https://cloud.google.com/python/docs/reference/documentai/latest/google.cloud.documentai_v1.types.Document

            # Read the text recognition output from the processor
            print("The document contains the following text:")
            print(document.text)


if __name__ == "__main__":
    batch_process_documents(
        project_id=project_id,
        location=location,
        processor_id=processor_id,
        gcs_input_uri=gcs_input_uri,
        gcs_output_uri=gcs_output_uri,
        input_mime_type=input_mime_type,
        field_mask=field_mask,
    )

執行程式碼後,您應該會在控制台中看到擷取及列印的完整新文字。

由於檔案比上一個範例大上許多,因此系統可能需要一段時間才能完成作業。(噢,煩...)

但是使用 Batch Processing API 時,您會收到作業 ID,在工作完成後,您可以使用此 ID 從 GCS 取得輸出結果。

輸出內容應如下所示:

Waiting for operation projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_NUMBER to complete...
Document processing complete.
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-0.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-1.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-10.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-11.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-12.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-13.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-14.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-15.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-16.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-17.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-18.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-2.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-3.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-4.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-5.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-6.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-7.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-8.json
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh-9.json

This is a reproduction of a library book that was digitized
by Google as part of an ongoing effort to preserve the
information in books and make it universally accessible.
TM
Google books
https://books.google.com

.....

He nodded and went
out ... and in a moment
I heard Winnie-the-Pooh
-bump, bump, bump-go-ing up the stairs behind
him.
Digitized by
Google

10. 針對目錄提出批次處理要求

有時候,您可能會想處理整個文件目錄,而不必個別列出每份文件。batch_process_documents() 方法支援輸入特定文件清單或目錄路徑。

這個步驟會說明如何處理完整的文件檔案目錄。大部分程式碼的運作方式與上一個步驟相同,唯一的差別在於透過 BatchProcessRequest 傳送的 GCS URI。

我們在範例值區中的目錄,有一個獨立檔案內含多個小說的頁面。

  • gs://cloud-samples-data/documentai/codelabs/ocr/multi-document/

您可以直接讀取檔案,或將檔案複製到自己的 Cloud Storage 值區中。

重新執行上一步的程式碼,將 YOUR_INPUT_URI 替換為 Cloud Storage 中的目錄。

執行程式碼。Cloud Storage 目錄中,所有文件檔案中的文字應會擷取出來。

輸出內容應如下所示:

Waiting for operation projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_NUMBER to complete...
Document processing complete.
Fetching docai-output/OPERATION_NUMBER/0/Winnie_the_Pooh_Page_0-0.json
Fetching docai-output/OPERATION_NUMBER/1/Winnie_the_Pooh_Page_1-0.json
Fetching docai-output/OPERATION_NUMBER/2/Winnie_the_Pooh_Page_10-0.json
Fetching docai-output/OPERATION_NUMBER/3/Winnie_the_Pooh_Page_12-0.json
Fetching docai-output/OPERATION_NUMBER/4/Winnie_the_Pooh_Page_16-0.json
Fetching docai-output/OPERATION_NUMBER/5/Winnie_the_Pooh_Page_7-0.json

Introduction
(I₂
F YOU happen to have read another
book about Christopher Robin, you may remember
th
CHAPTER I
IN WHICH We Are Introduced to
Winnie-the-Pooh and Some
Bees, and the Stories Begin
HERE is
10
WINNIE-THE-POOH
"I wonder if you've got such a thing as a balloon
about you?"
"A balloon?"
"Yes, 
12
WINNIE-THE-POOH
and you took your gun with you, just in case, as
you always did, and Winnie-the-P
16
WINNIE-THE-POOH
this song, and one bee sat down on the nose of the
cloud for a moment, and then g
WE ARE INTRODUCED
7
"Oh, help!" said Pooh, as he dropped ten feet on
the branch below him.
"If only 

11. 使用 Document AI Toolbox 處理批次處理回應

由於與 Cloud Storage 整合,批次處理需要完成幾個步驟才能完成。Document 輸出內容也可能是「資料分割」根據輸入文件的大小,分割成多個 .json 檔案。

Document AI Toolbox Python SDK 打造了使用 Document AI 來簡化後續處理和其他一般工作。這個程式庫是用來補充 Document AI 用戶端程式庫,而非取代函式。如要瞭解完整規格,請參閱參考說明文件

這個步驟說明如何使用 Document AI Toolbox 提出批次處理要求及擷取輸出內容。

batch_processing_toolbox.py

"""
Makes a Batch Processing Request to Document AI using Document AI Toolbox
"""

from google.api_core.client_options import ClientOptions
from google.cloud import documentai
from google.cloud import documentai_toolbox

# TODO(developer): Fill these variables before running the sample.
project_id = "YOUR_PROJECT_ID"
location = "YOUR_PROCESSOR_LOCATION"  # Format is "us" or "eu"
processor_id = "YOUR_PROCESSOR_ID"  # Create processor before running sample
gcs_output_uri = "YOUR_OUTPUT_URI"  # Must end with a trailing slash `/`. Format: gs://bucket/directory/subdirectory/
processor_version_id = (
    "YOUR_PROCESSOR_VERSION_ID"  # Optional. Example: pretrained-ocr-v1.0-2020-09-23
)

# TODO(developer): If `gcs_input_uri` is a single file, `mime_type` must be specified.
gcs_input_uri = "YOUR_INPUT_URI"  # Format: `gs://bucket/directory/file.pdf`` or `gs://bucket/directory/``
input_mime_type = "application/pdf"
field_mask = "text,entities,pages.pageNumber"  # Optional. The fields to return in the Document object.


def batch_process_toolbox(
    project_id: str,
    location: str,
    processor_id: str,
    gcs_input_uri: str,
    gcs_output_uri: str,
    processor_version_id: str = None,
    input_mime_type: str = None,
    field_mask: str = None,
):
    # You must set the api_endpoint if you use a location other than "us".
    opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")

    client = documentai.DocumentProcessorServiceClient(client_options=opts)

    if not gcs_input_uri.endswith("/") and "." in gcs_input_uri:
        # Specify specific GCS URIs to process individual documents
        gcs_document = documentai.GcsDocument(
            gcs_uri=gcs_input_uri, mime_type=input_mime_type
        )
        # Load GCS Input URI into a List of document files
        gcs_documents = documentai.GcsDocuments(documents=[gcs_document])
        input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents)
    else:
        # Specify a GCS URI Prefix to process an entire directory
        gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri)
        input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix)

    # Cloud Storage URI for the Output Directory
    gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig(
        gcs_uri=gcs_output_uri, field_mask=field_mask
    )

    # Where to write results
    output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config)

    if processor_version_id:
        # The full resource name of the processor version, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id}
        name = client.processor_version_path(
            project_id, location, processor_id, processor_version_id
        )
    else:
        # The full resource name of the processor, e.g.:
        # projects/{project_id}/locations/{location}/processors/{processor_id}
        name = client.processor_path(project_id, location, processor_id)

    request = documentai.BatchProcessRequest(
        name=name,
        input_documents=input_config,
        document_output_config=output_config,
    )

    # BatchProcess returns a Long Running Operation (LRO)
    operation = client.batch_process_documents(request)

    # Operation Name Format: projects/{project_id}/locations/{location}/operations/{operation_id}
    documents = documentai_toolbox.document.Document.from_batch_process_operation(
        location=location, operation_name=operation.operation.name
    )

    for document in documents:
        # Read the text recognition output from the processor
        print("The document contains the following text:")
        # Truncated at 100 characters for brevity
        print(document.text[:100])


if __name__ == "__main__":
    batch_process_toolbox(
        project_id=project_id,
        location=location,
        processor_id=processor_id,
        gcs_input_uri=gcs_input_uri,
        gcs_output_uri=gcs_output_uri,
        input_mime_type=input_mime_type,
        field_mask=field_mask,
    )

12. 恭喜

您已成功使用 Document AI,透過線上處理、批次處理和 Document AI 工具箱從小說中擷取文字。

我們鼓勵您試用其他文件,並探索平台提供的其他處理器

清除

如要避免系統向您的 Google Cloud 帳戶收取您在本教學課程中所用資源的相關費用:

  • 在 Cloud 控制台中,前往「管理資源」頁面。
  • 在專案清單中,選取您的專案,然後按一下「刪除」。
  • 在對話方塊中輸入專案 ID,然後按一下「關閉」,即可刪除專案。

瞭解詳情

參加這些後續的程式碼研究室,繼續學習 Document AI。

資源

授權

這項內容採用的是創用 CC 姓名標示 2.0 通用授權。