Optische Zeichenerkennung (Optical Character Recognition, OCR) mit Document AI (Python)

1. Übersicht

Was ist Document AI?

Document AI ist eine Lösung zum Verstehen von Dokumenten, die unstrukturierte Daten (z.B. Dokumente, E-Mails, Rechnungen, Formulare usw.) verwendet, um sie leichter zu verstehen, zu analysieren und zu nutzen. Die API bietet Struktur durch Inhaltsklassifizierung, Entitätsextraktion, erweiterte Suche und mehr.

In diesem Lab lernen Sie, wie Sie mithilfe der Document AI API und Python eine optische Zeichenerkennung durchführen.

Wir verwenden eine PDF-Datei des Romanklassikers „Winnie Puuh“. von A.A. Milne, die seit Kurzem Teil der Public Domain-Urheberrechte in den USA ist. Diese Datei wurde von Google Books gescannt und digitalisiert.

Aufgaben in diesem Lab

  • Document AI API aktivieren
  • API-Anfragen authentifizieren
  • Clientbibliothek für Python installieren
  • Online- und Batchverarbeitungs-APIs verwenden
  • So parsen Sie Text aus einer PDF-Datei

Voraussetzungen

  • Ein Google Cloud-Projekt
  • Ein Browser, z. B. Chrome oder Firefox
  • Python-Vorkenntnisse (3.9 und höher)

Umfrage

Wie möchten Sie diese Anleitung nutzen?

<ph type="x-smartling-placeholder"></ph> Nur bis zum Ende lesen Lies sie dir durch und absolviere die Übungen

Wie würden Sie Ihre Erfahrung mit Python bewerten?

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

Wie würden Sie Ihre Erfahrungen im Umgang mit Google Cloud-Diensten bewerten?

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

2. Einrichtung und Anforderungen

Umgebung für das selbstbestimmte Lernen einrichten

  1. Melden Sie sich in der Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

Projekt auswählen

Neues Projekt

Projekt-ID abrufen

Notieren Sie sich die Projekt-ID, also einen eindeutigen Namen in allen Google Cloud-Projekten. (Die Projekt-ID oben ist bereits vergeben und funktioniert leider nicht.) Sie müssen diese ID später als PROJECT_ID angeben.

  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen verwenden zu können.

Folgen Sie der Anleitung im Abschnitt „Bereinigen“, . In diesem Abschnitt wird beschrieben, wie Sie Ressourcen herunterfahren, damit über diese Anleitung hinaus keine weiteren Kosten anfallen. Neue Google Cloud-Nutzer können an einem kostenlosen Testzeitraum mit 300$Guthaben teilnehmen.

Cloud Shell starten

Mit Google Cloud können Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen. In diesem Codelab wird jedoch Google Cloud Shell verwendet, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren .Cloud Shell aktivieren

Cloud Shell aktivieren

Wenn Sie Cloud Shell noch nie gestartet haben, wird ein Zwischenbildschirm (below the fold) angezeigt, in dem beschrieben wird, worum es sich bei Cloud Shell handelt. Klicken Sie in diesem Fall auf Weiter. Der Chat wird nie wieder angezeigt. So sieht dieser einmalige Bildschirm aus:

Einführung in Cloud Shell

Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment. Cloud Shell

Cloud Shell bietet Ihnen Terminalzugriff auf eine virtuelle Maschine, die in der Cloud gehostet wird. Die virtuelle Maschine enthält alle Entwicklungstools, die Sie benötigen. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können Sie ganz einfach mit einem Browser erledigen.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt bereits auf Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

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

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

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. Document AI API aktivieren

Bevor Sie Document AI verwenden können, müssen Sie die API aktivieren. Das ist über die gcloud-Befehlszeile oder die Cloud Console möglich.

gcloud CLI verwenden

  1. Wenn Sie nicht Cloud Shell verwenden, folgen Sie der Anleitung unter gcloud-Befehlszeile auf Ihrem lokalen Computer installieren.
  2. Die APIs können mit den folgenden gcloud-Befehlen aktiviert werden.
