Cách lấy số tiền trong PDF, vị trí của nó trên trang

Bài viết này trình bày cách sử dụng PyMuPDF để định vị số lượng văn bản lặp lại trong một hình chữ nhật được chỉ định. Bằng cách phân tích năm trường đầu tiên của các từ octet và xác minh số lượng ứng viên, có thể tránh được những đánh giá sai lầm trong việc ghép đoạn. Cung cấp các ví dụ Python ở cấp độ bộ nhớ, chiến lược xử lý ranh giới và bảng chấp nhận, đồng thời đưa ra các đề xuất thiết thực để kết nối với quy trình dịch tài liệu OmniDoc.

Làm cách nào để xác định số tiền trùng lặp? Một câu kết luận

Khi bố cục đã cố định, trước tiên hãy giới hạn khu vực đã biết, sau đó kiểm tra văn bản và để số lượng ứng viên cho người gọi đánh giá. Nó dễ diễn giải hơn là tiếp tục chồng chất các biểu thức chính quy và ít có khả năng mắc lỗi thầm lặng hơn.

hoàn cảnh của bạnCác phương pháp được đề xuấtlý do
Số tiền tương tự xuất hiện ở nhiều nơi trên trangGiới hạn tìm kiếm trong khu vực hình chữ nhật nơi đặt lĩnh vực kinh doanh và sau đó tìm kiếmTìm kiếm toàn văn không thể xác định được lĩnh vực nào là lĩnh vực kinh doanh
Có nhiều ứng viên trong vùng truy vấnTrả về tất cả các ứng viên, kết hợp với nhãn hoặc định hướng thủ côngCác chương trình không nên đưa ra lựa chọn cho doanh nghiệp
Không có lượt truy cập nào trong khu vực truy vấnĐánh dấu lý do và kiểm tra trang gốc, không có phần đệm số 0Vùng sai, số lượng bị chia nhỏ hoặc lớp văn bản bị thiếu có thể dẫn đến không có lượt truy cập
Vị trí của khung trông có vẻ bù đắpChuỗi chuyển đổi rõ ràng để xoay, cắt xén và chia tỷ lệ kết xuấtTrộn tọa độ hiển thị và tọa độ trích xuất sẽ gây ra sai lệch

Hai số tiền giống nhau trong một báo cáo

1,200.00 xuất hiện hai lần trong bảng sao kê: một lần ở cột số tiền đến hạn và một lần trong văn bản mô tả. Tìm kiếm toàn văn có thể tìm thấy chúng, nhưng nó không thể quyết định cho bạn lĩnh vực kinh doanh nào.

Nếu bố cục biểu mẫu cố định, việc diễn giải thường dễ dàng hơn bằng cách trước tiên giới hạn một khu vực đã biết rồi tìm kiếm văn bản hơn là tiếp tục điều chỉnh biểu thức chính quy. Điều quan trọng không phải là "chỉ tìm một ô", mà là coi cả hai lần truy cập bằng 0 và nhiều lần truy cập là kết quả rõ ràng và không để chương trình đưa ra những lựa chọn trái phép.

Để nguyên vị trí của từ, không chỉ văn bản

`page.get_text("words")` của PyMuPDF trả về một bản ghi từ có vị trí, trường chung là (x0, y0, x1, y1, text, block_no, line_no, word_no). Ví dụ sau chỉ lấy năm trường đầu tiên và ba số cuối hiện không liên quan đến lọc khu vực.

"Từ"ở đây là đoạn do người trích xuất đưa ra, không nhất thiết phải bằng một từ theo nghĩa ngôn ngữ, cũng không đảm bảo rằng một lượng sẽ luôn là một đoạn hoàn chỉnh.1,200.00 có thể được tháo rời hoặc có thể có các thẻ liền kề. Bài viết này chỉ đề cập đến việc khớp chính xác các mảnh hoàn chỉnh: Tôi thà giao những hồ sơ không đủ điều kiện để xem xét còn hơn là lặng lẽ ghép chúng thành một số lượng có vẻ hợp pháp.

