PDF hoạt động như thế nào? Cấu trúc header, body, xref — tại sao khó edit

Giải thích cấu trúc file PDF: header, body, cross-reference table, trailer. Tại sao edit PDF khó hơn Word.

Chắc bạn từng thắc mắc: sửa file Word thì dễ, thêm 1 chữ vào giữa câu là text tự xuống dòng. Nhưng sửa PDF thì cực — thêm 1 chữ có khi tràn ra ngoài khung, xóa 1 đoạn thì để lại khoảng trống. Tại sao lại thế?

Lý do ngắn gọn: PDF không phải document để soạn thảo — nó là bản in điện tử. Mỗi ký tự được "đặt" vào tọa độ cố định trên trang, giống như dán sticker lên giấy. Không có "flow", không có "đoạn văn", không có "xuống dòng tự động".

Hiểu điều này, bạn sẽ đặt đúng kỳ vọng khi dùng tool PDF — và biết khi nào nên dùng tool nào.

PDF ra đời để làm gì?

Adobe tạo PDF năm 1993. Mục tiêu duy nhất: file mở ra phải trông giống hệt nhau trên mọi máy. Không phụ thuộc hệ điều hành, không phụ thuộc font cài sẵn, không phụ thuộc phần mềm mở.

Để đảm bảo "giống hệt", PDF lưu vị trí chính xác của từng ký tự trên trang — tọa độ (x, y), font, size, màu. Giống bạn dùng Photoshop đặt từng chữ lên canvas, chứ không phải gõ text trong Word.

Hệ quả:

  • Hiển thị luôn giống nhau → tuyệt vời cho chia sẻ, in ấn
  • Chỉnh sửa rất khó → vì không có "text flow"
  • Mỗi element độc lập → ghép/cắt trang nhanh, nhưng sửa nội dung chậm

Bên trong file PDF có gì?

Mở 1 file PDF nhỏ bằng Notepad++ (thử đi, mở được), bạn sẽ thấy 4 phần:

1. Header — dòng đầu tiên

%PDF-1.7

Chỉ vậy thôi. Nói cho máy biết "đây là file PDF, version 1.7". Đa số file hiện nay là 1.4 đến 1.7. Version 2.0 tồn tại nhưng hiếm gặp ngoài đời.

2. Body — phần to nhất

Tất cả nội dung nằm ở đây: text, ảnh, font, bookmark, form. Mỗi thứ là 1 "object" được đánh số:

5 0 obj
<<
  /Type /Page
  /MediaBox [0 0 595 842]
  /Contents 6 0 R
>>
endobj

Đoạn trên là 1 trang PDF — kích thước 595×842 points (= A4). Nội dung trang nằm ở object số 6 (cái 6 0 R là "reference" — trỏ sang object khác).

Và nội dung trang trông kiểu thế này:

BT
/F1 12 Tf
100 700 Td
(Xin chao) Tj
ET

Dịch ra: "Dùng font F1 size 12, đặt con trỏ ở tọa độ (100, 700), vẽ chữ 'Xin chao'". Không có line break, không có paragraph — chỉ có tọa độ và ký tự.

Chính vì thế, khi tool "edit PDF" thêm 1 chữ — nó phải tính toán tọa độ, chứ không thể "chèn vào giữa câu" như Word.

3. Cross-reference table (xref)

xref
0 8
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
...

Bảng tra cứu: object nào ở byte thứ mấy trong file. Giống mục lục cuối sách — PDF viewer đọc cái này trước, rồi nhảy thẳng đến object cần hiển thị. Không cần đọc từ đầu đến cuối.

Nhờ xref mà bạn mở file 500 trang vẫn nhanh — viewer chỉ load trang đang xem, không parse toàn bộ file.

4. Trailer — cuối file

trailer
<< /Size 8 /Root 1 0 R >>
startxref
1234
%%EOF

Trỏ đến: gốc của toàn bộ cây document và vị trí xref. Fun fact: PDF viewer đọc file từ cuối lên — tìm %%EOF trước, rồi nhảy đến trailer, rồi xref, rồi mới render trang.

Tại sao edit PDF khó — so với Word

Thao tácTrong WordTrong PDF
Thêm 1 chữ vào giữa câu Gõ → text tự reflow Phải dời tất cả ký tự sau sang phải (tọa độ mới). Nếu tràn dòng → phải tính lại toàn bộ trang
Xóa 1 đoạn Delete → đoạn dưới dồn lên Xóa objects → để lại khoảng trống (vì elements khác vẫn giữ tọa độ cũ)
Đổi font Select → đổi tên font Phải embed font mới vào file, map lại glyph, tính lại width từng ký tự (vì font khác nhau có width khác nhau)
Thêm 1 trang Page break tự động Tạo page object mới + thêm vào page tree + rebuild xref. Nhưng thao tác này lại dễ vì không cần đọc nội dung

