Trích xuất dữ liệu hóa đơn PDF tự động bằng AI và n8n

Featured Image 1200×628@2x

📄 TỪ HÓA ĐƠN PDF ĐẾN BẢNG TÍNH, KHÔNG GÕ TAY

📄 HOADON_0001234.pdf

Số: 0001234MST người bán: 0101234567Tổng thanh toán: 10.800.000

→
🤖 AI trích xuất
{
  “so_hoa_don”: “0001234”,
  “mst_nguoi_ban”: “0101234567”,
  “tong_thanh_toan”: 10800000
}
→

📊 Google Sheets

so_hdmsttong000119803123…4.320.000000123401012…10.800.000

✓ Đã kiểm tra, ghi thêm 1 dòng

Cuối tháng, hộp thư kế toán có hàng trăm email nhà cung cấp gửi hóa đơn. Ai đó phải mở từng file PDF, gõ số hóa đơn, mã số thuế, tiền trước thuế, tiền thuế vào Excel, rồi Data Analyst mới có dữ liệu để làm báo cáo chi phí. Một con số gõ nhầm là cả báo cáo lệch.

Bài viết này hướng dẫn cách trích xuất dữ liệu hóa đơn PDF tự động bằng AI và n8n: workflow tự nhận file từ email, AI đọc các trường cần thiết, n8n kiểm tra tính hợp lệ rồi ghi vào Google Sheets. Quan trọng không kém là phần kiểm tra: AI đọc nhanh nhưng vẫn có thể đọc sai, nên workflow phải biết khi nào cần con người xem lại.

Trước khi làm: XML hay PDF?

Có file XML thì đọc XML trước

Với hóa đơn điện tử tại Việt Nam, nhà cung cấp thường gửi kèm file XML bên cạnh file PDF. XML là dữ liệu có cấu trúc sẵn: mỗi trường như số hóa đơn, mã số thuế hay tổng tiền nằm trong một thẻ riêng. Đọc XML bằng node XML hoặc Extract from File của n8n cho kết quả chính xác tuyệt đối, nhanh và không tốn chi phí AI.

🧭 Vì vậy quy tắc đầu tiên là: có XML thì dùng XML, không có mới dùng AI đọc PDF. AI phù hợp với những trường hợp còn lại:

📄 Hóa đơn chỉ gửi file PDF hoặc ảnh chụp.

🌏 Hóa đơn, biên lai của nhà cung cấp nước ngoài.

🧾 Phiếu thu, biên nhận, báo giá không theo chuẩn hóa đơn điện tử.

Vì sao không dùng OCR truyền thống?

OCR truyền thống biến ảnh thành chữ, nhưng không biết đâu là mã số thuế người bán, đâu là của người mua. Mỗi nhà cung cấp một mẫu hóa đơn, nên cách cũ phải viết quy tắc riêng cho từng mẫu và hỏng ngay khi mẫu đổi. Mô hình AI hiểu ngữ cảnh, nên đọc được nhiều mẫu khác nhau chỉ với một mô tả duy nhất về các trường cần lấy.

Kiến trúc workflow trích xuất hóa đơn

Workflow gồm 6 chặng, mỗi chặng là một hoặc vài node trong n8n:

⚙ WORKFLOW TRÊN N8N

📥

Nhận file

Gmail Trigger

→
📄

Đọc nội dung

Extract from File

→
🤖

AI trích xuất

Information Extractor

→
🔍

Kiểm tra

Code / If

→
📊

Ghi dữ liệu

Google Sheets

→
🔔

Cần xem lại

Telegram

  1. Nhận file: Gmail Trigger bắt email mới có file đính kèm trong hộp thư hóa đơn, hoặc Google Drive Trigger bắt file mới trong một thư mục.
  2. Đọc nội dung: Extract from File lấy phần chữ từ file PDF.
  3. AI trích xuất: node Information Extractor nối với một mô hình AI, trả về các trường theo đúng cấu trúc bạn định nghĩa.
  4. Kiểm tra: node Code hoặc If kiểm tra mã số thuế, phép cộng tiền, hóa đơn trùng.
  5. Ghi dữ liệu: hóa đơn hợp lệ được ghi vào Google Sheets (hoặc database).
  6. Báo cần xem lại: hóa đơn không qua kiểm tra được ghi vào sheet riêng và gửi thông báo Telegram cho kế toán.

