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

1. Übersicht

Was ist Document AI?

Document AI ist eine Lösung zur Dokumentverarbeitung, die unstrukturierte Daten (z. B. Dokumente, E‑Mails, Rechnungen, Formulare usw.) leichter verständlich, analysierbar und nutzbar macht. Über die API stehen Funktionen wie Inhaltsklassifizierung, Entitätserkennung, erweiterte Suche und weitere Optionen zur Verfügung.

In diesem Lab erfahren Sie, wie Sie mit der Document AI API und Python die optische Zeichenerkennung durchführen.

Wir verwenden eine PDF-Datei des Klassikers „Winnie the Pooh“ von A. A. Milne (auf Englisch), der seit Kurzem in den Vereinigten Staaten frei von Urheberrechten ist. Diese Datei wurde von Google Books gescannt und digitalisiert.

Lerninhalte

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

Voraussetzungen

Umfrage

Wie werden Sie diese Anleitung verwenden?

Nur lesen Lesen und Übungen durchführen

Wie würden Sie Ihre Erfahrung mit Python bewerten?

Anfänger Mittelstufe Fortgeschrittene

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

Anfänger Mittelstufe Fortgeschritten

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten 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

Merken Sie sich die Projekt-ID, einen eindeutigen Namen für alle Google Cloud-Projekte. Die oben genannte Projekt-ID ist bereits vergeben und kann nicht verwendet werden. Sie müssen diese ID später als PROJECT_ID angeben.

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

Folgen Sie bitte der Anleitung im Abschnitt „Bereinigen“. In diesem Abschnitt erfahren Sie, wie Sie Ressourcen herunterfahren können, damit nach Abschluss dieser Anleitung keine Gebühren anfallen. Neue Nutzer von Google Cloud kommen für das Programm für den kostenlosen Testzeitraum mit einem Guthaben von 300$ infrage.

Cloud Shell starten

Sie können 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 die Cloud Shell zuvor noch nicht gestartet haben, wird ein Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter. So sieht dieses Fenster aus:

Cloud Shell – Einführung

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern. Cloud Shell

Mit der Cloud Shell erhalten Sie Terminalzugriff auf eine in der Cloud gehostete virtuelle Maschine. Die virtuelle Maschine enthält alle Entwicklungstools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in der 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 mit Document AI arbeiten können, müssen Sie die API aktivieren. Sie können dies über die gcloud-Befehlszeilenschnittstelle oder die Cloud Console erreichen.

gcloud CLI verwenden

  1. Wenn Sie Cloud Shell nicht verwenden, folgen Sie der Anleitung unter gcloud CLI 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 über die Suchleiste oben in der Console 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 Dokument-OCR-Prozessors erstellen, mit dem die Extraktion durchgeführt wird. 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Übersicht zu Document AI – Console auf.
  2. Klicken Sie auf Prozessoren ansehen und wählen Sie Dokument-OCR aus.Prozessoren
  3. Geben Sie dem Prozessor den Namen codelab-ocr (oder einen anderen Namen, den Sie sich merken können) 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 sie später in Ihrem Code verwenden. Prozessor-ID

Sie können Ihren Prozessor in der Console testen, indem Sie ein Dokument hochladen. Klicken Sie auf Testdokument hochladen und wählen Sie ein zu parsendes Dokument aus.

Laden Sie die PDF-Datei unten mit den ersten drei Seiten unseres Romans herunter.

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 müssen Sie ein Dienstkonto verwenden. Das Dienstkonto gehört zu Ihrem Projekt und wird von der Python-Clientbibliothek zum Ausführen von API-Anfragen verwendet. Wie jedes andere Nutzerkonto wird auch ein Dienstkonto durch eine E‑Mail-Adresse dargestellt. In diesem Abschnitt verwenden Sie das Cloud SDK, um ein Dienstkonto zu erstellen. Anschließend erstellen Sie die Anmeldedaten, die Sie für die Authentifizierung als Dienstkonto benötigen.

Öffnen Sie zuerst Cloud Shell und legen Sie mit Ihrem 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 auf die Document AI API zuzugreifen:

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

Als Nächstes gewähren 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, die der Python-Code verwendet, um sich mit dem neuen Dienstkonto anzumelden. 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 schließlich die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS fest, die von der Bibliothek verwendet wird, um Ihre Anmeldedaten zu finden. Weitere Informationen zu dieser Form der Authentifizierung finden Sie in diesem Leitfaden. Die Umgebungsvariable sollte auf den vollständigen Pfad der von Ihnen erstellten JSON-Datei mit den Anmeldedaten festgelegt werden:

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

