教學課程:使用 Azure 函式和 Python 處理已儲存的文件
文件智慧可用做使用 Azure Functions 所建置自動化資料處理準銷售案源的一部分。 本指南將說明如何使用 Azure 函式來處理傳至 Azure Blob 儲存體容器的文件。 此工作流程會使用文件智慧版面配置模型從已儲存的文件擷取資料表資料,並將資料表資料儲存在 Azure 中的.csv 檔案中。 然後,您可以使用 Microsoft Power BI 顯示資料 (此處未涵蓋)。
在本教學課程中,您會了解如何:
- 建立 Azure 儲存體帳戶。
- 建立 Azure Functions 專案。
- 從上傳的表單擷取版面配置資料。
- 將擷取的版面配置資料上傳至 Azure 儲存體。
必要條件
Azure 訂閱 - 建立免費帳戶
文件智慧資源。 擁有 Azure 訂用帳戶之後,在 Azure 入口網站中建立文件智慧服務,以取得您的金鑰和端點。 您可以使用免費定價層 (
F0
) 來試用服務,之後可升級至付費層以用於實際執行環境。部署資源之後,請選取 [移至資源]。 您需要使用已建立資源的金鑰和端點,將應用程式連線至文件智慧服務 API。 您稍後會在教學課程中將金鑰和端點貼到下列程式碼中:
Python 3.6.x、3.7.x、3.8.x 或 3.9.x (此專案不支援 Python 3.10.x)。
已安裝有下列延伸模組的最新版 Visual Studio Code (VS Code):
Azure Functions 延伸模組. 安裝之後,您應該會在左側瀏覽窗格中看到 Azure 標誌。
Azure Functions Core Tools 3.x 版 (此專案不支援 4.x 版)。
適用於 Visual Studio Code 的 Python 延伸模組。 如需詳細資訊,請參閱 VS Code 中的 Python 使用者入門
要分析的本機 PDF 文件。 您可以使用本產品的範例 PDF 文件。
建立 Azure 儲存體帳戶
在 Azure 入口網站中建立一般用途 v2 Azure 儲存體帳戶。 如果您不知道如何使用儲存體容器建立 Azure 儲存體帳戶,請遵循下列快速入門:
在左窗格中,選取 [資源共用 (CORS)] 索引標籤,如果有任何 CORS 存在,請移除現有的 CORS 原則。
部署儲存體帳戶之後,請建立兩個空的 Blob 儲存體容器,名為輸入和輸出。
建立 Azure Functions 專案
建立名為 functions-app 的新資料夾以包含專案,然後選擇 [選取]。
開啟 Visual Studio Code,並開啟命令選擇區 (Ctrl+Shift+P)。 搜尋並選擇 [Python:選取解譯器] → 選擇已安裝的 3.6.x 版、3.7.x 版、3.8.x版 或 3.9.x 版 Python 解譯器。 此選取項目會將您選取的 Python 解譯器路徑新增至您的專案。
從左側瀏覽窗格中選取 Azure 標誌。
您會在 [資源] 檢視中看到現有的 Azure 資源。
選取您用於此專案的 Azure 訂閱,您應該會在下方看到 Azure 函式應用程式。
選取您列出的資源下方的 [工作區 (本機)] 區段。 選取加號,然後選擇 [建立函式] 按鈕。
出現提示時,選擇 [建立新專案],並且瀏覽至 function-app 目錄。 選擇選取。
此時會提示您進行一些設定:
選取語言 → 選擇 [Python]。
選取 Python 解譯器以建立虛擬環境 → 選取您稍早設定為預設的解譯器。
選取範本 → 選擇 Azure Blob 儲存體觸發程序,並提供觸發程序名稱或接受預設名稱。 按 Enter 確認。
選取設定 → 從下拉式功能表中選擇 [➕建立新的本機應用程式設定]。
選取訂閱 → 選擇您建立的 Azure 訂閱 → 選取儲存體帳戶 → 然後選取儲存體輸入容器的名稱 (在此案例中為
input/{name}
)。 按 Enter 確認。選取您想要開啟專案的方式 → 從下拉式功能表選擇 [在目前視窗中開啟專案]。
當您完成這些步驟時,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")
測試函式
按下 F5 執行基本函式。 VSCode 會提示您選取要與之互動的儲存體帳戶。
選取建立的儲存體帳戶並繼續。
開啟 Azure 儲存體總管,並將範例 PDF 文件上傳至輸入容器。 然後檢查 VSCode 終端機。 指令碼應該記錄 PDF 上傳所觸發的指令碼。
繼續之前,請先停止指令碼。
新增文件處理程式碼
接下來,您會將自己的程式碼新增至 Python 指令碼,以呼叫文件智慧服務,並使用文件智慧版面配置模型剖析上傳的文件。
在 VS Code 中,瀏覽至函式的 requirements.txt 檔案。 此檔案會為指令碼定義相依性。 將下列 Python 套件新增至檔案:
cryptography azure-functions azure-storage-blob azure-identity requests pandas numpy
然後,開啟 __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
您可以將產生的
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")
下列程式碼區塊會在上傳的文件上呼叫文件智慧分析版面配置 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 服務安全性。
接下來,新增程式碼以查詢服務並取得傳回的資料。
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
新增下列程式碼以連線到 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
最後,最後一個程式碼區塊會將擷取的資料表和文字資料上傳至 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)
執行函式
按下 F5 再次執行基本函式。
使用 Azure 儲存體總管將範例 PDF 表單上傳至輸入儲存體容器。 此動作應該觸發要執行的指令碼,然後您應該會在輸出容器中看到產生的 .csv 檔案 (顯示為資料表)。
您可以將此容器連線到 Power BI,以建立其包含的資料豐富視覺效果。
下一步
在本教學課程中,您已了解如何使用以 Python 撰寫的 Azure 函式來自動處理上傳的 PDF 文件,並以更方便使用資料的格式輸出其內容。 接下來,了解如何使用 Power BI 顯示資料。
- 什麼是文件智慧服務?
- 深入了解版面配置模型