EPUB FACTORY
Tìm hiểu EPUB / Kiến thức nền
Kiến thức nền

Bên trong một tệp EPUB có gì?
giải nén ra và nhìn vào bộ máy

Một tệp EPUB thực ra là một tệp ZIP. Đổi phần mở rộng đi thì ai cũng mở ra xem được. Bài này đi qua những gì thực sự nằm trong đó khi bạn giải nén, và mỗi tệp làm việc gì. Khi đã biết bộ máy ấy, bạn có thể đoán được phải xem ở đâu khi có gì đó không hiển thị.
Trong bài này
  1. Giải nén một tệp EPUB
  2. Hình dạng tổng thể
  3. mimetype ── tệp kỳ lạ nhất
  4. container.xml ── tấm biển chỉ đường
  5. content.opf ── trái tim của cuốn sách
  6. nav.xhtml ── mục lục
  7. Chữ, CSS và ảnh
  8. Vì sao dựng bằng tay lại khó

Giải nén một tệp EPUB

Hãy bắt đầu bằng việc làm thử. Nếu có sẵn một tệp EPUB, chỉ cần thế này thôi.

1Sao chép tệp EPUB (để không làm hỏng bản gốc)
2Đổi phần mở rộng từ .epub thành .zip
3Giải nén như bình thường

Xong. Không cần phần mềm đặc biệt nào. EPUB là một tệp ZIP, nên nó bung ra mà chẳng buồn cảnh báo lấy một câu.

Chiều ngược lại thì không được

Bạn có thể nghĩ "nếu giải nén được thì nén một thư mục rồi đổi tên thành .epub sẽ ra một tệp EPUB". Không đơn giản vậy, là vì các quy tắc về cách nó phải được nén được nói tới trong phần sau.

Hình dạng tổng thể

Sau khi bung ra, nó thường trông thế này.

Thư mục đã bung ra
├── mimetype       đánh dấu chiếc hộp này là EPUB
├── META-INF/
│  └── container.xml  chỉ chỗ cuốn sách thực sự nằm ở đâu
└── OEBPS/       thư mục chứa cuốn sách
  ├── content.opf   thông tin sách, danh sách nội dung, thứ tự đọc
  ├── nav.xhtml    mục lục
  ├── text/
  │  ├── p001.xhtml  phần chữ (mỗi trang một tệp)
  │  └── p002.xhtml
  ├── image/
  │  └── cover.jpg   bìa và các ảnh khác
  └── style/
    └── book.css   hình thức

OEBPS — cái tên thư mục đó, và cách mọi thứ được chia bên trong nó, thay đổi tùy công cụ đã dựng ra nó. Nó có thể là item hoặc xhtml thay vào đó, và như vậy cũng chẳng sao.

Thứ bạn không được đổi, cả tên lẫn vị trí, là mimetype ở ngay đầu META-INF/container.xml . Hai thứ đó là cố định còn mọi thứ khác thì tự do — đó là bước một để hiểu cấu trúc.

mimetype ── tệp kỳ lạ nhất

Nội dung của nó chỉ là một dòng.

application/epub+zip

Việc của nó là tuyên bố "tệp ZIP này là một tệp EPUB". Nhưng nó đi kèm những quy tắc khắt khe mà không tệp nào khác có.

Một ứng dụng đọc có thể quyết định "đây là EPUB" chỉ bằng cách đọc vài byte đầu của tệp. Chính vì thế mà vị trí và hình thức của nó bị đóng đinh.

Đây là chỗ những tệp EPUB làm bằng tay đổ trước tiên

Nén một thư mục bằng công cụ thông thường thì bạn không chọn được thứ tự tệp, và mimetype bị nén chung với tất cả những thứ còn lại. Kết quả: bạn đổi tên nó thành .epubcác ứng dụng đọc không mở nổi.

Thỏa mãn điều kiện "đầu tiên, không nén" nghĩa là phải chạy việc nén thành hai bước tách biệt. Đó là việc đầu tiên nhất mà một công cụ dựng EPUB làm.

container.xml ── tấm biển chỉ đường

META-INF/container.xml trông như thế này.

<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
  <rootfiles>
    <rootfile full-path="OEBPS/content.opf"
      media-type="application/oebps-package+xml"/>
  </rootfiles>
</container>

Nó làm đúng một việc: nó nói "thông tin sách nằm trong OEBPS/content.opf ".

Nhờ tấm biển đó mà tên thư mục mới được tự do. Một ứng dụng đọc nhìn vào META-INF/container.xml trước rồi đi tới bất cứ đâu nó chỉ.

content.opf ── trái tim của cuốn sách

Đây là tệp quan trọng nhất trong một tệp EPUB. Nó chia làm ba phần.

PhầnViệc của nó
metadataTên sách, tác giả, ngôn ngữ — thông tin của chính cuốn sách
manifestDanh sách mọi tệp có mặt
spineThứ tự lật trang

metadata ── thông tin sách

