<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="documentai_v1beta2.html">Cloud Document AI API</a> . <a href="documentai_v1beta2.projects.html">projects</a> . <a href="documentai_v1beta2.projects.documents.html">documents</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#batchProcess">batchProcess(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">LRO endpoint to batch process many documents. The output is written</p>
<p class="toc_element">
  <code><a href="#process">process(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Processes a single document.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="batchProcess">batchProcess(parent, body=None, x__xgafv=None)</code>
  <pre>LRO endpoint to batch process many documents. The output is written
to Cloud Storage as JSON in the [Document] format.

Args:
  parent: string, Target project and location to make a call.

Format: `projects/{project-id}/locations/{location-id}`.

If no location is specified, a region will be chosen automatically. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request to batch process documents as an asynchronous operation. The output
      # is written to Cloud Storage as JSON in the [Document] format.
    &quot;requests&quot;: [ # Required. Individual requests for each document.
      { # Request to process one document.
          &quot;ocrParams&quot;: { # Parameters to control Optical Character Recognition (OCR) behavior. # Controls OCR behavior. If not specified, the system will decide reasonable
              # defaults.
            &quot;languageHints&quot;: [ # List of languages to use for OCR. In most cases, an empty value
                # yields the best results since it enables automatic language detection. For
                # languages based on the Latin alphabet, setting `language_hints` is not
                # needed. In rare cases, when the language of the text in the image is known,
                # setting a hint will help get better results (although it will be a
                # significant hindrance if the hint is wrong). Document processing returns an
                # error if one or more of the specified languages is not one of the
                # supported languages.
              &quot;A String&quot;,
            ],
          },
          &quot;tableExtractionParams&quot;: { # Parameters to control table extraction behavior. # Controls table extraction behavior. If not specified, the system will
              # decide reasonable defaults.
            &quot;tableBoundHints&quot;: [ # Optional. Table bounding box hints that can be provided to complex cases
                # which our algorithm cannot locate the table(s) in.
              { # A hint for a table bounding box on the page for table parsing.
                &quot;pageNumber&quot;: 42, # Optional. Page number for multi-paged inputs this hint applies to. If not
                    # provided, this hint will apply to all pages by default. This value is
                    # 1-based.
                &quot;boundingBox&quot;: { # A bounding polygon for the detected image annotation. # Bounding box hint for a table on this page. The coordinates must be
                    # normalized to [0,1] and the bounding box must be an axis-aligned rectangle.
                  &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                    { # A vertex represents a 2D point in the image.
                        # NOTE: the normalized vertex coordinates are relative to the original image
                        # and range from 0 to 1.
                      &quot;x&quot;: 3.14, # X coordinate.
                      &quot;y&quot;: 3.14, # Y coordinate.
                    },
                  ],
                  &quot;vertices&quot;: [ # The bounding polygon vertices.
                    { # A vertex represents a 2D point in the image.
                        # NOTE: the vertex coordinates are in the same scale as the original image.
                      &quot;x&quot;: 42, # X coordinate.
                      &quot;y&quot;: 42, # Y coordinate.
                    },
                  ],
                },
              },
            ],
            &quot;headerHints&quot;: [ # Optional. Reserved for future use.
              &quot;A String&quot;,
            ],
            &quot;modelVersion&quot;: &quot;A String&quot;, # Model version of the table extraction system. Default is &quot;builtin/stable&quot;.
                # Specify &quot;builtin/latest&quot; for the latest model.
            &quot;enabled&quot;: True or False, # Whether to enable table extraction.
          },
          &quot;automlParams&quot;: { # Parameters to control AutoML model prediction behavior. # Controls AutoML model prediction behavior. AutoMlParams cannot be used
              # together with other Params.
            &quot;model&quot;: &quot;A String&quot;, # Resource name of the AutoML model.
                #
                # Format: `projects/{project-id}/locations/{location-id}/models/{model-id}`.
          },
          &quot;inputConfig&quot;: { # The desired input location and metadata. # Required. Information about the input file.
            &quot;gcsSource&quot;: { # The Google Cloud Storage location where the input file will be read from. # The Google Cloud Storage location to read the input from. This must be a
                # single file.
              &quot;uri&quot;: &quot;A String&quot;,
            },
            &quot;contents&quot;: &quot;A String&quot;, # Content in bytes, represented as a stream of bytes.
                # Note: As with all `bytes` fields, proto buffer messages use a pure binary
                # representation, whereas JSON representations use base64.
                #
                # This field only works for synchronous ProcessDocument method.
            &quot;mimeType&quot;: &quot;A String&quot;, # Required. Mimetype of the input. Current supported mimetypes are application/pdf,
                # image/tiff, and image/gif.
                # In addition, application/json type is supported for requests with
                # ProcessDocumentRequest.automl_params field set. The JSON file needs to
                # be in Document format.
          },
          &quot;formExtractionParams&quot;: { # Parameters to control form extraction behavior. # Controls form extraction behavior. If not specified, the system will
              # decide reasonable defaults.
            &quot;modelVersion&quot;: &quot;A String&quot;, # Model version of the form extraction system. Default is
                # &quot;builtin/stable&quot;. Specify &quot;builtin/latest&quot; for the latest model.
                # For custom form models, specify: “custom/{model_name}&quot;. Model name
                # format is &quot;bucket_name/path/to/modeldir&quot; corresponding to
                # &quot;gs://bucket_name/path/to/modeldir&quot; where annotated examples are stored.
            &quot;enabled&quot;: True or False, # Whether to enable form extraction.
            &quot;keyValuePairHints&quot;: [ # Reserved for future use.
              { # Reserved for future use.
                &quot;valueTypes&quot;: [ # Type of the value. This is case-insensitive, and could be one of:
                    # ADDRESS, LOCATION, ORGANIZATION, PERSON, PHONE_NUMBER,
                    # ID, NUMBER, EMAIL, PRICE, TERMS, DATE, NAME. Types not in this list will
                    # be ignored.
                  &quot;A String&quot;,
                ],
                &quot;key&quot;: &quot;A String&quot;, # The key text for the hint.
              },
            ],
          },
          &quot;documentType&quot;: &quot;A String&quot;, # Specifies a known document type for deeper structure detection. Valid
              # values are currently &quot;general&quot; and &quot;invoice&quot;. If not provided, &quot;general&quot;\
              # is used as default. If any other value is given, the request is rejected.
          &quot;parent&quot;: &quot;A String&quot;, # Target project and location to make a call.
              #
              # Format: `projects/{project-id}/locations/{location-id}`.
              #
              # If no location is specified, a region will be chosen automatically.
              # This field is only populated when used in ProcessDocument method.
          &quot;outputConfig&quot;: { # The desired output location and metadata. # The desired output location. This field is only needed in
              # BatchProcessDocumentsRequest.
            &quot;pagesPerShard&quot;: 42, # The max number of pages to include into each output Document shard JSON on
                # Google Cloud Storage.
                #
                # The valid range is [1, 100]. If not specified, the default value is 20.
                #
                # For example, for one pdf file with 100 pages, 100 parsed pages will be
                # produced. If `pages_per_shard` = 20, then 5 Document shard JSON files each
                # containing 20 parsed pages will be written under the prefix
                # OutputConfig.gcs_destination.uri and suffix pages-x-to-y.json where
                # x and y are 1-indexed page numbers.
                #
                # Example GCS outputs with 157 pages and pages_per_shard = 50:
                #
                # &lt;prefix&gt;pages-001-to-050.json
                # &lt;prefix&gt;pages-051-to-100.json
                # &lt;prefix&gt;pages-101-to-150.json
                # &lt;prefix&gt;pages-151-to-157.json
            &quot;gcsDestination&quot;: { # The Google Cloud Storage location where the output file will be written to. # The Google Cloud Storage location to write the output to.
              &quot;uri&quot;: &quot;A String&quot;,
            },
          },
          &quot;entityExtractionParams&quot;: { # Parameters to control entity extraction behavior. # Controls entity extraction behavior. If not specified, the system will
              # decide reasonable defaults.
            &quot;enabled&quot;: True or False, # Whether to enable entity extraction.
            &quot;modelVersion&quot;: &quot;A String&quot;, # Model version of the entity extraction. Default is
                # &quot;builtin/stable&quot;. Specify &quot;builtin/latest&quot; for the latest model.
          },
        },
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
    },
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
  }</pre>
