PDF có yêu cầu OCR không? Sử dụng PyMuPDF để thực hiện kiểm tra trước từng trang thay vì nhận dạng lại hoàn toàn

Nếu bạn muốn OCR PDF, không cần phải nhận dạng lại toàn bộ PDF. Sử dụng PyMuPDF để xác định từng trang xem có lớp văn bản hay không và đó có phải là hình ảnh toàn trang hay không và chỉ gửi những trang thực sự cần thiết để nhận dạng. Kèm theo là các mẫu có thể chạy được, kiểm tra trang xoay và hướng dẫn ranh giới nhánh.

Khi nhiều nhóm đang xử lý việc dịch hoặc lưu trữ PDF, họ đã quen với việc gắn nhãn toàn bộ tài liệu là "được quét" hoặc "có thể sao chép" ở đầu vào. Một bản PDF 300 trang có thể có 280 trang đầu tiên chứa các lớp văn bản và chỉ 20 trang cuối cùng dưới dạng tệp đính kèm được quét. Nếu phân loại theo từng phần, toàn bộ OCR sẽ làm tăng thời gian chờ đợi và cũng có thể xác định sai số đúng ban đầu. Mặt khác, nếu bạn chỉ có thể sao chép văn bản trên trang chủ và bỏ qua OCR trên tất cả các trang thì cũng có nhiều rủi ro.

Một cách tiếp cận đáng tin cậy hơn là để mỗi trang tiến hành bước tiếp theo với kết quả của quá trình kiểm tra trước. Bài viết này thực hiện phân chia ba chiều thận trọng: trích xuất trực tiếp, gửi đến hàng đợi ứng viên OCR và kiểm tra thủ công. Nó là một phương pháp phỏng đoán kỹ thuật có thể giải thích được, không phải là một phương pháp phân loại phổ quát để đánh giá chất lượng văn bản. Sau khi đọc, bạn có thể nhận được chương trình xem trước từng trang có thể chạy được, cũng như các ranh giới chuyển hướng và các ý tưởng xử lý lỗi phổ biến.

Kết luận một câu

Không cần phải đánh giá xem PDF có yêu cầu OCR hay không. Sử dụng PyMuPDF để kiểm tra trước từng trang và chỉ gửi những trang thực sự cần được nhận dạng tới OCR.

hoàn cảnh của bạnCác phương pháp được đề xuấtlý do
Trích xuất ít nhất 40 ký tự không phải khoảng trắng từ một trangTrích xuất trực tiếp (TEXT_CANDIDATE)Đã có đủ ký tự nhưng vẫn cần kiểm tra tại chỗ các lớp OCR xấu bị ẩn
Ít hơn 40 từ và một hình ảnh chiếm ít nhất 70% trangGửi đến hàng đợi ứng viên OCRQuét toàn trang là phù hợp để nhận dạng, nhưng ảnh thuần túy cũng đủ.
Trang trống, loại vectơ, tiêu đề thưa thớt hoặc câu đố phức tạpKiểm tra thủ công (REVIEW)Những tình huống này không thể được phân loại một cách đáng tin cậy thành hai loại đầu tiên và không thể tự động bỏ qua hoặc loại bỏ.
Một tài liệu hỗn hợp 300 trangChiếu trước từng trang, chưa xử lý xongTránh OCR tất cả các trang vì có một vài tệp đính kèm được quét hoặc bỏ qua tất cả OCR vì có văn bản trên trang chủ

Lưu ý: Nội dung trong hình được lấy từ file PDF tổng hợp được tạo ra bởi đoạn code bên dưới chứ không phải file khách hàng cũng như giao diện OmniDoc. Văn bản trên trang hình ảnh là các pixel raster; văn bản trên trang văn bản có một lớp văn bản thực sự.

Quyết định những gì cần kiểm tra trước

Hai tín hiệu được sử dụng ở đây: số lượng ký tự văn bản sau khi xóa khoảng trắng và tỷ lệ diện tích trang bị chiếm bởi hình ảnh lớn nhất trên trang. Các câu trả lời trước "Đã trích xuất đủ ký tự chưa?" và cái sau giúp phân biệt giữa quét toàn bộ trang và trang trống. Vùng hình ảnh đầu tiên sẽ giao nhau với hộp cắt ảnh để tránh vượt quá tỷ lệ phóng to hình ảnh trên trang.

quan sátChuyển hướng của bài viết nàyVẫn cần được quan tâm
Ít nhất 40 ký tự không phải khoảng trắngTEXT_CANDIDATELớp OCR xấu ẩn cũng có thể chứa rất nhiều từ
Dưới 40 từ và bao phủ ít nhất 70% của một hình ảnh duy nhấtOCR_CANDIDATEẢnh thuần túy cũng đáp ứng các yêu cầu; OCR có thể không có ý nghĩa
Phần còn lại của tình hìnhREVIEWKhoảng trắng, văn bản vector, tiêu đề thưa thớt và các câu đố phức tạp đều có thể xuất hiện ở đây