<metadata>
  <dc:title>Alice ở xứ sở thần tiên</dc:title>
  <dc:creator>Lewis Carroll</dc:creator>
  <dc:language>vi</dc:language>
  <dc:identifier id="uid">urn:uuid:xxxxxxxx</dc:identifier>
  <meta property="dcterms:modified">2026-08-04T00:00:00Z</meta>
</metadata>

Thứ cần để mắt tới là dc:title . Cái hiện trên kệ của một ứng dụng đọc chính là giá trị này, không phải tên tệp. Bạn có đặt tên tệp cẩn thận tới đâu, nếu chỗ này để trống thì kệ sách hiện ra "Untitled".

dc:language cũng quan trọng. Hãy điền vi cho tiếng Việt, ja cho tiếng Nhật. Không có nó, một ứng dụng đọc có thể không áp dụng các quy tắc dàn chữ của ngôn ngữ — điều gây hậu quả nặng nhất với tiếng Nhật.

manifest ── danh sách tệp có mặt

<manifest>
  <item id="nav" href="nav.xhtml" media-type="application/xhtml+xml" properties="nav"/>
  <item id="p001" href="text/p001.xhtml" media-type="application/xhtml+xml"/>
  <item id="css" href="style/book.css" media-type="text/css"/>
  <item id="cover" href="image/cover.jpg" media-type="image/jpeg"/>
</manifest>

Mọi tệp trong tệp EPUB đều phải được khai báo ở đây. Thêm một tấm ảnh rồi quên khai báo, riêng chuyện đó đã là một lỗi. Chiều ngược lại — đã khai báo nhưng thực tế không có — cũng là lỗi.

Tệp mục lục được đánh dấu bằng properties="nav" , đó là cách nó nói "tệp này là mục lục".

spine ── thứ tự đọc

<spine page-progression-direction="rtl">
  <itemref idref="p001"/>
  <itemref idref="p002"/>
</spine>

manifest là danh sách những gì có bên trong; còn spinethứ tự đọc chúng. Thứ tự ở đây trở thành thứ tự trang.

Và phần quan trọng nhất với một cuốn sách tiếng Nhật là page-progression-direction .

Giá trịÝ nghĩaSách dùng nó
rtlTiến từ phải sang tráiChữ dọc, manga
ltrTiến từ trái sang phảiChữ ngang

Bỏ sót nó trong một cuốn sách dàn chữ dọc và trang sẽ lật ngược chiều. Đó là một trong những thứ đầu tiên cần kiểm tra khi chữ dọc không chạy đúng.

nav.xhtml ── mục lục

EPUB 3 luôn đòi mục lục phải là một tệp riêng. Nó trông như một danh sách liên kết HTML bình thường, được phân biệt bằng dấu hiệu epub:type="toc" .

<nav epub:type="toc">
  <ol>
    <li><a href="text/p001.xhtml">Chương 1</a></li>
    <li><a href="text/p002.xhtml">Chương 2</a></li>
  </ol>
</nav>

Đây là thứ hiện ra khi người đọc bấm nút mục lục. Nếu thiếu một tệp được liên kết tới, bạn có một cuốn sách không thể di chuyển bên trong.

Bạn cũng có thể thấy toc.ncx ở trong đó

Ở EPUB 2 cũ, một tệp tên là toc.ncx đảm nhiệm việc của mục lục. EPUB 3 đã thay nó bằng nav.xhtml , nhưng một số tệp EPUB vẫn kèm cả hai để các ứng dụng đọc cũ còn chạy được.

Chữ, CSS và ảnh

Từ đây trở đi thì gần như y hệt một trang web.

Chia phần chữ ra sao là tùy bạn, nhưng một tệp quá lớn sẽ khiến ứng dụng đọc trở nên ì ạch, nên chia theo chương là chuyện thường tình.

Vì sao dựng bằng tay lại khó

Như bạn đã thấy, cấu trúc của một tệp EPUB không hề phức tạp. Chữ, ảnh và các chỉ dẫn thiết kế được gói vào một chiếc hộp cùng một tấm biển chỉ đường và một bản danh sách — chỉ có thế.

Tuy vậy những quy tắc phải tuân theo thì lại rất tủn mủn.

Thiếu một cái là sách không mở được, hoặc bị trả về khi nộp lên cửa hàng. Mà nguyên nhân của lỗi thì thường không nhìn ra được từ những gì hiện trên màn hình.

Cho nên trong sản xuất thực tế người ta dùng một công cụ lắp ráp cấu trúc từ một bản thảo hoặc từ ảnh. Dù vậy, từng nhìn vào bên trong một lần nghĩa là bạn có thể đoán được phải xem ở đâu khi có gì đó trục trặc — và đó chính là mục đích của bài này.

Cấu trúc được lắp ráp giùm bạn

EPUB FACTORY tự động dựng mọi phần của cấu trúc được mô tả ở đây. Chỉ cần chọn một thư mục ảnh hoặc một bản thảo văn bản. Không cần tài khoản, không cần cài đặt.

Dùng thử EPUB FACTORY