gcloud services enable documentai.googleapis.com storage.googleapis.com

Auf dem Bildschirm sollte Folgendes zu sehen sein:

Operation "operations/..." finished successfully.

Cloud Console verwenden

Öffnen Sie die Cloud Console in Ihrem Browser.

  1. Suchen Sie oben in der Console in der Suchleiste nach „Document AI API“ und klicken Sie dann auf Aktivieren, um die API in Ihrem Google Cloud-Projekt zu verwenden

Search API

  1. Wiederholen Sie den vorherigen Schritt für die Google Cloud Storage API.

Jetzt können Sie Document AI verwenden!

4. Prozessor erstellen und testen

Sie müssen zuerst eine Instanz des Document OCR-Prozessors erstellen, der die Extraktion durchführt. Dies kann über die Cloud Console oder die Processor Management API erfolgen.

Cloud Console

  1. Rufen Sie in der Console die Document AI Platform – Übersicht auf.Document AI – Übersichtskonsole
  2. Klicken Sie auf Prozessoren ansehen und wählen Sie Dokument-OCR aus.Prozessoren
  3. Geben Sie ihr den Namen codelab-ocr oder einen Namen, an den Sie sich erinnern, und wählen Sie die nächstgelegene Region aus der Liste aus.
  4. Klicken Sie auf Erstellen, um den Prozessor zu erstellen.
  5. Kopieren Sie Ihre Prozessor-ID. Sie müssen diesen später in Ihrem Code verwenden. Prozessor-ID

Sie können den Prozessor in der Konsole testen, indem Sie ein Dokument hochladen. Klicken Sie auf Testdokument hochladen und wählen Sie ein Dokument zum Parsen aus.

Du kannst unten die PDF-Datei herunterladen, die die ersten drei Seiten unseres Romans enthält.

Titelseite

Die Ausgabe sollte so aussehen: Geparstes Buch

Python-Clientbibliothek

In diesem Codelab erfahren Sie, wie Sie Document AI-Prozessoren mit der Python-Clientbibliothek verwalten:

Document AI-Prozessoren mit Python verwalten – Codelab

5. API-Anfragen authentifizieren

Für Anfragen an die Document AI API benötigen Sie ein Dienstkonto. Ein Dienstkonto gehört zu Ihrem Projekt und wird von der Python-Clientbibliothek für API-Anfragen verwendet. Wie jedes andere Nutzerkonto wird auch ein Dienstkonto durch eine E-Mail-Adresse repräsentiert. In diesem Abschnitt verwenden Sie das Cloud SDK, um ein Dienstkonto zu erstellen. Anschließend erstellen Sie Anmeldedaten, die Sie als Dienstkonto authentifizieren müssen.

Öffnen Sie zuerst Cloud Shell und legen Sie mit PROJECT_ID eine Umgebungsvariable fest, die Sie in diesem Codelab verwenden werden:

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

Erstellen Sie als Nächstes ein neues Dienstkonto, um mit folgendem Befehl auf die Document AI API zuzugreifen:

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

Als Nächstes erteilen Sie Ihrem Dienstkonto Berechtigungen für den Zugriff auf Document AI und Cloud Storage in Ihrem Projekt.

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"

Erstellen Sie als Nächstes Anmeldedaten, mit denen Ihr Python-Code sich als neues Dienstkonto anmeldet. Erstellen Sie diese Anmeldedaten und speichern Sie sie mit dem folgenden Befehl als JSON-Datei ~/key.json:

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

Legen Sie abschließend die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS fest, mit der die Bibliothek Ihre Anmeldedaten ermittelt. Weitere Informationen zu dieser Form der Authentifizierung finden Sie im Leitfaden. Die Umgebungsvariable sollte auf den vollständigen Pfad der JSON-Datei mit den Anmeldedaten festgelegt werden, indem Sie Folgendes verwenden:

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