Các ngưỡng 40 và 0,70 nhằm giúp bộ bài kiểm tra này dễ kiểm tra hơn, không phải để tiêu chuẩn đa ngôn ngữ. Tiếng Trung, công thức, bìa sách và các dạng viết tắt nên được ghi nhãn riêng biệt. Ở đây, hình ảnh lớn nhất theo diện tích được lấy thay vì chỉ thêm diện tích của các hình ảnh chồng lấn. Do đó, một trang quét gồm nhiều hình ảnh có thể được đưa vào REVIEW. Đây là một ranh giới được giữ lại có chủ ý.

Mẫu đầy đủ có thể chạy

Mẫu sử dụng PyMuPDF==1.28.0, không phụ thuộc vào Tesseract và không gọi bất kỳ dịch vụ OCR hoặc dịch thuật trực tuyến nào. Lưu dưới tên example.py và chạy nó trong thư mục trống. Tên tệp mà nó tạo ra được cố định cho routing-fixture.pdf. Đối với các dự án thực tế, vui lòng không ghi đè lên các tệp đầu vào.

import json
import pymupdf

def inspect_page(page):
    chars = len("".join(page.get_text().split()))
    bounds = page.cropbox
    # 图片坐标与文本坐标都是未旋转坐标;不要混用旋转后的 page.rect。
    bounds = pymupdf.Rect(0, 0, bounds.width, bounds.height)
    ratios = []
    for image in page.get_image_info():
        rect = pymupdf.Rect(image["bbox"]) & bounds
        ratios.append(max(0, rect.get_area()) / bounds.get_area())
    largest = max(ratios, default=0.0)
    route = ("TEXT_CANDIDATE" if chars >= 40 else
             "OCR_CANDIDATE" if largest >= 0.70 else "REVIEW")
    return {"page": page.number + 1, "chars": chars,
            "largest_image_ratio": round(largest, 3), "route": route}

with pymupdf.open() as source:
    page = source.new_page(width=360, height=480)
    page.insert_text((28, 60), "Sample invoice 2026-09-26", fontsize=16)
    page.insert_text((28, 100), "Quantity 12   Unit price USD 15.00", fontsize=12)
    page.insert_text((28, 132), "Amount USD 180.00   Checked manually", fontsize=12)
    scan = page.get_pixmap(matrix=pymupdf.Matrix(2, 2)).tobytes("png")
    page = source.new_page(width=360, height=480)
    page.insert_image(page.rect, stream=scan)
    source.new_page(width=360, height=480)
    source.save("routing-fixture.pdf")

with pymupdf.open("routing-fixture.pdf") as pdf:
    result = [inspect_page(page) for page in pdf]
    assert [r["route"] for r in result] == [
        "TEXT_CANDIDATE", "OCR_CANDIDATE", "REVIEW"]
    assert result[1]["chars"] == 0
    assert result[1]["largest_image_ratio"] == 1.0
    pdf[1].set_rotation(90)
    assert inspect_page(pdf[1])["route"] == "OCR_CANDIDATE"
print(json.dumps(result, indent=2))

Khi truy cập OCR, hãy lưu bộ nhớ đệm TextPage, không phải dấu hiệu thành công

Giao diện OCR của PyMuPDF là page.get_textpage_ocr(...). Tesseract và dữ liệu ngôn ngữ tương ứng cần được chuẩn bị riêng biệt. Sau khi lấy được TextPage, lần trích xuất tiếp theo nên truyền nó dưới dạng tham số textpage để tránh nhận diện trùng lặp trên cùng một trang. Để biết các phương pháp và thông số lắp đặt cụ thể, vui lòng tham khảo Tài liệu OCR PyMuPDF.

Bài viết này không chạy bộ máy OCR, vì vậy kết quả kiểm tra chỉ chứng minh rằng logic phân phối và cách sử dụng tọa độ là đúng, không đại diện cho tỷ lệ nhận diện tiếng Trung, tốc độ phục hồi bảng hay chất lượng dịch thuật. Trong môi trường sản xuất, phiên bản engine OCR, gói ngôn ngữ, số trang, tóm tắt tệp đầu vào và kết quả lấy mẫu thủ công nên được ghi lại. Đừng chỉ giữ lại chuỗi cuối cùng, nếu không sẽ khó hiểu được số đó đến từ trang nào.

Ba loại đứt gãy dễ bị bỏ qua nhất

Lớp văn bản ẩn có thể là văn bản bị nhiễu. Đạt số ký tự chỉ có nghĩa là "bạn có thể tiếp tục cố gắng trích xuất." Bạn cũng cần kiểm tra xem các ký tự thay thế, các dòng trùng lặp và trường khóa có tương ứng với kết xuất hay không. Các yếu tố then chốt như số hợp đồng và số tiền phải được kiểm tra ngẫu nhiên.

Văn bản được vẽ bởi đường vector không phải là văn bản hay hình ảnh. Họ sẽ nhập REVIEW. Không tự động đánh dấu trang là trống, và không thả trang một cách im lặng.

Sử dụng Page sau khi đóng Tài liệu sẽ dẫn đến một đối tượng không hợp lệ. Vui lòng giữ phạm vi của with pymupdf.open(...) và chỉ giải phóng tệp sau khi kiểm tra trước, render và giải nén. Để biết thêm chi tiết về tọa độ, thông tin hình ảnh và vòng đời trang, hãy tham khảo PyMuPDF Page API.