Thiết kế này theo nguyên tắc: AI chỉ làm việc đọc hiểu, còn quyết định đúng sai do quy tắc và con người. Đây là một workflow có AI với các bước cố định, không phải một agent tự quyết định. Nếu bạn còn phân vân giữa hai cách, xem bài AI Agent là gì?.

Dựng workflow từng bước trong n8n

BƯỚC 1/4

Bước 1: Nhận email có hóa đơn

Thêm node Gmail Trigger, lọc email theo nhãn hoặc địa chỉ nhận hóa đơn riêng (ví dụ hoadon@congty.vn), bật tuỳ chọn tải file đính kèm. Nếu một email có nhiều file, tách thành từng file riêng và chỉ giữ file .pdf (hoặc .xml để đi luồng đọc XML).

BƯỚC 2/4

Bước 2: Lấy chữ từ file PDF

Thêm node Extract from File với thao tác Extract From PDF. Với PDF được xuất từ phần mềm, bước này trả về đầy đủ nội dung chữ. Nếu kết quả gần như rỗng, đó là file scan hay ảnh chụp: hãy chuyển sang node của Claude hoặc Gemini có chức năng phân tích tài liệu, hình ảnh để mô hình đọc trực tiếp file.

BƯỚC 3/4

Bước 3: Định nghĩa các trường cần lấy

Thêm node Information Extractor, nối với một mô hình chat, đưa phần chữ ở bước 2 vào ô Text. Ở phần cấu trúc đầu ra, khai báo JSON mẫu với các trường cần dùng:

📦 cau-truc-hoa-don.jsonJSON
1{
2  "so_hoa_don": "0001234",
3  "ky_hieu": "1C26TAA",
4  "ngay_hoa_don": "2026-10-28",
5  "ten_nguoi_ban": "Công ty TNHH ABC",
6  "mst_nguoi_ban": "0101234567",
7  "tien_truoc_thue": 10000000,
8  "thue_suat": 8,
9  "tien_thue": 800000,
10  "tong_thanh_toan": 10800000
11}

Thêm hướng dẫn hệ thống để AI hiểu đúng ngữ cảnh hóa đơn Việt Nam:

📝 HƯỚNG DẪN HỆ THỐNG MẪU

Bạn là trợ lý kế toán. Trích xuất thông tin từ nội dung hóa đơn dưới đây. Mã số thuế lấy của người bán, không lấy của người mua. Số tiền ghi dạng số nguyên, bỏ dấu chấm phân cách hàng nghìn. Ngày theo định dạng YYYY-MM-DD. Trường nào không tìm thấy thì để null, tuyệt đối không tự điền.

BƯỚC 4/4

Bước 4: Ghi vào Google Sheets

Sau bước kiểm tra (phần tiếp theo), dùng node Google Sheets với thao tác Append Row để ghi mỗi hóa đơn thành một dòng. Nên thêm cột ngày xử lý, tên file gốc và link email để khi cần đối chiếu có thể mở lại đúng hóa đơn. Nếu muốn workflow nhận file qua một form riêng thay vì email, bạn có thể dùng webhook như trong bài Webhook là gì?.

📅 Muốn học bài bản tự động hóa và AI cho công việc dữ liệu? Xem lịch khai giảng mới nhất tại MCNA.

Kiểm tra dữ liệu trước khi ghi

AI đọc hóa đơn rất nhanh nhưng không hoàn hảo: có thể lấy nhầm mã số thuế người mua, đọc sai một chữ số trên bản scan mờ, hay hiểu nhầm tổng tiền. Vì vậy, trước khi ghi, workflow cần chạy 4 bước kiểm tra bằng quy tắc:

KIỂM TRA 1
✓ Đủ trường bắt buộc

Số hóa đơn, ngày, MST người bán, tổng thanh toán không được rỗng

✕ Nếu sai: Đưa vào danh sách cần xem lại

KIỂM TRA 2
✓ Mã số thuế hợp lệ

