Detectar texto em arquivos (PDF/TIFF)

Com a API Vision, é possível detectar e transcrever textos de arquivos PDF e TIFF armazenados no Cloud Storage.

Solicite a detecção de texto em documentos de PDF e TIFF usando a função files:asyncBatchAnnotate, que executa uma solicitação off-line (assíncrona) e fornece o status usando recursos operations.

A saída de uma solicitação em PDF/TIFF é gravada em um arquivo JSON criado no bucket do Cloud Storage especificado.

Limitações

A API Vision aceita arquivos PDF/TIFF de até 2.000 páginas. Arquivos maiores retornam um erro.

Autenticação

As chaves de API não são compatíveis com solicitações files:asyncBatchAnnotate. Consulte Como usar uma conta de serviço para receber instruções sobre a autenticação com uma conta de serviço.

A conta usada para autenticação precisa ter acesso ao bucket do Cloud Storage especificado para a saída (roles/editor, roles/storage.objectCreator ou superior).

É possível usar uma chave de API para consultar o status da operação. Para ver instruções, consulte Como usar uma chave de API.

Solicitações de detecção de texto em documento

No momento, a detecção de documentos em PDF/TIFF está disponível apenas para arquivos armazenados em buckets do Cloud Storage. Os arquivos JSON de resposta são salvos de maneira semelhante em um bucket do Cloud Storage.

Página com o PDF do censo de 2010 dos EUA
gs://cloud-samples-data/vision/pdf_tiff/census2010.pdf, Source: United States Census Bureau (em inglês).

REST

Antes de usar os dados da solicitação, faça as seguintes substituições:

  • CLOUD_STORAGE_BUCKET: um bucket/diretório do Cloud Storage para salvar arquivos de saída, expresso no seguinte formato
    • gs://bucket/directory/
    O usuário solicitante precisa ter permissão de gravação no bucket.
  • CLOUD_STORAGE_FILE_URI: o caminho para um arquivo válido (PDF/TIFF) em um bucket do Cloud Storage. Você precisa ter, pelo menos, privilégios de leitura para o arquivo. Exemplo:
    • gs://cloud-samples-data/vision/pdf_tiff/census2010.pdf
  • FEATURE_TYPE: um tipo de recurso válido. Para solicitações files:asyncBatchAnnotate, use os seguintes tipos de recursos
    • DOCUMENT_TEXT_DETECTION
    • TEXT_DETECTION
  • PROJECT_ID: o ID do projeto do Google Cloud .

Considerações específicas de campo:

  • inputConfig: substitui o campo image usado em outras solicitações da API do Vision. Contém dois campos filhos:
    • gcsSource.uri: o URI do Google Cloud Storage do arquivo PDF ou TIFF (acessível ao usuário ou à conta de serviço que faz a solicitação).
    • mimeType: um dos tipos de arquivo aceitos (application/pdf ou image/tiff)
  • outputConfig: especifica os detalhes de saída. Contém dois campos filhos:
    • gcsDestination.uri: um URI válido do Google Cloud Storage. O bucket precisa ser gravável pelo usuário ou pela conta de serviço que faz a solicitação. O nome do arquivo será output-x-to-y, em que x e y representam os números de páginas em PDF/TIFF incluídos nesse arquivo de saída. Se o arquivo existir, o conteúdo dele será sobrescrito.
    • batchSize: especifica quantas páginas de saída precisam ser incluídas em cada arquivo JSON de saída.

Método HTTP e URL:

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

Corpo JSON da solicitação:

{
  "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 a solicitação, escolha uma destas opções:

curl

Salve o corpo da solicitação em um arquivo com o nome request.json e execute o comando abaixo:

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

Salve o corpo da solicitação em um arquivo com o nome request.json e execute o comando abaixo:

$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

Uma solicitação asyncBatchAnnotate bem-sucedida retorna uma resposta com um único campo de nome:

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

Esse nome representa uma operação de longa duração com um ID associado (por exemplo, 1efec2285bd442df), que pode ser consultado usando a API v1.operations.

Para recuperar a resposta de anotação do Vision, envie uma solicitação GET para o endpoint v1.operations, transmitindo o ID da operação no URL.

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

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 andamento:

{
  "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 for concluída, state será exibido como DONE e os resultados serão gravados no arquivo 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 arquivo de saída é semelhante ao de uma imagem [solicitação de detecção de texto do documento](/vision/docs/ocr), com um campo context mostrando o local do PDF ou TIFF especificado e o número de páginas no arquivo:

output-1-to-1.json

Go

Antes de testar este exemplo, siga as instruções de configuração do Go no Guia de início rápido do Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision Go.

Para autenticar no Vision, configure o Application Default Credentials. Para mais informações, consulte Configurar 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,
				},
			},
		},
	}

	operation, err := client.AsyncBatchAnnotateFiles(ctx, request)
	if err != nil {
		return err
	}

	fmt.Fprintf(w, "Waiting for the operation to finish.")

	resp, err := operation.Wait(ctx)
	if err != nil {
		return err
	}

	fmt.Fprintf(w, "%v", resp)

	return nil
}

Java

Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido da API Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision para Java.

/**
 * Performs document text OCR with PDF/TIFF as source files on Google Cloud Storage.
 *
 * @param gcsSourcePath The path to the remote file on Google Cloud Storage to detect document
 *     text on.
 * @param gcsDestinationPath The path to the remote file on Google Cloud Storage to store the
 *     results on.
 * @throws Exception on errors while closing the client.
 */
public static void detectDocumentsGcs(String gcsSourcePath, String gcsDestinationPath)
    throws Exception {

  // Initialize client that will be used to send requests. This client only needs to be created
  // once, and can be reused for multiple requests. After completing all of your requests, call
  // the "close" method on the client to safely clean up any remaining background resources.
  try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {