分享方式:


教學課程:使用 Azure 函式和 Python 處理已儲存的文件

文件智慧可用做使用 Azure Functions 所建置自動化資料處理準銷售案源的一部分。 本指南將說明如何使用 Azure 函式來處理傳至 Azure Blob 儲存體容器的文件。 此工作流程會使用文件智慧版面配置模型從已儲存的文件擷取資料表資料,並將資料表資料儲存在 Azure 中的.csv 檔案中。 然後,您可以使用 Microsoft Power BI 顯示資料 (此處未涵蓋)。

Azure 服務工作流程圖的螢幕擷取畫面

在本教學課程中,您會了解如何:

  • 建立 Azure 儲存體帳戶。
  • 建立 Azure Functions 專案。
  • 從上傳的表單擷取版面配置資料。
  • 將擷取的版面配置資料上傳至 Azure 儲存體。

必要條件

建立 Azure 儲存體帳戶

  1. 在 Azure 入口網站中建立一般用途 v2 Azure 儲存體帳戶。 如果您不知道如何使用儲存體容器建立 Azure 儲存體帳戶,請遵循下列快速入門:

    • 建立儲存體帳戶。 建立儲存體帳戶時,請選取 [標準] 效能 (位於 [執行個體詳細資料]>[效能] 欄位中)。
    • 建立容器。 建立容器時,請在 [新增容器] 視窗中,將 [公用存取層級] 設定為 [容器] (容器和檔案的匿名讀取權限)。
  2. 在左窗格中,選取 [資源共用 (CORS)] 索引標籤,如果有任何 CORS 存在,請移除現有的 CORS 原則。

  3. 部署儲存體帳戶之後,請建立兩個空的 Blob 儲存體容器,名為輸入輸出

建立 Azure Functions 專案

  1. 建立名為 functions-app 的新資料夾以包含專案,然後選擇 [選取]

  2. 開啟 Visual Studio Code,並開啟命令選擇區 (Ctrl+Shift+P)。 搜尋並選擇 [Python:選取解譯器] → 選擇已安裝的 3.6.x 版、3.7.x 版、3.8.x版 或 3.9.x 版 Python 解譯器。 此選取項目會將您選取的 Python 解譯器路徑新增至您的專案。

  3. 從左側瀏覽窗格中選取 Azure 標誌。

    • 您會在 [資源] 檢視中看到現有的 Azure 資源。

    • 選取您用於此專案的 Azure 訂閱,您應該會在下方看到 Azure 函式應用程式。

      清單的螢幕擷取畫面,其中以單一的整合檢視顯示 Azure 資源。

  4. 選取您列出的資源下方的 [工作區 (本機)] 區段。 選取加號,然後選擇 [建立函式] 按鈕。

    顯示從何處開始建立 Azure 函式的螢幕擷取畫面。

  5. 出現提示時,選擇 [建立新專案],並且瀏覽至 function-app 目錄。 選擇選取

  6. 此時會提示您進行一些設定:

    • 選取語言 → 選擇 [Python]。

    • 選取 Python 解譯器以建立虛擬環境 → 選取您稍早設定為預設的解譯器。

    • 選取範本 → 選擇 Azure Blob 儲存體觸發程序,並提供觸發程序名稱或接受預設名稱。 按 Enter 確認。

    • 選取設定 → 從下拉式功能表中選擇 [➕建立新的本機應用程式設定]

    • 選取訂閱 → 選擇您建立的 Azure 訂閱 → 選取儲存體帳戶 → 然後選取儲存體輸入容器的名稱 (在此案例中為 input/{name})。 按 Enter 確認。

    • 選取您想要開啟專案的方式 → 從下拉式功能表選擇 [在目前視窗中開啟專案]

  7. 當您完成這些步驟時,VSCode 會新增具有 __init__.py Python 指令碼的新 Azure 函式專案。 檔案上傳至輸入儲存體容器時,會觸發此指令碼:

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")

測試函式

  1. 按下 F5 執行基本函式。 VSCode 會提示您選取要與之互動的儲存體帳戶。

  2. 選取建立的儲存體帳戶並繼續。

  3. 開啟 Azure 儲存體總管,並將範例 PDF 文件上傳至輸入容器。 然後檢查 VSCode 終端機。 指令碼應該記錄 PDF 上傳所觸發的指令碼。

    上傳新文件之後 VS Code 終端機的螢幕擷取畫面。

  4. 繼續之前,請先停止指令碼。

新增文件處理程式碼

接下來,您會將自己的程式碼新增至 Python 指令碼,以呼叫文件智慧服務,並使用文件智慧版面配置模型剖析上傳的文件。

  1. 在 VS Code 中,瀏覽至函式的 requirements.txt 檔案。 此檔案會為指令碼定義相依性。 將下列 Python 套件新增至檔案:

    cryptography
    azure-functions
    azure-storage-blob
    azure-identity
    requests
    pandas
    numpy
    
  2. 然後,開啟 __init__.py 指令碼。 加入下列 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. 您可以將產生的 main 函式保留原狀。 您將在此函式內新增自訂程式碼。

    # 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. 下列程式碼區塊會在上傳的文件上呼叫文件智慧分析版面配置 API。 填入您的端點和金鑰值。

    # 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)
    

    重要

    完成時,請記得從程式碼中移除金鑰,且不要公開張貼金鑰。 在生產環境中,請使用安全的方式來儲存和存取您的認證,例如 Azure Key Vault。 如需詳細資訊,請參閱 Azure AI 服務安全性

  5. 接下來,新增程式碼以查詢服務並取得傳回的資料。

    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. 新增下列程式碼以連線到 Azure 儲存體輸出容器。 針對儲存體帳戶名稱和金鑰填入您自己的值。 您可以在 Azure 入口網站中儲存體資源的 [存取金鑰] 索引標籤上取得的金鑰。

    # 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")
    

    下列程式碼會剖析傳回的文件智慧回應、建構 .csv 檔案,並將其上傳至輸出容器。

    重要

    您可能需要編輯此程式碼,以符合您自己的文件結構。

        # 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. 最後,最後一個程式碼區塊會將擷取的資料表和文字資料上傳至 Blob 儲存體元素。

        # 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)
    

執行函式

  1. 按下 F5 再次執行基本函式。

  2. 使用 Azure 儲存體總管將範例 PDF 表單上傳至輸入儲存體容器。 此動作應該觸發要執行的指令碼,然後您應該會在輸出容器中看到產生的 .csv 檔案 (顯示為資料表)。

您可以將此容器連線到 Power BI,以建立其包含的資料豐富視覺效果。

下一步

在本教學課程中,您已了解如何使用以 Python 撰寫的 Azure 函式來自動處理上傳的 PDF 文件,並以更方便使用資料的格式輸出其內容。 接下來,了解如何使用 Power BI 顯示資料。