Compartir vía


Tutorial: Uso de Azure Functions y Python para procesar documentos almacenados

Se puede usar Document Intelligence como parte de una canalización de procesamiento de datos automatizada que haya compilado con Azure Functions. En esta guía se muestra cómo usar Azure Functions para procesar documentos que se han cargado en un contenedor de Azure Blob Storage. Este flujo de trabajo extrae datos de tabla de los documentos almacenados mediante el modelo de diseño de Document Intelligence y guarda los datos de la tabla en un archivo .csv en Azure. A continuación, puede mostrar los datos mediante Microsoft Power BI (no se explica en este documento).

Captura de pantalla del flujo de trabajo del servicio de Azure

En este tutorial aprenderá a:

  • Cree una cuenta de Azure Storage.
  • Cree un proyecto de Azure Functions.
  • Extraer datos del diseño de los formularios cargados.
  • Cargar datos extraídos del diseño en Azure Storage.

Prerrequisitos

Creación de una cuenta de Azure Storage

  1. Cree una cuenta de Azure Storage de uso general v2 en Azure Portal. Si no sabe cómo crear una cuenta de almacenamiento de Azure con un contenedor de almacenamiento, siga estos inicios rápidos:

    • Crear una cuenta de almacenamiento. Al crear la cuenta de almacenamiento, seleccione el rendimiento Estándar en el campo Detalles de instancia>Rendimiento.
    • Cree un contenedor. Al crear un contenedor, establezca Nivel de acceso público en Contenedor (acceso de lectura anónimo para contenedores y archivos) en la ventana Nuevo contenedor.
  2. En el panel izquierdo, seleccione la pestaña Uso compartido de recursos (CORS) y quite la directiva CORS existente, si hay alguna.

  3. Una vez implementada la cuenta de almacenamiento, cree dos contenedores de almacenamiento de blobs vacíos, con los nombres input y output.

Creación de un proyecto de Azure Functions

  1. Cree una carpeta denominada functions-app para contener el proyecto y elija Seleccionar.

  2. Abra Visual Studio Code y abra la paleta de comandos (Ctrl+Mayús+P). Busque y elija Python:Select Interpreter → elija un intérprete de Python instalado que tenga la versión 3.6.x, 3.7.x, 3.8.x o 3.9.x. Esta selección agregará la ruta de acceso del intérprete de Python seleccionada al proyecto.

  3. Seleccione el logotipo de Azure en el panel de navegación izquierdo.

    • Verá los recursos de Azure existentes en la vista Recursos.

    • Seleccione la suscripción de Azure que usa para este proyecto; posteriormente, debería ver la aplicación de funciones de Azure.

      Captura de pantalla de una lista que muestra los recursos de Azure en una sola vista unificada.

  4. Seleccione la sección Área de trabajo (local) que se encuentra debajo de los recursos enumerados. Seleccione el símbolo más y elija el botón Crear función.

    Captura de pantalla que muestra dónde empezar a crear una función de Azure.

  5. Cuando se le solicite, elija Crear nuevo proyecto y vaya al directorio function-app. Elija Seleccionar.

  6. Se le pedirá que configure varios valores:

    • Seleccione un lenguaje → elija Python.

    • Seleccione un intérprete de Python para crear un entorno virtual → seleccione el intérprete que estableció como valor predeterminado anteriormente.

    • Seleccione una plantilla → elija el desencadenador de Azure Blob Storage y asígnele un nombre o acepte el nombre predeterminado. Presione Entrar para confirmar.

    • Seleccione un valor → elija ➕Crear nuevo valor de aplicación local en el menú desplegable.

    • Seleccione una suscripción → elija la suscripción de Azure con la cuenta de almacenamiento que creó → seleccione la cuenta de almacenamiento →, posteriormente, seleccione el nombre del contenedor de entrada de almacenamiento (en este caso, input/{name}). Presione Entrar para confirmar.

    • Seleccione cómo quiere abrir el proyecto → elija Abrir el proyecto en la ventana actual en el menú desplegable.

  7. Cuando haya completado estos pasos, VS Code agregará un nuevo proyecto de Azure Functions con un script de Python __init__.py. Este script se desencadenará cuando se cargue un archivo en el contenedor de almacenamiento test:

import logging

import azure.functions as func


def main(myblob: func.InputStream):
    logging.info(f"Python blob trigger function processed blob \n"
                 f"Name: {myblob.name}\n"
                 f"Blob Size: {myblob.length} bytes")

Probar la función

  1. Presione F5 para ejecutar la función básica. VS Code le pedirá que seleccione una cuenta de almacenamiento con la que interactuar.

  2. Seleccione la cuenta de almacenamiento que ha creado y continúe.

  3. Abra el Explorador de Azure Storage y cargue el documento PDF de ejemplo en el contenedor input. Posteriormente, compruebe el terminal de VS Code. El script debe registrar que la carga del archivo PDF lo desencadenó.

    Captura de pantalla del terminal de VS Code después de cargar un nuevo documento.

  4. Detenga el script antes de continuar.

Incorporación de código de procesamiento de documentos