Gồm 10 chữ số, hoặc 10 chữ số kèm đuôi chi nhánh như 0101234567-001

✕ Nếu sai: Đưa vào danh sách cần xem lại

KIỂM TRA 3
✓ Phép cộng khớp

Tiền trước thuế + tiền thuế = tổng thanh toán (cho phép lệch vài đồng do làm tròn)

✕ Nếu sai: Đưa vào danh sách cần xem lại

KIỂM TRA 4
✓ Không trùng

Cặp MST người bán + ký hiệu + số hóa đơn chưa có trong bảng

✕ Nếu sai: Bỏ qua, ghi chú hóa đơn gửi lại

Viết đoạn code kiểm tra trong n8n

Ví dụ đoạn code kiểm tra trong node Code (JavaScript):

⚙ kiem-tra.jsJavaScript
1const hd = $json.output;
2const loi = [];
3if (!hd.so_hoa_don || !hd.ngay_hoa_don) loi.push('Thiếu số hoặc ngày hóa đơn');
4if (!/^\d{10}(-\d{3})?$/.test(hd.mst_nguoi_ban || '')) loi.push('Mã số thuế không hợp lệ');
5const lech = Math.abs((hd.tien_truoc_thue || 0) + (hd.tien_thue || 0) - (hd.tong_thanh_toan || 0));
6if (lech > 10) loi.push('Tổng tiền không khớp');
7return { ...hd, hop_le: loi.length === 0, ly_do: loi.join('; ') };

hop_le = true → ghi vào sheet chính

hop_le = false → sheet “Cần xem lại” + báo Telegram

Sau đó dùng node If tách hai nhánh: hop_le = true ghi vào sheet chính, hop_le = false ghi vào sheet “Cần xem lại” kèm lý do và gửi Telegram cho kế toán. Mỗi tuần, hãy xem tỷ lệ hóa đơn rơi vào nhánh cần xem lại: nếu một nhà cung cấp thường xuyên lỗi, có thể cần thêm mô tả riêng cho mẫu hóa đơn của họ. Cách tư duy kiểm tra này cũng giống bài Kiểm tra chất lượng dữ liệu tự động bằng n8n.

Bảo mật và chi phí cần tính đến

Bảo mật dữ liệu hóa đơn

Hóa đơn chứa thông tin tài chính, đối tác và giá mua của doanh nghiệp. Trước khi triển khai, hãy:

🙋 Hỏi ý kiến kế toán trưởng hoặc bộ phận phụ trách về việc gửi nội dung hóa đơn tới dịch vụ AI bên ngoài, và chọn gói dịch vụ có cam kết không dùng dữ liệu để huấn luyện.

🖥 Chạy n8n trên máy chủ của công ty nếu có thể, theo bài Cài n8n self-host bằng Docker, để file gốc không đi qua thêm dịch vụ trung gian.

🔒 Giới hạn quyền truy cập hộp thư hóa đơn và bảng Google Sheets kết quả.

Xem thêm các nguyên tắc chung trong bài Bảo mật dữ liệu khi dùng AI.

Chi phí vận hành

Chi phí chính là tiền gọi mô hình AI, tính theo lượng chữ đưa vào và trả ra. Một hóa đơn thông thường chỉ vài trang nên chi phí mỗi lần đọc khá nhỏ, nhưng hãy tính trước theo số hóa đơn mỗi tháng và bảng giá hiện tại của nhà cung cấp mô hình. Hai cách giảm chi phí hiệu quả nhất là đọc XML khi có và chỉ gửi trang đầu tiên nếu các trường cần lấy đều nằm ở đó.

5 lỗi thường gặp và cách xử lý

LỖI 1
🚨 Nội dung PDF trống

🔍 Nguyên nhân: File là bản scan hoặc ảnh chụp, không có lớp chữ

🔧 Cách xử lý: Chuyển sang mô hình đọc được hình ảnh, tài liệu

LỖI 2
🚨 Lấy nhầm mã số thuế người mua

🔍 Nguyên nhân: Hóa đơn có hai mã số thuế, hướng dẫn chưa rõ

🔧 Cách xử lý: Ghi rõ “lấy MST người bán”, và kiểm tra MST không trùng MST công ty mình