</div>

<div class="method">
    <code class="details" id="process">process(parent, body=None, x__xgafv=None)</code>
  <pre>Processes a single document.

Args:
  parent: string, Target project and location to make a call.

Format: `projects/{project-id}/locations/{location-id}`.

If no location is specified, a region will be chosen automatically.
This field is only populated when used in ProcessDocument method. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request to process one document.
    &quot;ocrParams&quot;: { # Parameters to control Optical Character Recognition (OCR) behavior. # Controls OCR behavior. If not specified, the system will decide reasonable
        # defaults.
      &quot;languageHints&quot;: [ # List of languages to use for OCR. In most cases, an empty value
          # yields the best results since it enables automatic language detection. For
          # languages based on the Latin alphabet, setting `language_hints` is not
          # needed. In rare cases, when the language of the text in the image is known,
          # setting a hint will help get better results (although it will be a
          # significant hindrance if the hint is wrong). Document processing returns an
          # error if one or more of the specified languages is not one of the
          # supported languages.
        &quot;A String&quot;,
      ],
    },
    &quot;tableExtractionParams&quot;: { # Parameters to control table extraction behavior. # Controls table extraction behavior. If not specified, the system will
        # decide reasonable defaults.
      &quot;tableBoundHints&quot;: [ # Optional. Table bounding box hints that can be provided to complex cases
          # which our algorithm cannot locate the table(s) in.
        { # A hint for a table bounding box on the page for table parsing.
          &quot;pageNumber&quot;: 42, # Optional. Page number for multi-paged inputs this hint applies to. If not
              # provided, this hint will apply to all pages by default. This value is
              # 1-based.
          &quot;boundingBox&quot;: { # A bounding polygon for the detected image annotation. # Bounding box hint for a table on this page. The coordinates must be
              # normalized to [0,1] and the bounding box must be an axis-aligned rectangle.
            &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
              { # A vertex represents a 2D point in the image.
                  # NOTE: the normalized vertex coordinates are relative to the original image
                  # and range from 0 to 1.
                &quot;x&quot;: 3.14, # X coordinate.
                &quot;y&quot;: 3.14, # Y coordinate.
              },
            ],
            &quot;vertices&quot;: [ # The bounding polygon vertices.
              { # A vertex represents a 2D point in the image.
                  # NOTE: the vertex coordinates are in the same scale as the original image.
                &quot;x&quot;: 42, # X coordinate.
                &quot;y&quot;: 42, # Y coordinate.
              },
            ],
          },
        },
      ],
      &quot;headerHints&quot;: [ # Optional. Reserved for future use.
        &quot;A String&quot;,
      ],
      &quot;modelVersion&quot;: &quot;A String&quot;, # Model version of the table extraction system. Default is &quot;builtin/stable&quot;.
          # Specify &quot;builtin/latest&quot; for the latest model.
      &quot;enabled&quot;: True or False, # Whether to enable table extraction.
    },
    &quot;automlParams&quot;: { # Parameters to control AutoML model prediction behavior. # Controls AutoML model prediction behavior. AutoMlParams cannot be used
        # together with other Params.
      &quot;model&quot;: &quot;A String&quot;, # Resource name of the AutoML model.
          #
          # Format: `projects/{project-id}/locations/{location-id}/models/{model-id}`.
    },
    &quot;inputConfig&quot;: { # The desired input location and metadata. # Required. Information about the input file.
      &quot;gcsSource&quot;: { # The Google Cloud Storage location where the input file will be read from. # The Google Cloud Storage location to read the input from. This must be a
          # single file.
        &quot;uri&quot;: &quot;A String&quot;,
      },
      &quot;contents&quot;: &quot;A String&quot;, # Content in bytes, represented as a stream of bytes.
          # Note: As with all `bytes` fields, proto buffer messages use a pure binary
          # representation, whereas JSON representations use base64.
          #
          # This field only works for synchronous ProcessDocument method.
      &quot;mimeType&quot;: &quot;A String&quot;, # Required. Mimetype of the input. Current supported mimetypes are application/pdf,
          # image/tiff, and image/gif.
          # In addition, application/json type is supported for requests with
          # ProcessDocumentRequest.automl_params field set. The JSON file needs to
          # be in Document format.
    },
    &quot;formExtractionParams&quot;: { # Parameters to control form extraction behavior. # Controls form extraction behavior. If not specified, the system will
        # decide reasonable defaults.
      &quot;modelVersion&quot;: &quot;A String&quot;, # Model version of the form extraction system. Default is
          # &quot;builtin/stable&quot;. Specify &quot;builtin/latest&quot; for the latest model.
          # For custom form models, specify: “custom/{model_name}&quot;. Model name
          # format is &quot;bucket_name/path/to/modeldir&quot; corresponding to
          # &quot;gs://bucket_name/path/to/modeldir&quot; where annotated examples are stored.
      &quot;enabled&quot;: True or False, # Whether to enable form extraction.
      &quot;keyValuePairHints&quot;: [ # Reserved for future use.
        { # Reserved for future use.
          &quot;valueTypes&quot;: [ # Type of the value. This is case-insensitive, and could be one of:
              # ADDRESS, LOCATION, ORGANIZATION, PERSON, PHONE_NUMBER,
              # ID, NUMBER, EMAIL, PRICE, TERMS, DATE, NAME. Types not in this list will
              # be ignored.
            &quot;A String&quot;,
          ],
          &quot;key&quot;: &quot;A String&quot;, # The key text for the hint.
        },
      ],
    },
    &quot;documentType&quot;: &quot;A String&quot;, # Specifies a known document type for deeper structure detection. Valid
        # values are currently &quot;general&quot; and &quot;invoice&quot;. If not provided, &quot;general&quot;\
        # is used as default. If any other value is given, the request is rejected.
    &quot;parent&quot;: &quot;A String&quot;, # Target project and location to make a call.
        # 
        # Format: `projects/{project-id}/locations/{location-id}`.
        # 
        # If no location is specified, a region will be chosen automatically.
        # This field is only populated when used in ProcessDocument method.
    &quot;outputConfig&quot;: { # The desired output location and metadata. # The desired output location. This field is only needed in
        # BatchProcessDocumentsRequest.
      &quot;pagesPerShard&quot;: 42, # The max number of pages to include into each output Document shard JSON on
          # Google Cloud Storage.
          #
          # The valid range is [1, 100]. If not specified, the default value is 20.
          #
          # For example, for one pdf file with 100 pages, 100 parsed pages will be
          # produced. If `pages_per_shard` = 20, then 5 Document shard JSON files each
          # containing 20 parsed pages will be written under the prefix
          # OutputConfig.gcs_destination.uri and suffix pages-x-to-y.json where
          # x and y are 1-indexed page numbers.
          #
          # Example GCS outputs with 157 pages and pages_per_shard = 50:
          #
          # &lt;prefix&gt;pages-001-to-050.json
          # &lt;prefix&gt;pages-051-to-100.json
          # &lt;prefix&gt;pages-101-to-150.json
          # &lt;prefix&gt;pages-151-to-157.json
      &quot;gcsDestination&quot;: { # The Google Cloud Storage location where the output file will be written to. # The Google Cloud Storage location to write the output to.
        &quot;uri&quot;: &quot;A String&quot;,
      },
    },
    &quot;entityExtractionParams&quot;: { # Parameters to control entity extraction behavior. # Controls entity extraction behavior. If not specified, the system will
        # decide reasonable defaults.
      &quot;enabled&quot;: True or False, # Whether to enable entity extraction.
      &quot;modelVersion&quot;: &quot;A String&quot;, # Model version of the entity extraction. Default is
          # &quot;builtin/stable&quot;. Specify &quot;builtin/latest&quot; for the latest model.
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Document represents the canonical document resource in Document Understanding
      # AI.
      # It is an interchange format that provides insights into documents and allows
      # for collaboration between users and Document Understanding AI to iterate and
      # optimize for quality.
    &quot;content&quot;: &quot;A String&quot;, # Inline document content, represented as a stream of bytes.
        # Note: As with all `bytes` fields, protobuffers use a pure binary
        # representation, whereas JSON representations use base64.
    &quot;labels&quot;: [ # Labels for this document.
      { # Label attaches schema information and/or other metadata to segments within
          # a Document. Multiple Labels on a single field can denote either
          # different labels, different instances of the same label created at
          # different times, or some combination of both.
        &quot;automlModel&quot;: &quot;A String&quot;, # Label is generated AutoML model. This field stores the full resource
            # name of the AutoML model.
            #
            # Format:
            # `projects/{project-id}/locations/{location-id}/models/{model-id}`
        &quot;confidence&quot;: 3.14, # Confidence score between 0 and 1 for label assignment.
        &quot;name&quot;: &quot;A String&quot;, # Name of the label.
            #
            # When the label is generated from AutoML Text Classification model, this
            # field represents the name of the category.
      },
    ],
    &quot;uri&quot;: &quot;A String&quot;, # Currently supports Google Cloud Storage URI of the form
        #    `gs://bucket_name/object_name`. Object versioning is not supported.
        #    See [Google Cloud Storage Request
        #    URIs](https://cloud.google.com/storage/docs/reference-uris) for more
        #    info.
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # Any error that occurred while processing this document.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
    },
    &quot;pages&quot;: [ # Visual page layout for the Document.
      { # A page in a Document.
        &quot;dimension&quot;: { # Dimension for the page. # Physical dimension of the page.
          &quot;width&quot;: 3.14, # Page width.
          &quot;height&quot;: 3.14, # Page height.
          &quot;unit&quot;: &quot;A String&quot;, # Dimension unit.
        },
        &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
          { # Detected language for a structural component.
            &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                # information, see
                # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
            &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
          },
        ],
        &quot;tables&quot;: [ # A list of visually detected tables on the page.
          { # A table representation similar to HTML table structure.
            &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for Table.
              &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
              &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the normalized vertex coordinates are relative to the original image
                      # and range from 0 to 1.
                    &quot;x&quot;: 3.14, # X coordinate.
                    &quot;y&quot;: 3.14, # Y coordinate.
                  },
                ],
                &quot;vertices&quot;: [ # The bounding polygon vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the vertex coordinates are in the same scale as the original image.
                    &quot;x&quot;: 42, # X coordinate.
                    &quot;y&quot;: 42, # Y coordinate.
                  },
                ],
              },
              &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                  # layout is for. e.g. confidence can be for a single token, a table,
                  # a visual element, etc. depending on context. Range [0, 1].
              &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                &quot;textSegments&quot;: [ # The text segments from the Document.text.
                  { # A text segment in the Document.text. The indices may be out of bounds
                      # which indicate that the text extends into another document shard for
                      # large sharded documents. See ShardInfo.text_offset
                    &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                    &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                        # Document.text.
                  },
                ],
              },
            },
            &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
              { # Detected language for a structural component.
                &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                    # information, see
                    # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
              },
            ],
            &quot;bodyRows&quot;: [ # Body rows of the table.
              { # A row of table cells.
                &quot;cells&quot;: [ # Cells that make up this row.
                  { # A cell representation inside the table.
                    &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
                      { # Detected language for a structural component.
                        &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                            # information, see
                            # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                        &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
                      },
                    ],
                    &quot;rowSpan&quot;: 42, # How many rows this cell spans.
                    &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for TableCell.
                      &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
                      &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                        &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                          { # A vertex represents a 2D point in the image.
                              # NOTE: the normalized vertex coordinates are relative to the original image
                              # and range from 0 to 1.
                            &quot;x&quot;: 3.14, # X coordinate.
                            &quot;y&quot;: 3.14, # Y coordinate.
                          },
                        ],
                        &quot;vertices&quot;: [ # The bounding polygon vertices.
                          { # A vertex represents a 2D point in the image.
                              # NOTE: the vertex coordinates are in the same scale as the original image.
                            &quot;x&quot;: 42, # X coordinate.
                            &quot;y&quot;: 42, # Y coordinate.
                          },
                        ],
                      },
                      &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                          # layout is for. e.g. confidence can be for a single token, a table,
                          # a visual element, etc. depending on context. Range [0, 1].
                      &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                        &quot;textSegments&quot;: [ # The text segments from the Document.text.
                          { # A text segment in the Document.text. The indices may be out of bounds
                              # which indicate that the text extends into another document shard for
                              # large sharded documents. See ShardInfo.text_offset
                            &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                            &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                                # Document.text.
                          },
                        ],
                      },
                    },
                    &quot;colSpan&quot;: 42, # How many columns this cell spans.
                  },
                ],
              },
            ],
            &quot;headerRows&quot;: [ # Header rows of the table.
              { # A row of table cells.
                &quot;cells&quot;: [ # Cells that make up this row.
                  { # A cell representation inside the table.
                    &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
                      { # Detected language for a structural component.
                        &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                            # information, see
                            # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                        &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
                      },
                    ],
                    &quot;rowSpan&quot;: 42, # How many rows this cell spans.
                    &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for TableCell.
                      &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
                      &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                        &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                          { # A vertex represents a 2D point in the image.
                              # NOTE: the normalized vertex coordinates are relative to the original image
                              # and range from 0 to 1.
                            &quot;x&quot;: 3.14, # X coordinate.
                            &quot;y&quot;: 3.14, # Y coordinate.
                          },
                        ],
                        &quot;vertices&quot;: [ # The bounding polygon vertices.
                          { # A vertex represents a 2D point in the image.
                              # NOTE: the vertex coordinates are in the same scale as the original image.
                            &quot;x&quot;: 42, # X coordinate.
                            &quot;y&quot;: 42, # Y coordinate.
                          },
                        ],
                      },
                      &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                          # layout is for. e.g. confidence can be for a single token, a table,
                          # a visual element, etc. depending on context. Range [0, 1].
                      &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                        &quot;textSegments&quot;: [ # The text segments from the Document.text.
                          { # A text segment in the Document.text. The indices may be out of bounds
                              # which indicate that the text extends into another document shard for
                              # large sharded documents. See ShardInfo.text_offset
                            &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                            &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                                # Document.text.
                          },
                        ],
                      },
                    },
                    &quot;colSpan&quot;: 42, # How many columns this cell spans.
                  },
                ],
              },
            ],
          },
        ],
        &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for the page.
          &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
          &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
            &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
              { # A vertex represents a 2D point in the image.
                  # NOTE: the normalized vertex coordinates are relative to the original image
                  # and range from 0 to 1.
                &quot;x&quot;: 3.14, # X coordinate.
                &quot;y&quot;: 3.14, # Y coordinate.
              },
            ],
            &quot;vertices&quot;: [ # The bounding polygon vertices.
              { # A vertex represents a 2D point in the image.
                  # NOTE: the vertex coordinates are in the same scale as the original image.
                &quot;x&quot;: 42, # X coordinate.
                &quot;y&quot;: 42, # Y coordinate.
              },
            ],
          },
          &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
              # layout is for. e.g. confidence can be for a single token, a table,
              # a visual element, etc. depending on context. Range [0, 1].
          &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
            &quot;textSegments&quot;: [ # The text segments from the Document.text.
              { # A text segment in the Document.text. The indices may be out of bounds
                  # which indicate that the text extends into another document shard for
                  # large sharded documents. See ShardInfo.text_offset
                &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                    # Document.text.
              },
            ],
          },
        },
        &quot;lines&quot;: [ # A list of visually detected text lines on the page.
            # A collection of tokens that a human would perceive as a line.
          { # A collection of tokens that a human would perceive as a line.
              # Does not cross column boundaries, can be horizontal, vertical, etc.
            &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for Line.
              &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
              &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the normalized vertex coordinates are relative to the original image
                      # and range from 0 to 1.
                    &quot;x&quot;: 3.14, # X coordinate.
                    &quot;y&quot;: 3.14, # Y coordinate.
                  },
                ],
                &quot;vertices&quot;: [ # The bounding polygon vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the vertex coordinates are in the same scale as the original image.
                    &quot;x&quot;: 42, # X coordinate.
                    &quot;y&quot;: 42, # Y coordinate.
                  },
                ],
              },
              &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                  # layout is for. e.g. confidence can be for a single token, a table,
                  # a visual element, etc. depending on context. Range [0, 1].
              &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                &quot;textSegments&quot;: [ # The text segments from the Document.text.
                  { # A text segment in the Document.text. The indices may be out of bounds
                      # which indicate that the text extends into another document shard for
                      # large sharded documents. See ShardInfo.text_offset
                    &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                    &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                        # Document.text.
                  },
                ],
              },
            },
            &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
              { # Detected language for a structural component.
                &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                    # information, see
                    # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
              },
            ],
          },
        ],
        &quot;paragraphs&quot;: [ # A list of visually detected text paragraphs on the page.
            # A collection of lines that a human would perceive as a paragraph.
          { # A collection of lines that a human would perceive as a paragraph.
            &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
              { # Detected language for a structural component.
                &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                    # information, see
                    # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
              },
            ],
            &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for Paragraph.
              &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
              &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the normalized vertex coordinates are relative to the original image
                      # and range from 0 to 1.
                    &quot;x&quot;: 3.14, # X coordinate.
                    &quot;y&quot;: 3.14, # Y coordinate.
                  },
                ],
                &quot;vertices&quot;: [ # The bounding polygon vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the vertex coordinates are in the same scale as the original image.
                    &quot;x&quot;: 42, # X coordinate.
                    &quot;y&quot;: 42, # Y coordinate.
                  },
                ],
              },
              &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                  # layout is for. e.g. confidence can be for a single token, a table,
                  # a visual element, etc. depending on context. Range [0, 1].
              &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                &quot;textSegments&quot;: [ # The text segments from the Document.text.
                  { # A text segment in the Document.text. The indices may be out of bounds
                      # which indicate that the text extends into another document shard for
                      # large sharded documents. See ShardInfo.text_offset
                    &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                    &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                        # Document.text.
                  },
                ],
              },
            },
          },
        ],
        &quot;formFields&quot;: [ # A list of visually detected form fields on the page.
          { # A form field detected on the page.
            &quot;valueType&quot;: &quot;A String&quot;, # If the value is non-textual, this field represents the type. Current
                # valid values are:
                # - blank (this indicates the field_value is normal text)
                # - &quot;unfilled_checkbox&quot;
                # - &quot;filled_checkbox&quot;
            &quot;fieldName&quot;: { # Visual element describing a layout unit on a page. # Layout for the FormField name. e.g. `Address`, `Email`,
                # `Grand total`, `Phone number`, etc.
              &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
              &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the normalized vertex coordinates are relative to the original image
                      # and range from 0 to 1.
                    &quot;x&quot;: 3.14, # X coordinate.
                    &quot;y&quot;: 3.14, # Y coordinate.
                  },
                ],
                &quot;vertices&quot;: [ # The bounding polygon vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the vertex coordinates are in the same scale as the original image.
                    &quot;x&quot;: 42, # X coordinate.
                    &quot;y&quot;: 42, # Y coordinate.
                  },
                ],
              },
              &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                  # layout is for. e.g. confidence can be for a single token, a table,
                  # a visual element, etc. depending on context. Range [0, 1].
              &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                &quot;textSegments&quot;: [ # The text segments from the Document.text.
                  { # A text segment in the Document.text. The indices may be out of bounds
                      # which indicate that the text extends into another document shard for
                      # large sharded documents. See ShardInfo.text_offset
                    &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                    &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                        # Document.text.
                  },
                ],
              },
            },
            &quot;nameDetectedLanguages&quot;: [ # A list of detected languages for name together with confidence.
              { # Detected language for a structural component.
                &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                    # information, see
                    # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
              },
            ],
            &quot;valueDetectedLanguages&quot;: [ # A list of detected languages for value together with confidence.
              { # Detected language for a structural component.
                &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                    # information, see
                    # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
              },
            ],
            &quot;fieldValue&quot;: { # Visual element describing a layout unit on a page. # Layout for the FormField value.
              &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
              &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the normalized vertex coordinates are relative to the original image
                      # and range from 0 to 1.
                    &quot;x&quot;: 3.14, # X coordinate.
                    &quot;y&quot;: 3.14, # Y coordinate.
                  },
                ],
                &quot;vertices&quot;: [ # The bounding polygon vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the vertex coordinates are in the same scale as the original image.
                    &quot;x&quot;: 42, # X coordinate.
                    &quot;y&quot;: 42, # Y coordinate.
                  },
                ],
              },
              &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                  # layout is for. e.g. confidence can be for a single token, a table,
                  # a visual element, etc. depending on context. Range [0, 1].
              &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                &quot;textSegments&quot;: [ # The text segments from the Document.text.
                  { # A text segment in the Document.text. The indices may be out of bounds
                      # which indicate that the text extends into another document shard for
                      # large sharded documents. See ShardInfo.text_offset
                    &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                    &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                        # Document.text.
                  },
                ],
              },
            },
          },
        ],
        &quot;blocks&quot;: [ # A list of visually detected text blocks on the page.
            # A block has a set of lines (collected into paragraphs) that have a common
            # line-spacing and orientation.
          { # A block has a set of lines (collected into paragraphs) that have a
              # common line-spacing and orientation.
            &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for Block.
              &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
              &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the normalized vertex coordinates are relative to the original image
                      # and range from 0 to 1.
                    &quot;x&quot;: 3.14, # X coordinate.
                    &quot;y&quot;: 3.14, # Y coordinate.
                  },
                ],
                &quot;vertices&quot;: [ # The bounding polygon vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the vertex coordinates are in the same scale as the original image.
                    &quot;x&quot;: 42, # X coordinate.
                    &quot;y&quot;: 42, # Y coordinate.
                  },
                ],
              },
              &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                  # layout is for. e.g. confidence can be for a single token, a table,
                  # a visual element, etc. depending on context. Range [0, 1].
              &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                &quot;textSegments&quot;: [ # The text segments from the Document.text.
                  { # A text segment in the Document.text. The indices may be out of bounds
                      # which indicate that the text extends into another document shard for
                      # large sharded documents. See ShardInfo.text_offset
                    &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                    &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                        # Document.text.
                  },
                ],
              },
            },
            &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
              { # Detected language for a structural component.
                &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                    # information, see
                    # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
              },
            ],
          },
        ],
        &quot;tokens&quot;: [ # A list of visually detected tokens on the page.
          { # A detected token.
            &quot;detectedBreak&quot;: { # Detected break at the end of a Token. # Detected break at the end of a Token.
              &quot;type&quot;: &quot;A String&quot;, # Detected break type.
            },
            &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
              { # Detected language for a structural component.
                &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                    # information, see
                    # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
              },
            ],
            &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for Token.
              &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
              &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the normalized vertex coordinates are relative to the original image
                      # and range from 0 to 1.
                    &quot;x&quot;: 3.14, # X coordinate.
                    &quot;y&quot;: 3.14, # Y coordinate.
                  },
                ],
                &quot;vertices&quot;: [ # The bounding polygon vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the vertex coordinates are in the same scale as the original image.
                    &quot;x&quot;: 42, # X coordinate.
                    &quot;y&quot;: 42, # Y coordinate.
                  },
                ],
              },
              &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                  # layout is for. e.g. confidence can be for a single token, a table,
                  # a visual element, etc. depending on context. Range [0, 1].
              &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                &quot;textSegments&quot;: [ # The text segments from the Document.text.
                  { # A text segment in the Document.text. The indices may be out of bounds
                      # which indicate that the text extends into another document shard for
                      # large sharded documents. See ShardInfo.text_offset
                    &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                    &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                        # Document.text.
                  },
                ],
              },
            },
          },
        ],
        &quot;pageNumber&quot;: 42, # 1-based index for current Page in a parent Document.
            # Useful when a page is taken out of a Document for individual
            # processing.
        &quot;visualElements&quot;: [ # A list of detected non-text visual elements e.g. checkbox,
            # signature etc. on the page.
          { # Detected non-text visual elements e.g. checkbox, signature etc. on the
              # page.
            &quot;detectedLanguages&quot;: [ # A list of detected languages together with confidence.
              { # Detected language for a structural component.
                &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
                    # information, see
                    # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
                &quot;confidence&quot;: 3.14, # Confidence of detected language. Range [0, 1].
              },
            ],
            &quot;type&quot;: &quot;A String&quot;, # Type of the VisualElement.
            &quot;layout&quot;: { # Visual element describing a layout unit on a page. # Layout for VisualElement.
              &quot;orientation&quot;: &quot;A String&quot;, # Detected orientation for the Layout.
              &quot;boundingPoly&quot;: { # A bounding polygon for the detected image annotation. # The bounding polygon for the Layout.
                &quot;normalizedVertices&quot;: [ # The bounding polygon normalized vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the normalized vertex coordinates are relative to the original image
                      # and range from 0 to 1.
                    &quot;x&quot;: 3.14, # X coordinate.
                    &quot;y&quot;: 3.14, # Y coordinate.
                  },
                ],
                &quot;vertices&quot;: [ # The bounding polygon vertices.
                  { # A vertex represents a 2D point in the image.
                      # NOTE: the vertex coordinates are in the same scale as the original image.
                    &quot;x&quot;: 42, # X coordinate.
                    &quot;y&quot;: 42, # Y coordinate.
                  },
                ],
              },
              &quot;confidence&quot;: 3.14, # Confidence of the current Layout within context of the object this
                  # layout is for. e.g. confidence can be for a single token, a table,
                  # a visual element, etc. depending on context. Range [0, 1].
              &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
                &quot;textSegments&quot;: [ # The text segments from the Document.text.
                  { # A text segment in the Document.text. The indices may be out of bounds
                      # which indicate that the text extends into another document shard for
                      # large sharded documents. See ShardInfo.text_offset
                    &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
                    &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                        # Document.text.
                  },
                ],
              },
            },
          },
        ],
      },
    ],
    &quot;text&quot;: &quot;A String&quot;, # UTF-8 encoded text in reading order from the document.
    &quot;mimeType&quot;: &quot;A String&quot;, # An IANA published MIME type (also referred to as media type). For more
        # information, see
        # https://www.iana.org/assignments/media-types/media-types.xhtml.
    &quot;entityRelations&quot;: [ # Relationship among Document.entities.
      { # Relationship between Entities.
        &quot;objectId&quot;: &quot;A String&quot;, # Object entity id.
        &quot;relation&quot;: &quot;A String&quot;, # Relationship description.
        &quot;subjectId&quot;: &quot;A String&quot;, # Subject entity id.
      },
    ],
    &quot;translations&quot;: [ # A list of translations on Document.text. For document shards,
        # translations in this list may cross shard boundaries.
      { # A translation of the text segment.
        &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Provenance of the translation.
            # Text anchor indexing into the Document.text.
          &quot;textSegments&quot;: [ # The text segments from the Document.text.
            { # A text segment in the Document.text. The indices may be out of bounds
                # which indicate that the text extends into another document shard for
                # large sharded documents. See ShardInfo.text_offset
              &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
              &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                  # Document.text.
            },
          ],
        },
        &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code, such as &quot;en-US&quot; or &quot;sr-Latn&quot;. For more
            # information, see
            # http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
        &quot;translatedText&quot;: &quot;A String&quot;, # Text translated into the target language.
      },
    ],
    &quot;shardInfo&quot;: { # For a large document, sharding may be performed to produce several # Information about the sharding if this document is sharded part of a larger
        # document. If the document is not sharded, this message is not specified.
        # document shards. Each document shard contains this field to detail which
        # shard it is.
      &quot;shardIndex&quot;: &quot;A String&quot;, # The 0-based index of this shard.
      &quot;textOffset&quot;: &quot;A String&quot;, # The index of the first character in Document.text in the overall
          # document global text.
      &quot;shardCount&quot;: &quot;A String&quot;, # Total number of shards.
    },
    &quot;textStyles&quot;: [ # Styles for the Document.text.
      { # Annotation for common text style attributes. This adheres to CSS
          # conventions as much as possible.
        &quot;fontWeight&quot;: &quot;A String&quot;, # Font weight. Possible values are normal, bold, bolder, and lighter.
            # https://www.w3schools.com/cssref/pr_font_weight.asp
        &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Text anchor indexing into the Document.text.
          &quot;textSegments&quot;: [ # The text segments from the Document.text.
            { # A text segment in the Document.text. The indices may be out of bounds
                # which indicate that the text extends into another document shard for
                # large sharded documents. See ShardInfo.text_offset
              &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
              &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                  # Document.text.
            },
          ],
        },
        &quot;textDecoration&quot;: &quot;A String&quot;, # Text decoration. Follows CSS standard.
            # &lt;text-decoration-line&gt; &lt;text-decoration-color&gt; &lt;text-decoration-style&gt;
            # https://www.w3schools.com/cssref/pr_text_text-decoration.asp
        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # Text color.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
            #
            # Note: this proto does not carry information about the absolute color space
            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
            # space.
            #
            # Note: when color equality needs to be decided, implementations, unless
            # documented otherwise, will treat two colors to be equal if all their red,
            # green, blue and alpha values each differ by at most 1e-5.
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
            #            return nil;
            #          }
            #          Color* result = [[Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha &lt;= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = [&#x27;#&#x27;];
            #       for (var i = 0; i &lt; missingZeros; i++) {
            #          resultBuilder.push(&#x27;0&#x27;);
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join(&#x27;&#x27;);
            #     };
            #
            #     // ...
          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
        },
        &quot;fontSize&quot;: { # Font size with unit. # Font size.
          &quot;size&quot;: 3.14, # Font size for the text.
          &quot;unit&quot;: &quot;A String&quot;, # Unit for the font size. Follows CSS naming (in, px, pt, etc.).
        },
        &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Text background color.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
            #
            # Note: this proto does not carry information about the absolute color space
            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
            # space.
            #
            # Note: when color equality needs to be decided, implementations, unless
            # documented otherwise, will treat two colors to be equal if all their red,
            # green, blue and alpha values each differ by at most 1e-5.
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
            #            return nil;
            #          }
            #          Color* result = [[Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha &lt;= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = [&#x27;#&#x27;];
            #       for (var i = 0; i &lt; missingZeros; i++) {
            #          resultBuilder.push(&#x27;0&#x27;);
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join(&#x27;&#x27;);
            #     };
            #
            #     // ...
          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
        },
        &quot;textStyle&quot;: &quot;A String&quot;, # Text style. Possible values are normal, italic, and oblique.
            # https://www.w3schools.com/cssref/pr_font_font-style.asp
      },
    ],
    &quot;entities&quot;: [ # A list of entities detected on Document.text. For document shards,
        # entities in this list may cross shard boundaries.
      { # A phrase in the text that is a known entity type, such as a person, an
          # organization, or location.
        &quot;textAnchor&quot;: { # Text reference indexing into the Document.text. # Provenance of the entity.
            # Text anchor indexing into the Document.text.
          &quot;textSegments&quot;: [ # The text segments from the Document.text.
            { # A text segment in the Document.text. The indices may be out of bounds
                # which indicate that the text extends into another document shard for
                # large sharded documents. See ShardInfo.text_offset
              &quot;startIndex&quot;: &quot;A String&quot;, # TextSegment start UTF-8 char index in the Document.text.
              &quot;endIndex&quot;: &quot;A String&quot;, # TextSegment half open end UTF-8 char index in the
                  # Document.text.
            },
          ],
        },
        &quot;mentionId&quot;: &quot;A String&quot;, # Deprecated.  Use `id` field instead.
        &quot;type&quot;: &quot;A String&quot;, # Entity type from a schema e.g. `Address`.
        &quot;confidence&quot;: 3.14, # Optional. Confidence of detected Schema entity. Range [0, 1].
        &quot;mentionText&quot;: &quot;A String&quot;, # Text value in the document e.g. `1600 Amphitheatre Pkwy`.
      },
    ],
  }</pre>
</div>

</body></html>