6. Clientbibliothek installieren

Installieren Sie die Python-Clientbibliotheken für Document AI, Cloud Storage und Document AI Toolbox:

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

Auf dem Bildschirm sollte Folgendes zu sehen sein:

...
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

Jetzt können Sie die Document AI API verwenden.

7. Beispiel-PDF herunterladen

Wir haben ein Beispieldokument, das die ersten drei Seiten des Romans enthält.

Sie können die PDF-Datei über den folgenden Link herunterladen. Laden Sie diese dann in die Cloud Shell-Instanz hoch.

Sie können sie auch mithilfe von gsutil aus unserem öffentlichen Google Cloud Storage-Bucket herunterladen.

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

8. Anfrage zur Onlineverarbeitung stellen

In diesem Schritt verarbeiten Sie die ersten drei Seiten des Romans mithilfe der synchronen API zur Onlineverarbeitung. Diese Methode eignet sich am besten für kleinere, lokal gespeicherte Dokumente. In der vollständigen Prozessorliste finden Sie die maximalen Seiten und Dateigrößen für jeden Prozessortyp.

Erstellen Sie mit dem Cloud Shell-Editor oder einem Texteditor auf Ihrem lokalen Computer eine Datei mit dem Namen online_processing.py und verwenden Sie den Code unten.

Ersetzen Sie YOUR_PROJECT_ID, YOUR_PROJECT_LOCATION, YOUR_PROCESSOR_ID und FILE_PATH durch die entsprechenden Werte für Ihre Umgebung.

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}")

Führen Sie den Code aus, um den Text zu extrahieren und an der Konsole auszugeben.

Sie sollten die folgende Ausgabe sehen, wenn Sie unser Beispieldokument verwenden:

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. Stapelverarbeitungsanfrage stellen

Nehmen wir nun an, Sie möchten den Text aus dem gesamten Roman lesen.

  • Bei der Onlineverarbeitung gelten Beschränkungen für die Anzahl der Seiten und die Dateigröße, die gesendet werden können. Außerdem ist nur eine Dokumentdatei pro API-Aufruf zulässig.
  • Die Stapelverarbeitung ermöglicht die Verarbeitung größerer/mehrerer Dateien in einer asynchronen Methode.

In diesem Schritt verarbeiten wir den gesamten mit der Document AI Batch Processing API und geben den Text in einen Google Cloud Storage-Bucket aus.

Bei der Batchverarbeitung werden lang andauernde Vorgänge verwendet, um Anfragen asynchron zu verwalten. Daher müssen wir die Anfrage auf eine andere Weise stellen und die Ausgabe abrufen, als dies bei der Onlineverarbeitung der Fall ist. Die Ausgabe erfolgt jedoch im selben Document-Objektformat, unabhängig davon, ob die Online- oder Batchverarbeitung verwendet wird.

In diesem Schritt wird gezeigt, wie bestimmte Dokumente für die Verarbeitung durch Document AI bereitgestellt werden. In einem späteren Schritt wird gezeigt, wie ein ganzes Dokumentverzeichnis verarbeitet wird.

PDF in Cloud Storage hochladen

Die Methode batch_process_documents() akzeptiert derzeit Dateien aus Google Cloud Storage. Unter documentai_v1.types.BatchProcessRequest finden Sie weitere Informationen zur Objektstruktur.

In diesem Beispiel können Sie die Datei direkt aus unserem Beispiel-Bucket lesen.

Sie können die Datei auch mit gsutil in Ihren eigenen Bucket kopieren...

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

Oder Sie laden über den Link unten die Beispieldatei des Romans herunter und laden Sie sie in Ihren eigenen Bucket hoch.

Außerdem benötigen Sie einen GCS-Bucket, um die Ausgabe der API zu speichern.

In der Cloud Storage-Dokumentation finden Sie Informationen zum Erstellen von Storage-Buckets.

batch_process_documents()-Methode verwenden