LỖI 3
🚨 Số tiền sai hàng nghìn

🔍 Nguyên nhân: Dấu chấm và dấu phẩy được hiểu theo kiểu nước ngoài

🔧 Cách xử lý: Yêu cầu trả về số nguyên, kèm kiểm tra phép cộng

LỖI 4
🚨 Một email ghi nhiều dòng trùng

🔍 Nguyên nhân: Email có cả file PDF và XML của cùng một hóa đơn

🔧 Cách xử lý: Ưu tiên XML, bỏ PDF cùng tên, và kiểm tra trùng theo số hóa đơn

LỖI 5
🚨 Workflow dừng giữa chừng

🔍 Nguyên nhân: File lỗi, file quá lớn hoặc dịch vụ AI tạm lỗi

🔧 Cách xử lý: Bật Retry, thiết lập Error Workflow theo bài Xử lý lỗi trong n8n

Câu hỏi thường gặp

?

AI đọc hóa đơn có chính xác không?

Với PDF xuất từ phần mềm, AI thường đọc đúng phần lớn các trường. Với bản scan mờ hay ảnh chụp nghiêng, khả năng sai cao hơn. Không nên tin tuyệt đối: hãy luôn có bước kiểm tra bằng quy tắc và nhánh “cần xem lại” cho con người.

?

Có cần biết lập trình không?

Phần lớn workflow dựng bằng kéo thả node. Chỉ phần kiểm tra dùng một đoạn JavaScript ngắn, và bạn có thể nhờ AI viết giúp rồi tự kiểm tra lại bằng vài hóa đơn mẫu.

?

Có lấy được cả danh sách hàng hóa trên hóa đơn không?

Có. Thêm một trường dạng danh sách (mảng) trong cấu trúc đầu ra, mỗi phần tử gồm tên hàng, số lượng, đơn giá, thành tiền. Khi đó nên kiểm tra thêm: tổng thành tiền các dòng hàng phải bằng tiền trước thuế.

?

Nên lưu kết quả vào Google Sheets hay database?

Google Sheets phù hợp để bắt đầu và cho kế toán xem trực tiếp. Khi số hóa đơn lớn hoặc cần nối với Power BI, nên chuyển sang database như PostgreSQL hay SQL Server để truy vấn và kiểm soát quyền tốt hơn.

?

Có thay thế được phần mềm kế toán không?

Không. Workflow này chỉ thay việc gõ tay dữ liệu từ hóa đơn. Việc hạch toán, kê khai thuế và lưu trữ hóa đơn theo quy định vẫn cần phần mềm kế toán và người có chuyên môn.

Kết luận

Với n8n và AI, việc trích xuất dữ liệu hóa đơn từ PDF có thể chạy tự động từ lúc email đến cho tới khi dữ liệu nằm gọn trong Google Sheets. Điểm mấu chốt không nằm ở mô hình AI mà ở thiết kế: ưu tiên XML khi có, mô tả rõ từng trường cần lấy, và luôn kiểm tra bằng quy tắc trước khi ghi.

Hãy bắt đầu với 20–30 hóa đơn của vài nhà cung cấp quen thuộc, so kết quả với dữ liệu kế toán đã nhập, rồi mới mở rộng. Khi dữ liệu chi phí đã về đều đặn, Data Analyst có thể dành thời gian cho việc quan trọng hơn: phân tích và báo cáo.

Nếu bạn muốn học bài bản cách tự động hóa quy trình dữ liệu với n8n, AI và Power BI, các khóa học tại MCNA Technology School sẽ đồng hành cùng bạn. Xem lịch khai giảng mới nhất. Đọc thêm: n8n, Power Automate hay Make? và RAG là gì?.

Thông tin tác giả

Võ Ngọc Vương – Data Analyst tại MCNA Technology School

MCNA Technology School – Đơn vị tiên phong đào tạo AI, Big Data, Business Intelligence tại Việt Nam. Chuyên sâu về Power BI, Python, SQL và Data Analytics — đối tác đào tạo của 300+ doanh nghiệp.

Đối tác đào tạo: Viettel Global, Masan Group, Techcombank, VPBank, Daikin.

→ Chỉ mục