Xin chào mọi người, thì gần đây mình với biết đến nơi làm việc của ông anh mình có các nghiệp vụ cần xử lý các bộ hồ sơ về các đơn hàng đến kế toán. Vấn đề là các kế toán họ làm việc online nên những bộ hồ sơ đó được lưu tại Sharepoint để kế toán xử lý online.
Mô tả bài toán
Cụ thể thì các đơn hàng đó được scan qua máy in để có file pdf trên máy tính, sau đó thì cần đặt tên các PDF này theo 1 cú pháp nào đó rồi đẩy lên Sharepoint cho kế toán họ xử lý. Do đó bài toán đặt ra là cần phải dựa trên mã hóa đơn trên file để tiến hành đổi lại tên file. Sau đây, thì mình sẽ hướng dẫn để xây dựng 1 flow có thể đổi tên file dựa trên dữ liệu được đọc trên file PDF. Ngoài ra đây cũng có thể là 1 use case để mọi người có thể tùy chỉnh trong trường hợp riêng của mình.
Khởi tạo trigger cho flow
Sau khi mình scan file vào máy tính thì mình sẽ cần đẩy file đó lên OneDrive để tạo trigger cho flow, trigger của flow dùng để bắt sự kiện tạo file trên OneDrive, ngoài ra ở đây ngoài OneDrive mình cũng có thể chọn trigger lắng nghe sự kiến từ Sharepoint
Bước 1: Mình cần tạo automated cloud flow. Tại tab "My flows" mình cần chọn "New flow" -> "Automated cloud flow" Sau đó mình sẽ chọn Trigger "When a file created" -> Chọn "Create" Khi đó Microsoft Automate sẽ tạo cho mình 1 trang giao diện để edit flow, mình có thể nhấp vào item đó để xem thông tin của item đó. Ở đây mình chọn đường dẫn folder là /File Input
Bước 2: Sau đó mình sẽ tạo ra các biến để hỗ trợ cho việc đặt tên file ở những bước sau. Để tạo ra biến trong flow mình làm theo các bước sau
Mình chọn "Add an action" sau đó tìm kiếm các action với từ khóa "variable" Sau khi thêm action, mình có thể thay đổi tên, đặt tên biến và chọn kiểu dữ liệu nếu muốn
Ở đây mình sẽ đặt tạo 1 biến tên là varHeader để lưu giữ chuỗi đầu của tên file như sau Tương tự mình cũng sẽ tạo ra các biến sau
Do là lúc sau mình có sử dụng AI Builder để thực hiện đọc dữ liệu từ file pdf, mà đối với AI Builder thì người dùng cần mua riêng license để được cung cấp credit sử dụng. Mọi người có thể tham khảo thêm link sau để đọc thêm về credit của AI Builder: https://learn.microsoft.com/en-us/ai-builder/credit-management. Đại khái khi dùng action của AI Builder để extract dữ liệu từ ảnh thì mỗi 1 trang nó sẽ tính từ 1 credit. Và do mình chỉ cần đọc dữ liệu mã hóa đơn nên mình đặt mặc định vị trí của mảng là từ 15-25
Bước 3: Tạo action "Get file content using path" để lấy dữ liệu của file
Bước 4: Tạo action "Recognize text in an image or a PDF document" và truyền file content vừa đọc được vào property "Image"
Kết quả trả về của 1 dữ liệu
Dữ liệu trả ra là một chuỗi các json, thông qua "/body/predictionOutput/results/" ta sẽ có được dữ liệu các trang, trong các trang có trường lines thể hiện các dòng của trang đó.
Bước 5:
-
Tạo action "Apply to each" và truyền vào biến "varIndex" mà trước đó mình tạo
-
Tạo action "Condition" để kiểm tra giá trị mình đọc được. Do mô hình nhận diện của AI do Microsoft cho kết quả không chính xác do 1 số nguyên nhân. Ví dụ trong trường hợp mình cần đọc trường "Order no" nhưng kết quả trả ra là "Order nc" điều này xảy ra là do mực máy in in chữ no không rõ nên mô hình sẽ nhận diện sai, để tránh trường hợp này thì mình cần so sánh tất cả các trường hợp nó có thể sai để mình vẫn đọc được data.
Dùng expression để đọc dữ liệu trả ra từ action AI Builder:
outputs('Recognize_text_in_an_image_or_a_PDF_document')?['body/responsev2/predictionOutput/results'][1]?['lines'][variables('varIndex')]?['text']
Giải thích: từ outputs của action ta cần query path từ "/body/predictionOutput/results/" lấy phần tử ở trang 2 và tiếp tục query tiếp để lấy các lines tại từng biến index đã tạo trước đó là 15-25, tức là duyệt từ dòng 15-25 và lấy trường text để so sánh dữ liệu, nếu là trường có title là Reception no thì mình sẽ lấy index + 1
- Set lại variable của biến varReceptionNo để lấy mã hóa đơn
Expression:
outputs('Recognize_text_in_an_image_or_a_PDF_document')?['body/responsev2/predictionOutput/results'][1]?['lines'][add(int(variables('varIndex')),1)]?['text']
Tạo action "Increment variable" để tăng biến index sau mỗi lần lặp:
Bước 6: Tạo action "Condition" để kiểm tra có lấy được dữ liệu từ Reception no hay không
Expression:
empty(variables('varReceptionNo'))
Trong trường hợp không lấy được mã Reception no sẽ tạo tên file bị lỗi dẫn đến flow sẽ có thể bị fail. Vì thế nếu rỗng thì mình dùng hàm utcNow() để lấy thời gian hiện tại nối vào biến, ngược lại mình sẽ lấy biến varHeader + varReceptionNo
-
Trường hợp true:
-
Trường hợp false:
Bước 6: Tạo action "Create file"
Truyền vào biến "varFileName" và "FileContent"
Kết quả
Vậy mình đã tạo ra được file từ thông tin của file PDF, và mã reception no của file là 19876527 và được nối vào chuỗi varHeader 103_M1