A continuación, agregará su propio código al script de Python para llamar al servicio de Document Intelligence y analizar los documentos cargados mediante el modelo de diseño de Document Intelligence.

  1. En VS Code, navegue hasta el archivo requirements.txt de la función. Este archivo define las dependencias para el script. Agregue los siguientes paquetes de Python al archivo:

    cryptography
    azure-functions
    azure-storage-blob
    azure-identity
    requests
    pandas
    numpy
    
  2. A continuación, abra el script __init__.py. Agregue las instrucciones siguientes import :

    import logging
    from azure.storage.blob import BlobServiceClient
    import azure.functions as func
    import json
    import time
    from requests import get, post
    import os
    import requests
    from collections import OrderedDict
    import numpy as np
    import pandas as pd
    
  3. Puede dejar la función main generada tal cual está. Agregará el código personalizado dentro de esta función.

    # This part is automatically generated
    def main(myblob: func.InputStream):
        logging.info(f"Python blob trigger function processed blob \n"
        f"Name: {myblob.name}\n"
        f"Blob Size: {myblob.length} bytes")
    
  4. El siguiente bloque de código llama a la API de análisis de diseño de Document Intelligence en el documento cargado. Rellene los valores de punto de conexión y clave.

    # This is the call to the Document Intelligence endpoint
        endpoint = r"Your Document Intelligence Endpoint"
        apim_key = "Your Document Intelligence Key"
        post_url = endpoint + "/formrecognizer/v2.1/layout/analyze"
        source = myblob.read()
    
        headers = {
        # Request headers
        'Content-Type': 'application/pdf',
        'Ocp-Apim-Subscription-Key': apim_key,
            }
    
        text1=os.path.basename(myblob.name)
    

    Importante

    Recuerde quitar la clave del código cuando haya terminado y no hacerla nunca pública. En el caso de producción, use una forma segura de almacenar sus credenciales y acceder a ellas, como Azure Key Vault. Para obtener más información, consulteSeguridad de servicios de Azure AI.

  5. A continuación, agregue el código para consultar al servicio y obtener los datos devueltos.

    resp = requests.post(url=post_url, data=source, headers=headers)
    
    if resp.status_code != 202:
        print("POST analyze failed:\n%s" % resp.text)
        quit()
    print("POST analyze succeeded:\n%s" % resp.headers)
    get_url = resp.headers["operation-location"]
    
    wait_sec = 25
    
    time.sleep(wait_sec)
    # The layout API is async therefore the wait statement
    
    resp = requests.get(url=get_url, headers={"Ocp-Apim-Subscription-Key": apim_key})
    
    resp_json = json.loads(resp.text)
    
    status = resp_json["status"]
    
    if status == "succeeded":
        print("POST Layout Analysis succeeded:\n%s")
        results = resp_json
    else:
        print("GET Layout results failed:\n%s")
        quit()
    
    results = resp_json
    
    
  6. Agregue el siguiente código para conectarse al contenedor output de Azure Storage. Escriba sus propios valores para el nombre y la clave de la cuenta de almacenamiento. Puede obtener la clave en la pestaña Claves de acceso del recurso de almacenamiento en Azure Portal.

    # This is the connection to the blob storage, with the Azure Python SDK
        blob_service_client = BlobServiceClient.from_connection_string("DefaultEndpointsProtocol=https;AccountName="Storage Account Name";AccountKey="storage account key";EndpointSuffix=core.windows.net")
        container_client=blob_service_client.get_container_client("output")
    

    El código siguiente analiza la respuesta que devuelve Document Intelligence, crea un archivo. csv y lo carga en el contenedor de salida.

    Importante

    Probablemente tendrá que editar este código para que coincida con la estructura de sus documentos.

        # The code below extracts the json format into tabular data.
        # Please note that you need to adjust the code below to your form structure.
        # It probably won't work out-of-the-box for your specific form.
        pages = results["analyzeResult"]["pageResults"]
    
        def make_page(p):
            res=[]
            res_table=[]
            y=0
            page = pages[p]
            for tab in page["tables"]:
                for cell in tab["cells"]:
                    res.append(cell)
                    res_table.append(y)
                y=y+1
    
            res_table=pd.DataFrame(res_table)
            res=pd.DataFrame(res)
            res["table_num"]=res_table[0]
            h=res.drop(columns=["boundingBox","elements"])
            h.loc[:,"rownum"]=range(0,len(h))
            num_table=max(h["table_num"])
            return h, num_table, p
    
        h, num_table, p= make_page(0)
    
        for k in range(num_table+1):
            new_table=h[h.table_num==k]
            new_table.loc[:,"rownum"]=range(0,len(new_table))
            row_table=pages[p]["tables"][k]["rows"]
            col_table=pages[p]["tables"][k]["columns"]
            b=np.zeros((row_table,col_table))
            b=pd.DataFrame(b)
            s=0
            for i,j in zip(new_table["rowIndex"],new_table["columnIndex"]):
                b.loc[i,j]=new_table.loc[new_table.loc[s,"rownum"],"text"]
                s=s+1
    
    
  7. Por último, el último bloque de código carga la tabla y los datos de texto que se extrajeron en el elemento de almacenamiento de blobs.

        # Here is the upload to the blob storage
        tab1_csv=b.to_csv(header=False,index=False,mode='w')
        name1=(os.path.splitext(text1)[0]) +'.csv'
        container_client.upload_blob(name=name1,data=tab1_csv)
    

Ejecución de la función

  1. Presione F5 para ejecutar la función nuevamente.

  2. Use el Explorador de Azure Storage para cargar un formulario PDF de ejemplo en el contenedor de almacenamiento input. Esta acción debe desencadenar la ejecución del script y, a continuación, se deberá mostrar el archivo .csv resultante (mostrado como una tabla) en el contenedor output.

Puede conectar este contenedor a Power BI para crear visualizaciones enriquecidas de los datos que contiene.

Pasos siguientes

En este tutorial, aprendió a usar una función de Azure escrita en Python para procesar automáticamente los documentos PDF cargados y devolver el contenido con un formato más fácil de usar. A continuación, obtenga información sobre cómo usar Power BI para mostrar esos datos.