Xác minh bằng hai trang tổng hợp có cùng số lượng

Chúng tôi tạo một trang PDF mới trong bộ nhớ và đặt cùng một lượng gần tọa độ dọc lần lượt là 120 và 420. Khu vực truy vấn chỉ bao gồm số tiền trên.

Điểm chèn văn bản là vị trí cơ sở chứ không phải góc trên bên trái của hộp văn bản. Chiều cao và chiều rộng của hộp thật sẽ bị ảnh hưởng bởi phông chữ và kích thước phông chữ, do đó tọa độ không thể được mã hóa cứng thành một giá trị cố định.

Đầu ra đúng phải đáp ứng hai điều kiện:

  • Chỉ có một ứng cử viên trong vùng truy vấn và hình chữ nhật ứng viên nằm hoàn toàn trong vùng truy vấn.
  • Sau khi mở rộng phạm vi truy vấn ra toàn bộ trang, sẽ thu được hai ứng viên, do đó sẽ đi vào nhánh mơ hồ.

Cuối cùng, kiểm tra xem có lần truy cập nào bằng một chuỗi không có trên trang không. Điều này gần với hợp đồng được yêu cầu bởi giao diện thực hơn là chỉ thể hiện việc tra cứu thành công.

Runnable code: trao số lượng ứng viên cho người gọi

Phần phụ thuộc là pymupdf, vui lòng cài đặt và khóa phiên bản trong môi trường thử nghiệm. Đoạn mã sau không truy cập được mạng, không ghi tập tin và không sửa đổi tài liệu gốc của khách hàng. Nó chỉ xây dựng một bản PDF trình diễn.

import pymupdf

def locate(page, target, query):
    query = pymupdf.Rect(query)
    candidates = []
    for word in page.get_text("words"):
        x0, y0, x1, y1, text = word[:5]
        box = pymupdf.Rect(x0, y0, x1, y1)
        if text == target and query.contains(box):
            candidates.append(tuple(box))
    return candidates

def decide(candidates):
    if len(candidates) == 0:
        return "missing"
    if len(candidates) > 1:
        return "ambiguous"
    return "unique"

with pymupdf.open() as doc:
    page = doc.new_page(width=595, height=842)
    page.insert_text((80, 120), "1,200.00", fontsize=11)
    page.insert_text((80, 420), "1,200.00", fontsize=11)
    query = pymupdf.Rect(72, 100, 300, 150)
    local = locate(page, "1,200.00", query)
    assert decide(local) == "unique"
    assert query.contains(pymupdf.Rect(local[0]))
    assert decide(locate(page, "1,200.00", page.rect)) == "ambiguous"
    assert decide(locate(page, "999.99", query)) == "missing"
    print("unique / ambiguous / missing cases passed")

contains yêu cầu bao gồm hoàn toàn thay vì chỉ chạm vào rìa của khu vực. Nếu hộp truy vấn quá chật, số lượng bên cạnh có thể rơi vào mức 0 lần truy cập, đó không phải là lý do tại sao nó sẽ tự động mở rộng ra toàn trang. Bạn nên kiểm tra hệ tọa độ được sử dụng khi đo diện tích trước khi quyết định cách điều chỉnh phạm vi.

Nếu doanh nghiệp cho phép điểm trung tâm lọt vào thì nên viết thêm các quy tắc và thực hiện các thử nghiệm bổ sung về sự chồng chéo ranh giới. Đừng lén lút thay đổi ý nghĩa của phán đoán trong cùng một chức năng.

Logic sản xuất không nên chỉ dựa vào assert để chặn các ngoại lệ vì các chế độ tối ưu hóa có thể loại bỏ các xác nhận. Các xác nhận trong ví dụ được sử dụng để kiểm tra hồi quy. Khi thực sự truy cập vào hàng đợi nhiệm vụ, nên sử dụng các nhánh có điều kiện và trạng thái kinh doanh rõ ràng.