Erstellen Sie eine Datei mit dem Namen batch_processing.py und verwenden Sie den Code unten.

Ersetzen Sie YOUR_PROJECT_ID, YOUR_PROCESSOR_LOCATION, YOUR_PROCESSOR_ID, YOUR_INPUT_URI und YOUR_OUTPUT_URI durch die entsprechenden Werte für Ihre Umgebung.

YOUR_INPUT_URI muss direkt auf die PDF-Datei verweisen. Beispiel: 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,
    )

Führen Sie den Code aus. Der vollständige neue Text sollte extrahiert und in Ihrer Konsole gedruckt werden.

Dies kann einige Zeit in Anspruch nehmen, da die Datei viel größer als im vorherigen Beispiel ist. (Oh, machen...)

Mit der Batch Processing API erhalten Sie jedoch eine Vorgangs-ID, mit der Sie die Ausgabe von GCS abrufen können, sobald die Aufgabe abgeschlossen ist.

Die Ausgabe sollte in etwa so aussehen:

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. Stapelverarbeitungsanfrage für ein Verzeichnis stellen

Manchmal möchten Sie vielleicht ein ganzes Verzeichnis von Dokumenten verarbeiten, ohne jedes Dokument einzeln auflisten zu müssen. Die Methode batch_process_documents() unterstützt die Eingabe einer Liste bestimmter Dokumente oder eines Verzeichnispfads.

In diesem Schritt wird gezeigt, wie ein vollständiges Verzeichnis der Dokumentdateien verarbeitet wird. Der größte Teil des Codes funktioniert genauso wie im vorherigen Schritt. Der einzige Unterschied ist der GCS-URI, der mit der BatchProcessRequest gesendet wird.

Wir haben ein Verzeichnis in unserer Beispiel-Gruppe, das mehrere Seiten des Romans in separaten Dateien enthält.

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

Sie können die Dateien direkt lesen oder in Ihren eigenen Cloud Storage-Bucket kopieren.

Führen Sie den Code aus dem vorherigen Schritt noch einmal aus und ersetzen Sie YOUR_INPUT_URI durch ein Verzeichnis in Cloud Storage.

Führen Sie den Code aus. Sie sollten den extrahierten Text aus allen Dokumentdateien im Cloud Storage-Verzeichnis sehen.

Die Ausgabe sollte in etwa so aussehen:

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. Batchverarbeitungsantwort mit Document AI Toolbox verarbeiten

Die Batchverarbeitung erfordert aufgrund der Einbindung von Cloud Storage eine Reihe von Schritten. Die Document-Ausgabe kann auch „fragmentiert“ sein in mehrere .json-Dateien aufteilen, je nach Größe des Eingabedokuments.

Das Python SDK Document AI Toolbox wurde entwickelt, um die Nachbearbeitung und andere häufige Aufgaben mit Document AI zu vereinfachen. Diese Bibliothek ist eine Ergänzung der Document AI-Clientbibliothek und kein Ersatz. Die vollständige Spezifikation finden Sie in der Referenzdokumentation.

In diesem Schritt wird gezeigt, wie Sie eine Batchverarbeitungsanfrage stellen und die Ausgabe mit der Document AI Toolbox abrufen.

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. Glückwunsch

Sie haben mithilfe von Document AI mithilfe von Onlineverarbeitung, Batchverarbeitung und der Document AI Toolbox Text aus einem Roman extrahiert.

Wir empfehlen Ihnen, mit anderen Dokumenten zu experimentieren und sich die anderen Prozessoren anzusehen, die auf der Plattform verfügbar sind.

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

  • Rufen Sie in der Cloud Console die Seite Ressourcen verwalten auf.
  • Wählen Sie Ihr Projekt in der Projektliste aus und klicken Sie auf „Löschen“.
  • Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie dann auf „Beenden“, um das Projekt zu löschen.

Weitere Informationen

In diesen Codelabs erfahren Sie mehr über Document AI.

Ressourcen

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.