Copy text từ PDF bị loạn: encoding, ligature, CID font — nguyên nhân và workaround
Copy text ra bị loạn ký tự: do encoding issue, ligature, CID font. Giải thích tại sao và cách xử lý.
Copy đoạn text từ PDF, paste vào Word xong thấy: "T h ủ t ụ c đ ă n g k ý" (mỗi chữ cách nhau 1 khoảng trắng). Hoặc tệ hơn: "ÐIU KIN ĐĂNG KÝ" thay vì "ĐIỀU KIỆN ĐĂNG KÝ". Hoặc paste ra thứ tự dòng bị xáo trộn — dòng bên phải nhảy lên trước dòng bên trái.
Mình gặp chuyện này tuần nào cũng 2-3 lần, đặc biệt với file PDF từ cơ quan nhà nước và file scan cũ. Sau nhiều lần research + thử, đây là tất cả nguyên nhân và cách xử lý.
Chẩn đoán nhanh
| Bạn paste ra và thấy... | Nguyên nhân | Fix tốt nhất |
|---|---|---|
| Khoảng trắng giữa mỗi ký tự: "H ợ p đ ồ n g" | PDF dùng character spacing thay vì ghi text liên tục | Copy → Find & Replace bỏ space thừa, hoặc OCR lại |
| Ký tự lạ: ÐIU, ñaêng kyù, ‡áng | Font CID hoặc encoding VNI/TCVN3, ToUnicode map thiếu | OCR lại file → lấy text từ OCR |
| Chữ dính liền: "hợpđồng", "ngàytháng" | Ligature hoặc font không có word boundary rõ | OCR lại, hoặc regex tách từ |
| Thứ tự dòng bị đảo (cột phải lên trước cột trái) | Multi-column layout, PDF reader đọc sai thứ tự | Copy từng cột riêng, hoặc dùng tool extract text |
| Dấu tiếng Việt bị tách: "Hươ'ng" thay "Hướng" | Combining characters hoặc font custom glyph | OCR lại |
| Paste ra hoàn toàn trống (không có text) | File scan — text là hình ảnh, không phải text thật | OCR để tạo text layer |
Hiểu nguyên nhân gốc: PDF lưu text khác bạn tưởng
Nhiều người nghĩ PDF lưu text giống file Word — từng dòng, từng đoạn. Sai. PDF lưu text dưới dạng "đặt ký tự X ở tọa độ (a, b) với font Y size Z". Không có khái niệm "word" hay "paragraph" trong cấu trúc PDF cơ bản.
Khi bạn Ctrl+C trong PDF reader, phần mềm phải đoán thứ tự đọc dựa trên tọa độ. Nếu 2 cột text nằm cạnh nhau → reader có thể đọc sang ngang thay vì đọc hết cột trái rồi mới sang phải.
Case 1: Khoảng trắng thừa — "H ợ p đ ồ n g"
File PDF tạo từ một số phần mềm cũ (PageMaker, CorelDRAW cũ, một số printer driver) ghi mỗi ký tự riêng biệt với tọa độ tuyệt đối. Khi copy, reader thấy khoảng cách giữa các ký tự → chèn space.
Fix nhanh:
- Paste vào Word/Notepad → Find & Replace: tìm 2 space liên tiếp, thay bằng 1 space. Lặp lại cho đến khi hết.
- Hoặc dùng regex: thay
(\w)\s(\w)bằng$1$2— nhưng cẩn thận với tiếng Việt có dấu.
Fix triệt để: Chạy OCR lại file. OCR engine "nhìn" ảnh render của trang và nhận diện text từ hình → cho ra text liền mạch đúng.
Case 2: Ký tự lạ — CID font và ToUnicode map
Đây là case khó nhất. PDF dùng font CID (Character Identifier) — font này ánh xạ (map) mỗi ký tự sang một ID nội bộ. Để copy text ra đúng, PDF cần có bảng "ToUnicode" — bảng này nói "ID 47 = chữ Đ", "ID 283 = chữ ứ".
Vấn đề: nhiều file PDF (đặc biệt từ phần mềm cũ Việt Nam, hoặc file xuất từ máy in ảo không chuẩn) thiếu bảng ToUnicode. Khi copy → reader không biết ID nào là chữ gì → trả về ký tự sai hoặc ô trống.
Cách nhận biết: Mở Properties → Fonts → thấy font tên kiểu "ABCDEF+TimesNewRoman" (có prefix 6 ký tự) mà không ghi "Embedded Subset" → khả năng cao bị lỗi này.
Fix: Không có cách fix trực tiếp bảng ToUnicode (trừ khi bạn biết dùng tool chuyên dụng như QPDF + edit hex). Cách thực tế nhất: OCR lại file. Engine OCR đọc hình ảnh, không phụ thuộc vào font mapping.
Case 3: Thứ tự đọc bị xáo — multi-column
File có 2 cột (báo, tạp chí, một số biểu mẫu nhà nước) → reader đọc ngang từ trái sang phải thay vì đọc hết cột trái rồi sang cột phải.
Ví dụ: File biểu mẫu có bên trái là "Họ tên: Nguyễn Văn A" và bên phải là "Ngày sinh: 01/01/1990". Copy ra được: "Họ tên: Ngày sinh: Nguyễn Văn A 01/01/1990" — lẫn lộn.
Fix:
- Dùng chuột chọn (select) từng cột riêng → copy riêng
- Trong Adobe Reader: Edit → Preferences → General → bật "Make Hand tool select text" — giúp select chính xác hơn
- Dùng tool extract text chuyên dụng (pdftotext với flag
-layout) — giữ nguyên layout gốc
Case 4: File scan — copy ra trống
Nếu paste ra hoàn toàn trống hoặc chỉ được vài ký tự rác → file là ảnh scan, không có text layer. Đây không phải "lỗi" — file đúng là không có text để copy.
Fix duy nhất: Chạy OCR để engine nhận diện ký tự từ ảnh và tạo text layer. Sau khi OCR xong, file sẽ copy text bình thường.
Tóm lại: flowchart xử lý
| Bước | Kiểm tra | Hành động |
|---|---|---|
| 1 | Thử select text trong PDF | Không select được → file scan → OCR |
| 2 | Copy paste thử 1 đoạn | Ra trống → file scan → OCR |
| 3 | Paste ra ký tự lạ | Font CID/VNI → OCR |
| 4 | Paste ra space thừa | Find & Replace hoặc OCR |
| 5 | Thứ tự sai | Select từng vùng, hoặc pdftotext -layout |
Như bạn thấy, phần lớn case đều quy về 1 giải pháp: chạy OCR lại file PDF. OCR engine nhìn file như mắt người nhìn — không phụ thuộc vào encoding hay font mapping bên trong. Đó là lý do mình coi OCR như "nút reset" cho mọi vấn đề text trong PDF.
Dùng ngay: OCR PDF — Chuyển PDF scan thành văn bản có thể tìm kiếm
Nhận dạng văn bản OCR trong PDF scan online miễn phí. Hỗ trợ tiếng Việt có dấu. Chuyển ảnh scan thành text copy được, tìm kiếm được. Sử dụng Tesseract — chính xác và nhanh.
Mở công cụ →