6. Clientbibliothek installieren

Installieren Sie die Python-Clientbibliotheken für Document AI, Cloud Storage und die 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 mit den ersten drei Seiten des Romans.

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

Sie können sie auch mit 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. Onlineverarbeitungsanfrage stellen

In diesem Schritt verarbeiten Sie die ersten drei Seiten des Romans mit der API für die Onlineverarbeitung (synchron). Diese Methode eignet sich am besten für kleinere Dokumente, die lokal gespeichert sind. In der vollständigen Liste der Prozessoren finden Sie die maximale Anzahl von Seiten und die maximale Dateigröße 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 folgenden Code.

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. Der Text wird extrahiert und in der Console ausgegeben.

Wenn Sie unser Beispieldokument verwenden, sollte die folgende Ausgabe angezeigt werden:

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

Angenommen, Sie möchten den Text des gesamten Romans einlesen.

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

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

Bei der Batchverarbeitung werden Vorgänge mit langer Ausführungszeit verwendet, um Anfragen asynchron zu verwalten. Daher müssen wir die Anfrage anders stellen und die Ausgabe auf andere Weise abrufen als bei der Onlineverarbeitung. Die Ausgabe erfolgt jedoch unabhängig davon, ob Sie die Online- oder Batchverarbeitung verwenden, im selben Objektformat Document.

In diesem Schritt wird beschrieben, wie Sie bestimmte Dokumente für die Verarbeitung durch Document AI bereitstellen. In einem späteren Schritt wird gezeigt, wie Sie ein ganzes Verzeichnis mit Dokumenten verarbeiten.

PDF in Cloud Storage hochladen

Die Methode batch_process_documents() akzeptiert derzeit Dateien aus Google Cloud Storage. Weitere Informationen zur Objektstruktur finden Sie in der Referenz documentai_v1.types.BatchProcessRequest.

Für dieses 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/

Alternativ können Sie die Beispieldatei des Romans über den Link unten herunterladen und in Ihren eigenen Bucket hochladen.

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

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.

Achten Sie darauf, dass YOUR_INPUT_URI direkt auf die PDF-Datei verweist, z. B. 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 Romantext sollte extrahiert und in der Console ausgegeben werden.

Da die Datei viel größer als im vorherigen Beispiel ist, kann es einige Zeit dauern, bis der Vorgang abgeschlossen ist. (Ach, du lieber Himmel…)

Bei Verwendung der Batch Processing API erhalten Sie eine Vorgangs-ID, mit der Sie die Ausgabe aus 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. Batchverarbeitungsanfrage für ein Verzeichnis stellen

Vielleicht möchten Sie ein ganzes Verzeichnis mit Dokumenten verarbeiten, ohne jedes Dokument einzeln aufzulisten. Die Methode batch_process_documents() unterstützt die Eingabe einer Liste bestimmter Dokumente oder eines Verzeichnispfads.

In diesem Schritt wird gezeigt, wie Sie ein vollständiges Verzeichnis von Dokumentdateien verarbeiten. Der Großteil des Codes funktioniert genauso wie im vorherigen Schritt. Der einzige Unterschied ist der GCS-URI, der mit BatchProcessRequest gesendet wird.

In unserem Beispiel-Bucket befindet sich ein Verzeichnis, 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 der Document AI Toolbox verarbeiten

Die Batchverarbeitung erfordert aufgrund der Integration mit Cloud Storage einige Schritte. Die Document-Ausgabe kann je nach Größe des Eingabedokuments auch in mehrere .json-Dateien aufgeteilt werden.

Das Document AI Toolbox Python SDK wurde entwickelt, um die Nachbearbeitung und andere gängige Aufgaben mit Document AI zu vereinfachen. Diese Bibliothek soll die Document AI-Clientbibliothek ergänzen, nicht ersetzen. Die vollständige Spezifikation finden Sie in der Referenzdokumentation.

In diesem Schritt wird gezeigt, wie Sie mit der Document AI Toolbox eine Batchverarbeitungsanfrage stellen und die Ausgabe 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 mit Document AI erfolgreich Text aus einem Roman extrahiert. Dazu haben Sie die Onlineverarbeitung, die Batchverarbeitung und die Document AI Toolbox verwendet.

Wir empfehlen Ihnen, mit anderen Dokumenten zu experimentieren und die anderen auf der Plattform verfügbaren Prozessoren auszuprobieren.

Bereinigen

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

  • Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.
  • Wählen Sie in der Projektliste Ihr Projekt aus und klicken Sie auf „Löschen“.
  • Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie 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.