##Ba kết quả, ba cách xử lý

Kết quả truy vấn thường được chia thành ba loại, mỗi loại yêu cầu các hành động xử lý khác nhau:

  • Chỉ một lần truy cập: Chỉ có một đoạn khớp hoàn chỉnh trong khu vực và số trang, văn bản gốc, hình chữ nhật và phiên bản quy tắc được lưu.
  • Không trúng: Có thể sai vùng, số lượng bị chia nhỏ hoặc thiếu lớp văn bản. Đánh dấu nguyên nhân có thể xảy ra, kiểm tra trang gốc và không thêm số không.
  • Nhiều lượt truy cập: Có số lượng trùng lặp trong cùng một khu vực hoặc mẫu đã thay đổi, trả về tất cả các ứng cử viên, kết hợp nhãn hoặc phân định thủ công.

Hai tình huống còn lại cũng cần được xử lý riêng biệt:

  • Box nhưng giá trị sai: Bản thân lớp văn bản có thể sai hoặc mục tiêu khớp sai; quay lại trang gốc để kiểm tra và không cho phép xác nhận tọa độ bằng giá trị số.
  • Box Offset: Tọa độ hiển thị và trích xuất có thể bị trộn lẫn, đòi hỏi chuỗi chuyển tiếp rõ ràng cho việc xoay, cắt và hiển thị.

📊 So sánh cốt lõi

Phương pháp tra cứuTiêu chí xác địnhCần thận trọng
Bao gồm đầy đủ (ví dụ được sử dụng)Hình chữ nhật ứng viên được đặt hoàn toàn trong khu vực truy vấnNếu hộp truy vấn quá chật, số lượng trên cạnh có thể là 0 hit
Điểm trung tâm rơi xuống (luật cần được viết riêng)Các điểm trung tâm ứng viên nằm trong khu vựcChồng lấn ranh giới đòi hỏi kiểm tra bổ sung riêng biệt
Tìm kiếm toàn bộ trangTìm kiếm tất cả ứng viênHầu hết kết quả đều mơ hồ và cần được dán nhãn hoặc đánh giá thủ công thêm

Đây không phải là bộ chiết xuất lượng phổ quát

Mã này không phân tích tiền tệ, không phân tích hàng ngàn ký tự phân cách, hay các quy tắc thập phân, cũng không nhận diện các thuật ngữ như "khoản thanh toán kỳ hiện tại" và "số dư kỳ trước." Chỉ vì chỉ có một ứng viên không có nghĩa là doanh nghiệp đó là ý nghĩa đúng.

Bản sao quét cũng cần phải có văn bản và vị trí sẵn có trước. Các trang có lớp văn bản nhưng nội dung không chính xác không được phép chỉ vì chúng có thể bị sao chép.

Bài viết này sử dụng trang composition không xoay. Khi trang thực quay, trước tiên chỉ định xem hộp truy vấn đến từ màn hình hiển thị hay trích xuất tọa độ, và chỉ chuyển đổi nếu cần thiết. Không nhân với ma trận bất kể nguồn nào.

Khi lưu các trang nguồn, hãy phân biệt giữa chỉ mục 0-0 và số trang hướng về người dùng để tránh nhầm tưởng rằng không có bằng chứng khi kiểm tra các trang liền kề.

🎯 Phương pháp nào phù hợp với bạn?

Nếu bạn cần trích xuất dữ liệu từ biểu mẫu bố cục cố định

Đầu tiên, giới hạn khu vực nơi trường kinh doanh được đặt, sau đó tra cứu số tiền và lưu số trang, hình chữ nhật và phiên bản quy tắc.

Nếu bạn gặp nhiều ứng viên

Đừng chọn phương án đầu tiên trực tiếp; trả về tất cả ứng viên và xác định các trường kinh doanh dựa trên thẻ hoặc đánh giá thủ công.

Nếu trang của bạn thường xuyên không có lượt truy cập