PDF không đáng tin cậy cũng nên thiết lập kích thước tệp, số trang, điểm ảnh kết xuất, thời gian và giới hạn bộ nhớ trong một tiến trình độc lập. Ví dụ chỉ kiểm thử các tệp nhỏ và không cung cấp sandbox cho các tệp độc hại. Trước khi tạo và sử dụng PyMuPDF, bạn cũng nên kiểm tra các điều khoản cấp phép và phương thức phân phối của nó.

Chuyển đổi từ luồng công việc sang quy trình dịch thuật

Một kết quả đủ điều kiện không phải là một chuỗi văn bản, mà là một bản ghi với số trang và lý do quyết định. Trước khi dịch, xác nhận những trang nào có thể được trích xuất một cách đáng tin cậy; Sau khi dịch, nội dung, con số và bố cục sẽ được xem xét lại. Bạn có thể xem các dịch vụ xử lý tài liệu trên Mục sản phẩm OmniDoc. Chương trình cục bộ trong bài viết này chạy độc lập và không dựa vào tài khoản OmniDoc, cũng không có nghĩa là nó là một thuật toán sản phẩm nội bộ.

📊 So sánh cốt lõi

Lộ trìnhĐiều kiện kích hoạtTrang phù hợpRủi ro lớn
Chiết xuất trực tiếp (TEXT_CANDIDATE)Ít nhất 40 ký tự không giãn cáchTrang thân của lớp văn bản hiện cóCác lớp OCR xấu ẩn có thể chứa văn bản bị nhiễu
Ứng viên OCR (OCR_CANDIDATE)Dưới 40 từ, với một hình ảnh chiếm ít nhất 70%Bản quét toàn trangẢnh thuần túy cũng đáp ứng yêu cầu, nhưng kết quả OCR có thể không có ý nghĩa
Kiểm tra thủ công (ĐÁNH GIÁ)Nó không đáp ứng hai nhóm trênTrang trắng, văn bản vector, tiêu đề thưa thớt, các câu đố phức tạpCần đánh giá thủ công; việc bỏ qua hoặc loại bỏ không thể tự động thực hiện

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

Nếu bạn ......

  • Xử lý tài liệu hỗn hợp, với sự khác biệt lớn về chất lượng giữa trang trước và trang sau: kiểm tra trước từng trang, mỗi trang nhập một lộ trình khác nhau.
  • Chủ yếu xử lý hợp đồng, tài liệu tài chính và các tài liệu khác chứa số khóa: Đối với trang TEXT_CANDIDATE, kiểm tra ngẫu nhiên sự tương ứng giữa số và bản hiển thị.
  • Xử lý hàng loạt các bản quét: Ghi lại các phiên bản engine, gói ngôn ngữ và số trang để lấy kết quả OCR giúp dễ dàng truy xuất nguồn gốc.
  • Nhận PDF từ nguồn không xác định: Đặt giới hạn tài nguyên trong các quy trình độc lập; không xử lý trực tiếp chúng trong quy trình chính.

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

1. Trang chủ có thể sao chép văn bản; tôi có thể bỏ qua quy trình OCR cho toàn bộ PDF không?

Không, bạn không thể. Việc có lớp văn bản ở trang đầu không có nghĩa là các trang tiếp theo cũng có; bạn nên đánh giá từng trang một.

2. Tại sao không cộng vùng ảnh trực tiếp?

Thêm các hình ảnh chồng lấn theo khu vực sẽ đánh giá quá cao tỷ lệ phủ sóng. Bài viết này lấy hình ảnh lớn nhất theo diện tích, vì vậy các trang quét được ghép lại từ nhiều hình ảnh có thể thuộc phần ĐÁNH GIÁ, đây là ranh giới có chủ ý.

3. Nếu số ký tự đạt 40, có nghĩa là chất lượng chữ vẫn ổn chứ?

Không thể kết luận như vậy. Các lớp OCR lỗi ẩn cũng có thể có nhiều ký tự, vì vậy bạn vẫn cần kiểm tra ký tự thay thế, dòng trùng lặp và các trường khóa.

4. Văn bản được vẽ theo đường dẫn vectơ nên được xử lý như thế nào?

Chúng không phải là văn bản cũng không phải hình ảnh, hãy vào REVIEW và được đánh giá thủ công; chúng không nên tự động đánh dấu là trang trống hoặc bị bỏ rơi trong im lặng.

5. Chương trình địa phương có dựa vào tài khoản OmniDoc không?

Không phụ thuộc. Chương trình cục bộ trong bài viết này chạy độc lập và không gọi bất kỳ dịch vụ OCR hay dịch thuật trực tuyến nào.

📝 Tóm tắt

Đầu tiên, hãy để lại bằng chứng từng trang trước khi quyết định có thực hiện OCR hay không. Giữ các trang không chắc chắn trong hàng đợi hiệu quả hơn là ngụy trang kết quả không chắc chắn thành công.

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-15