Formats2026-08-255 phút đọc

OCR đọc PDF scan như thế nào, và vì sao công cụ này trả về Markdown

PDF scan là ảnh chụp chữ. Điểm cuối OCR này trả về Markdown chứ không phải PDF có lớp chữ ẩn. Auto dùng chữ sẵn có; Force OCR đọc lại từng trang.

PDF123 · Updated 2026-09-19

Một PDF scan lưu các trang dưới dạng ảnh raster: ảnh chụp chữ, không phải ký tự chọn được. OCR (nhận dạng ký tự quang học) nhìn vào các pixel đó, đoán hình nào là ký tự, rồi phát ra chữ thật. Trên PDF123, việc này chạy như một công cụ trình duyệt miễn phí và như POST /api/v1/misc/ocr-pdf; phản hồi là Markdown, không phải một PDF được viết lại.

Diagram of a scanned page before OCR (image only) and after (text aligned to the page). Many PDF OCR tools write that text back as a hidden layer; this site's endpoint returns Markdown instead.

Scan vẫn là một bức ảnh

OCR không làm sạch, không làm nét cũng không thay bitmap. Một bản scan rõ mà OCR đọc sai vẫn trông rõ. Ảnh chưa bao giờ là nút thắt chất lượng; khâu nhận dạng mới là: đổi engine nhận dạng trên cùng một lô bản scan, độ chính xác có thể lệch một khoảng lớn, dù pixel không hề thay đổi.

OCR PDF kiểu cổ điển ghi thêm một lớp chữ vô hình căn dưới ảnh, để thao tác chọn và tìm kiếm rơi đúng vào từ. Đó là điều hình minh họa thể hiện, và nhiều công cụ desktop vẫn làm theo cách này.

Điểm cuối này thực sự trả về gì

Route OCR gọi /api/v1/misc/ocr-pdf, chạy trên một crate Rust độc lập tên pdf-inspector (được build kèm feature ocr). Nó không đưa nguyên cả PDF cho một mô hình nhận dạng. pdf-inspector trước tiên phân loại từng trang: hoặc đã có chữ gốc trích xuất được, hoặc chỉ là ảnh. Trang có chữ gốc giữ nguyên chữ đó và không bao giờ chạm vào mô hình nhận dạng; trang chỉ có ảnh thì đi qua pipeline nhận dạng—PDFium (chính renderer mã nguồn mở mà Chrome dùng nội bộ) rasterize trang đó, rồi ONNX Runtime chạy mô hình PP-OCRv6 Small để đọc nó. Cả hai loại trang được ghép lại theo đúng thứ tự thành một tài liệu Markdown duy nhất, đó là lý do phản hồi là text/markdown và tệp tải về kết thúc bằng .md.

Hợp đồng đó là điều mới của lần viết lại này. Backend Java/Spring Boot cũ mà dự án từng chạy gọi OCRmyPDF, cách làm cổ điển "ảnh cộng lớp chữ ẩn", và trả về một PDF. Bản viết lại bằng Rust thay toàn bộ đường đó bằng OCR chọn lọc của pdf-inspector, và đầu ra chuyển từ PDF sang Markdown theo cùng lúc. Backend Java cũ từ đó đã bị gỡ bỏ hoàn toàn khỏi repository; đây không phải một công tắc mà bạn có thể bật lại.

Nếu bạn cần một PDF tìm kiếm được (ảnh kèm lớp chữ), đây là đầu ra sai. Nếu bạn cần chữ để agent hay pipeline đọc, Markdown mới là mục đích.

Auto và Force OCR

Form có trường ocrType:

  • Normal (mọi giá trị khác force-ocr) ánh xạ sang Auto: dùng chữ sẵn có ở nơi tệp đã có, chạy OCR trên các trang chỉ có ảnh. Với PDF born-digital sạch, Auto không nạp runtime OCR.
  • Force OCR (ocrType=force-ocr) chạy lại nhận dạng trên mọi trang, kể cả trang đã có lớp chữ. Trên trang thật sự chỉ có ảnh, bạn trả thêm thời gian chứ không thêm độ chính xác; đổi lại, nó bỏ qua một lớp chữ hiện có đã hỏng hoặc thiếu.

Mặc định của portal là Force OCR. Không có điều khiển ngôn ngữ: các mã tessdata còn lại từ đường Java cũ bị bỏ qua.

Việc tách Auto/Force diễn ra bên trong request, và cả portal lẫn capability probe của API đều không kiểm tra trước giúp bạn. GET /api/v1/settings/get-endpoints-status luôn báo ocr-pdf là "enabled", mà không thực sự xác minh PDFium, ONNX Runtime, hay mô hình PP-OCRv6 đã được cài hay chưa. Việc kiểm tra thật chỉ xảy ra ngay khi một request kích hoạt nhận dạng: nếu thiếu bất kỳ thành phần nào, endpoint trả về 503, chứ không phải một Markdown suy giảm âm thầm rơi về chỉ dùng chữ gốc. Bản thân mô hình PP-OCRv6 Small nặng khoảng 31 MB; trừ khi đã được nạp sẵn vào cache cục bộ lúc deploy, nó sẽ tải qua mạng ngay lần đầu một trang thực sự cần nhận dạng. Một máy offline mà không có model nạp sẵn nhiều khả năng sẽ fail ngay tại request Force đầu tiên, chứ không chỉ chạy chậm.

Nhận dạng mang tính xác suất

Các engine khớp mẫu pixel với mô hình chữ cái và từ. Chúng làm tốt trên bản in sạch, tương phản cao, font chuẩn, và kém hơn trên:

  • Bản scan độ phân giải thấp hoặc tương phản thấp (chất lượng fax so với bản gốc 300 DPI)
  • Chữ viết tay, font trang trí, bố cục lạ (bảng nhiều cột, chữ xoay, biểu mẫu dày đặc)
  • Trang bị nghiêng làm méo hình glyph vừa đủ để gây nhầm lẫn

Một bản fax mờ sẽ không OCR như một bản scan sạch, bất kể Auto hay Force. Đó là giới hạn của chính mô hình, không phải thứ một tham số có thể sửa được.

OCR không làm gì

OCR cho bạn chữ. Nó không dựng lại đoạn, tiêu đề, bảng hay một tài liệu Word chảy lại được. Bố cục chỉnh sửa được là bài toán chuyển đổi nằm trên lỗi nhận dạng, không cùng loại việc với đọc một bản scan.

OCR PDF chạy phía server, không cần tài khoản. Tệp tải về là Markdown. Nếu lớp chữ hiện có trông sai, hãy dùng Force OCR để Auto không tin lớp đó; để kiểm tra một máy có thực sự cài PDFium và model hay không, chạy một request thật đáng tin hơn đọc capability probe, vì probe chỉ xác nhận endpoint tồn tại, không xác nhận runtime của nó đã sẵn sàng. Về key tự động hóa và OpenAPI, xem Nhà phát triển.

Open tool
Process in the browser — no watermark, files removed after the job.
Open tool