Detete texto em ficheiros (PDF/TIFF)

A API Vision pode detetar e transcrever texto de ficheiros PDF e TIFF armazenados no Cloud Storage.

A deteção de texto de documentos PDF e TIFF tem de ser pedida através da função files:asyncBatchAnnotate, que executa um pedido offline (assíncrono) e fornece o respetivo estado através dos recursos operations.

A saída de um pedido PDF/TIFF é escrita num ficheiro JSON criado no contentor do Cloud Storage especificado.

Limitações

A API Vision aceita ficheiros PDF/TIFF com até 2000 páginas. Os ficheiros maiores vão devolver um erro.

Autenticação

As chaves API não são suportadas para pedidos files:asyncBatchAnnotate. Consulte o artigo Usar uma conta de serviço para ver instruções sobre a autenticação com uma conta de serviço.

A conta usada para a autenticação tem de ter acesso ao contentor do Cloud Storage que especificar para a saída (roles/editor ou roles/storage.objectCreator ou superior).

Pode usar uma chave da API para consultar o estado da operação. Consulte as instruções em Usar uma chave da API.

Pedidos de deteção de texto em documentos

Atualmente, a deteção de documentos PDF/TIFF só está disponível para ficheiros armazenados em contentores do Cloud Storage. Os ficheiros JSON de resposta são guardados de forma semelhante num contentor do Cloud Storage.

Página PDF do censo dos EUA de 2010
gs://cloud-samples-data/vision/pdf_tiff/census2010.pdf, Fonte: United States Census Bureau.

REST

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • CLOUD_STORAGE_BUCKET: um contentor/diretório do Cloud Storage para guardar os ficheiros de saída, expresso no seguinte formato:
    • gs://bucket/directory/
    O utilizador que faz o pedido tem de ter autorização de escrita no contentor.
  • CLOUD_STORAGE_FILE_URI: o caminho para um ficheiro (PDF/TIFF) válido num contentor do Cloud Storage. Tem de ter, pelo menos, privilégios de leitura para o ficheiro. Exemplo:
    • gs://cloud-samples-data/vision/pdf_tiff/census2010.pdf
  • FEATURE_TYPE: um tipo de funcionalidade válido. Para pedidos files:asyncBatchAnnotate, pode usar os seguintes tipos de funcionalidades:
    • DOCUMENT_TEXT_DETECTION
    • TEXT_DETECTION
  • PROJECT_ID: o ID do seu Google Cloud projeto.

Considerações específicas do campo:

  • inputConfig: substitui o campo image usado noutros pedidos da API Vision. Contém dois campos secundários:
    • gcsSource.uri: o URI do Google Cloud Storage do ficheiro PDF ou TIFF (acessível ao utilizador ou à conta de serviço que está a fazer o pedido).
    • mimeType – um dos tipos de ficheiros aceites: application/pdf ou image/tiff.
  • outputConfig: especifica os detalhes da saída. Contém dois campos secundários:
    • gcsDestination.uri – um URI do Google Cloud Storage válido. O contentor tem de ser gravável pelo utilizador ou pela conta de serviço que está a fazer o pedido. O nome do ficheiro é output-x-to-y, em que x e y representam os números de páginas PDF/TIFF incluídos nesse ficheiro de saída. Se o ficheiro existir, o respetivo conteúdo é substituído.
    • batchSize - especifica quantas páginas de saída devem ser incluídas em cada ficheiro JSON de saída.

Método HTTP e URL:

POST https://vision.googleapis.com/v1/files:asyncBatchAnnotate

Corpo JSON do pedido:

{
  "requests":[
    {
      "inputConfig": {
        "gcsSource": {
          "uri": "CLOUD_STORAGE_FILE_URI"
        },
        "mimeType": "application/pdf"
      },
      "features": [
        {
          "type": "FEATURE_TYPE"
        }
      ],
      "outputConfig": {
        "gcsDestination": {
          "uri": "CLOUD_STORAGE_BUCKET"
        },
        "batchSize": 1
      }
    }
  ]
}

Para enviar o seu pedido, escolha uma destas opções:

curl

Guarde o corpo do pedido num ficheiro com o nome request.json, e execute o seguinte comando:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://vision.googleapis.com/v1/files:asyncBatchAnnotate"

PowerShell

Guarde o corpo do pedido num ficheiro com o nome request.json, e execute o seguinte comando:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/files:asyncBatchAnnotate" | Select-Object -Expand Content
Resposta:

Um pedido asyncBatchAnnotate bem-sucedido devolve uma resposta com um único campo de nome:

{
  "name": "projects/usable-auth-library/operations/1efec2285bd442df"
}

Este nome representa uma operação de longa duração com um ID associado (por exemplo, 1efec2285bd442df), que pode ser consultado através da API v1.operations.

Para obter a resposta de anotação do Vision, envie um pedido GET para o ponto final v1.operations, transmitindo o ID da operação no URL:

GET https://vision.googleapis.com/v1/operations/operation-id

Por exemplo:

curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
https://vision.googleapis.com/v1/projects/project-id/locations/location-id/operations/1efec2285bd442df

Se a operação estiver em curso:

{
  "name": "operations/1efec2285bd442df",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.vision.v1.OperationMetadata",
    "state": "RUNNING",
    "createTime": "2019-05-15T21:10:08.401917049Z",
    "updateTime": "2019-05-15T21:10:33.700763554Z"
  }
}

Quando a operação estiver concluída, o state é apresentado como DONE e os seus resultados são escritos no ficheiro do Google Cloud Storage especificado:

{
  "name": "operations/1efec2285bd442df",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.vision.v1.OperationMetadata",
    "state": "DONE",
    "createTime": "2019-05-15T20:56:30.622473785Z",
    "updateTime": "2019-05-15T20:56:41.666379749Z"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.vision.v1.AsyncBatchAnnotateFilesResponse",
    "responses": [
      {
        "outputConfig": {
          "gcsDestination": {
            "uri": "gs://your-bucket-name/folder/"
          },
          "batchSize": 1
        }
      }
    ]
  }
}

O JSON no seu ficheiro de saída é semelhante ao de um [pedido de deteção de texto de documentos](/vision/docs/ocr) de uma imagem, com a adição de um campo context que mostra a localização do PDF ou TIFF especificado e o número de páginas no ficheiro:

output-1-to-1.json

Go

Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do Vision usando bibliotecas cliente. Para mais informações, consulte a documentação de referência da API GoVision.

Para se autenticar no Vision, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.


// detectAsyncDocumentURI performs Optical Character Recognition (OCR) on a
// PDF file stored in GCS.
func detectAsyncDocumentURI(w io.Writer, gcsSourceURI, gcsDestinationURI string) error {
	ctx := context.Background()

	client, err := vision.NewImageAnnotatorClient(ctx)
	if err != nil {
		return err
	}

	request := &visionpb.AsyncBatchAnnotateFilesRequest{
		Requests: []*visionpb.AsyncAnnotateFileRequest{
			{
				Features: []*visionpb.Feature{
					{
						Type: visionpb.Feature_DOCUMENT_TEXT_DETECTION,
					},
				},
				InputConfig: &visionpb.InputConfig{
					GcsSource: &visionpb.GcsSource{Uri: gcsSourceURI},
					// Supported MimeTypes are: "application/pdf" and "image/tiff".
					MimeType: "application/pdf",
				},
				OutputConfig: &visionpb.OutputConfig{
					GcsDestination: &visionpb.GcsDestination{Uri: gcsDestinationURI},
					// How many pages should be grouped into each json output file.
					BatchSize: 2