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ânFix 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.

Fun fact: File từ các phần mềm kế toán Việt Nam (MISA, Fast Accounting bản cũ) xuất PDF thường bị lỗi này vì dùng font VNI + printer driver không ghi ToUnicode. Mình đã test: 7/10 file hóa đơn từ Fast 2012 bị copy loạn.

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.

Cách phân biệt file scan vs file text: Zoom 400%. Nếu chữ vẫn sắc nét → text thật. Nếu chữ bị vỡ hạt (pixelated) → đó là ảnh scan.

Tóm lại: flowchart xử lý

BướcKiểm traHành động
1Thử select text trong PDFKhông select được → file scan → OCR
2Copy paste thử 1 đoạnRa trống → file scan → OCR
3Paste ra ký tự lạFont CID/VNI → OCR
4Paste ra space thừaFind & Replace hoặc OCR
5Thứ tự saiSelect 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ụ →

Bài viết liên quan

PDF scan bị nghiêng, mờ: deskew, denoise, DPI — cải thiện trước OCR File scan nghiêng, mờ, nhiễu → cách cải thiện: deskew, denoise, tăng DPI. Chuẩn bị tốt nhất cho OCR. PDF in ra bị cắt lề: margin, A4 vs Letter, bleed — cách fix trước khi in Lỗi in PDF bị cắt lề: do margin sai, page size A4 vs Letter, thiếu bleed. Cách kiểm tra và fix. PDF mở chậm, treo máy: file 200MB, 500 trang — nguyên nhân và xử lý File PDF 200MB, 500 trang, nhiều layer → tại sao chậm và cách xử lý: flatten, nén, tách file. PDF bị lỗi font tiếng Việt: 5 nguyên nhân và cách fix từng trường hợp Screenshot lỗi thực tế. 5 nguyên nhân: font không embed, encoding sai, converter lỗi, font VNI, sys…