Đầu tiên, kiểm tra xem tọa độ khu vực, số lượng và lớp văn bản có tồn tại không, sau đó quyết định điều chỉnh phạm vi hoặc chuyển sang các tuyến trích xuất khác.

Nếu bạn muốn dịch tài liệu

Các chi tiết quan trọng như số lượng, ngày tháng và số lượng được đưa vào kiểm tra thủ công, với sự phân chia công việc rõ ràng giữa kiểm tra kỹ thuật và kiểm tra thủ công.

Để lại các số quan trọng cho việc xem xét dịch thuật

Dịch tài liệu không chỉ dựa trên sự lưu loát câu mà còn dựa trên các yếu tố chính như số lượng, ngày tháng và số lượng. OmniDoc (Mục sản phẩm) cung cấp nhiều cổng dịch tài liệu, và so sánh song ngữ được giới thiệu trên trang web chính thức có thể đóng vai trò là điểm khởi đầu để xem xét; Kịch bản định vị phối hợp phù hợp để bảo tồn bằng chứng gốc và giúp xác định các khu vực có vấn đề.

Khuyến nghị nên đánh giá trước bằng mẫu giảm nhạy cảm mà bạn đã cho phép tải lên. Khi bản dịch trở nên dài hơn, vị trí nội dung có thể thay đổi hợp lý, và "tọa độ mới và cũ hoàn toàn giống nhau" không nên được xem là điều kiện cứng nhắc để dịch chính xác.

Những kiểm tra giá trị hơn là: liệu số tiền có được giữ lại hay không, liệu tiền tệ có được xác định rõ ràng hay không, và liệu nhãn mác tương ứng có còn chỉ ra cùng một ý nghĩa kinh doanh hay không.

❓ Câu hỏi thường gặp (FAQ)

1. Tại sao không thử ngay từ đầu?

Bởi vì tìm kiếm toàn văn chỉ có thể cho bạn biết số tiền xuất hiện ở đâu, và không thể xác định phần nào là trường kinh doanh. Việc trực tiếp nhận cú đánh đầu tiên có thể trông đúng, nhưng nguồn gốc có thể đã sai.

2. Tại sao hộp truy vấn lại yêu cầu bao gồm đầy đủ, thay vì chỉ chạm vào mép?

Ví dụ sử dụng phương pháp xác định được bao gồm đầy đủ để tránh coi các đoạn chưa hoàn chỉnh là kết quả hợp lệ. Nếu hộp truy vấn quá chật và không có kết quả nào, trước tiên hãy kiểm tra hệ tọa độ và phạm vi, thay vì tự động mở rộng toàn bộ trang.

3. Bạn nên làm gì khi kết quả truy vấn bằng không?

Đánh dấu nguyên nhân ứng viên và kiểm tra trang gốc; không thêm số 0. Vùng sai, số lượng bị chia hoặc thiếu lớp văn bản đều có thể dẫn đến không có kết quả trúng thảo.

4. Mã này có thể được sử dụng trực tiếp trên các tờ tiền thật không?

Không thể sử dụng trực tiếp. Ví dụ này không xử lý các ngữ nghĩa tiền tệ, dấu phân cách hàng nghìn hay ngữ nghĩa kinh doanh, và mẫu tổng hợp trong bài viết này không đại diện cho một bài kiểm tra độ chính xác cho các tờ tiền thật.

📝 Tóm tắt

Khi xác định số lượng, trước tiên hãy xác định khu vực, sau đó cung cấp toàn bộ số ứng viên cho người gọi để đánh giá. Cả số 0 và nhiều đều phải có các hành động xử lý rõ ràng. Đầu tiên, sử dụng các mẫu được chuẩn hóa để xác thực quy tắc, sau đó dần dần tích hợp các tài liệu thực tế.

Trải nghiệm ngay: Tải lên tài liệu của bạn để bắt đầu dịch, giữ nguyên định dạng gốc

Cập nhật lúc 2026-11-14