Quy tắc: Thao tác ở cấp "trang" (ghép, cắt, xoay) → dễ, nhanh. Thao tác ở cấp "nội dung bên trong trang" (sửa text, di chuyển ảnh) → khó, chậm, dễ lỗi.

Các tool PDF xử lý ở mức nào?

Mức 1: Thao tác trang — dễ nhất

Ghép, cắt, xoay, sắp xếp. Chỉ cần thay đổi page tree — thêm/bớt/đổi thứ tự page objects. Không cần đọc nội dung bên trong trang.

Vì đơn giản → chạy được bằng JavaScript trên trình duyệt (AloPDF dùng pdf-lib cho nhóm này). Nhanh, an toàn, file không đi đâu.

Mức 2: Thêm layer mới — trung bình

Watermark, số trang, annotation. "Vẽ thêm" lên trên trang hiện tại — không sửa gì bên dưới. Giống dán sticker lên bức tranh.

Cũng chạy client-side được. Watermark = overlay text object với opacity thấp. Số trang = thêm text object ở header/footer.

Mức 3: Nén, chuyển đổi — cần engine server

Nén PDF cần re-encode ảnh (Ghostscript). Convert sang Word cần nhận dạng structure (LibreOffice). Convert sang JPG cần render pixel (Poppler).

Những thứ này JavaScript không làm nổi (hoặc làm rất chậm) → phải server-side.

Mức 4: OCR — phức tạp nhất

File scan chỉ có ảnh, không có text object. OCR phải: extract ảnh → pre-process → nhận dạng ký tự → tạo invisible text layer đặt đúng vị trí → rebuild PDF.

Tốn thời gian nhất, dễ sai nhất (phụ thuộc chất lượng scan). Dùng Tesseract engine.

Mấy thứ "ẩn" trong PDF mà ít người biết

  • Metadata: Tên người tạo, tên máy tính, phần mềm tạo, ngày giờ. Mình từng gửi proposal cho khách — metadata ghi tên đối tác khác (vì copy từ file cũ). Hơi kỳ.
  • Revision history: Khi bạn edit PDF rồi save, bản cũ vẫn nằm trong file (incremental save). Người có tool phù hợp có thể "undo" để xem nội dung bạn đã xóa.
  • Embedded files: PDF có thể chứa file đính kèm bên trong (attachments). Đôi khi file nặng bất thường là vì có attachment ẩn.

Tip: Trước khi gửi file quan trọng cho bên ngoài — export lại thành PDF mới (File → Print → Save as PDF). File mới sẽ "sạch" metadata và history.

Tóm lại — quy tắc khi làm việc với PDF

  1. Giữ file nguồn (Word/Excel/InDesign). PDF là output cuối — không phải file để sửa đi sửa lại.
  2. Ghép/cắt/xoay thì cứ thoải mái. Nhanh, không ảnh hưởng chất lượng, chạy trên trình duyệt.
  3. Cần sửa nội dung nhiều → convert sang Word trước. Sửa xong export lại PDF. Đừng cố edit trực tiếp trong PDF — sẽ lệch layout.
  4. File từ scan = file ảnh. Không có text searchable. Cần OCR để "thêm" text vào.
  5. Nén ảnh hưởng ảnh, không ảnh hưởng text. File toàn text → nén mạnh thoải mái.

Muốn kiểm chứng? Mở 1 file PDF nhỏ bằng VS Code hoặc Notepad++. Tìm %PDF- ở đầu, %%EOF ở cuối, và xref ở giữa. Đếm số lần xuất hiện obj — đó là số objects trong file. Khá thú vị khi nhìn "bên trong" lần đầu.

Dùng ngay: Chỉnh sửa PDF — Thêm văn bản, ghi chú vào file PDF

Chỉnh sửa file PDF online miễn phí. Thêm chữ, ghi chú, chú thích vào PDF không cần phần mềm. Xử lý 100% trên trình duyệt, hỗ trợ tiếng Việt có dấu — bảo mật tuyệt đối.

Mở công cụ →

Bài viết liên quan

OCR engine so sánh: Tesseract vs EasyOCR vs PaddleOCR — tiếng Việt So sánh 3 engine OCR cho tiếng Việt: kiến trúc, ưu nhược, tốc độ, độ chính xác trên văn bản Việt. Bảo mật PDF thực sự an toàn? AES-128 vs 256, owner vs user password AES-128 vs AES-256, owner password vs user password. Tại sao "gỡ mật khẩu" hoạt động và giới hạn bả… PDF/A lưu trữ dài hạn: 1b vs 2b vs 3b — yêu cầu lưu trữ Việt Nam PDF/A-1b vs 2b vs 3b: khác biệt, use case, và yêu cầu lưu trữ theo Luật Lưu trữ 2024 Việt Nam. Lossy vs Lossless nén PDF: JPEG vs FLATE — khi nào mất dữ liệu là OK JPEG (DCT) vs FLATE (zlib) trong PDF. Khi nào nén mất dữ liệu chấp nhận được, khi nào phải giữ nguy…