
Tạo sách điện tử EPUB 3 với HTML5, CSS3 và MathML
Giới thiệu
EPUB là định dạng XML dùng cho các sách và các ấn phẩm số có khả năng tự tương thích.và
được chuẩn hóa bởi Diễn đàn xuất bản số quốc tế (IDPF). Năm 2009, EPUB 2 là định dạng sách
điện tử phổ biến được hầu hết các nhà bán lẻ và hệ thống sách điện tử lớn sử dụng.
Các tệp lưu trữ ZIP của EPUB đều được đóng gói theo một cấu trúc rõ ràng. Mỗi thành phần có
đặc tả riêng của mình, được hợp nhất dưới nhãn EPUB chung:
Đặc tả đóng gói
Định nghĩa phương pháp đóng gói một tài liệu EPUB.
Ấn phẩm EPUB
Bao gồm thông tin về các nội dung của sách điện tử: thông tin của gói package, tiêu đề
đơn giản, thông tin tác giả và—đối với EPUB 3— còn hỗ trợ thêm các tính năng nâng
cao như JavaScript hay MathML. Thành phần này được gọi là Open Container Format
file.
Các tài liệu nội dung của EPUB
Thực ra nội dung của ấn phẩm chính là các file XHTML và CSS. Nó cũng bao gồm các
tài nguyên nhị phân như hình ảnh, đa phương tiện và các tài liệu XML.
Các từ viết tắt thông dụng
CSS: Cascading stylesheet (Bản định kiểu xếp chồng)
DTD: Document Type Definition (Định nghĩa kiểu tài liệu)
HTML: Hypertext Markup Language (Ngôn ngữ đánh dấu siêu văn bản)
JAR: Java archive (Tệp nén java)
OPF: Open Packaging Format (Định dạng đóng gói mở)
SVG: Scalable Vector Graphics (Các đồ họa vector có thể mở rộng quy mô)
XHTML: Extensible Hypertext Markup Language (Ngôn ngữ đánh dấu siêu văn bản mở
rộng)
XML: Extensible Markup Language (Ngôn ngữ đánh dấu mở rộng)
XSLT: Extensible Stylesheet Language Transformations (Các chuyển đổi Ngôn ngữ bản
định kiểu mở rộng)
Bài này tìm hiểu một số tính năng của EPUB 3. Bạn sẽ tìm hiểu cách xác nhận hợp lệ các tài liệu
EPUB 3, các chỉ dẫn, phân cấp và các tài liệu hướng dẫn phát triển. Một ví dụ sẽ hướng dẫn bạn
chuyển một trang sách trẻ em thành EPUB 3. Ngoài ra, bạn sẽ tìm hiểu cách đưa MathML vào
các ấn phẩm.
Tải về các ví dụ được sử dụng trong bài này.
Điều kiện tiên quyết

Các đoạn mã và ví dụ mẫu trong bài này đều xem rằng bạn đã biết qua về EPUB 2 nói riêng và
các ấn phẩm dựa trên XML nói chung. Xem phần Tài nguyên để biết thêm chi tiết về EPUB 2.
Về đầu trang
Những thay đổi trong EPUB 3
EPUB 2 cung cấp tất cả các khả năng định dạng và trình bày của HTML4 và CSS2, là quá đủ
cho các ấn phẩm nặng về văn bản. Tuy nhiên, các nhà xuất bản và tác giả đã nhận thấy rằng
EPUB 2 không thể xử lý nhiều kiểu nội dung trong một số trường hợp như: sách đa phương tiện,
sách có bố cục phức tạp, các ấn phẩm toán học và các tài liệu tương tác. Do đó vào tháng 10 năm
2011, cộng đồng IDPF và sách điện tử đã phát hành bản đặc tả cho EPUB 3.
Các hệ thống đọc EPUB 3
Tính đến tháng 12 năm 2011, chưa có hệ thống đọc nào chính thức hỗ trợ EPUB 3. Nhiều hệ
thống đọc được viết bằng cách sử dụng các công cụ trình duyệt hỗ trợ HTML5, tuy vậy, chẳng
hạn như WebKit, nó hỗ trợ hầu hết đặc tả nội dung EPUB 3. Điều quan trọng là bạn sử dụng một
trình duyệt có hỗ trợ HTML mới nhất để kiểm tra và phát triển các tài liệu EPUB 3.
Bài này bao gồm các kỹ thuật để tạo ra các polyfill vô hại (hay còn gọi là các đoạn mã đệm) giúp
bạn xuất bản một tài liệu EPUB 3 tương thích ngay cả khi không sử dụng một hệ thống đọc
EPUB 3 đầy đủ. (Polyfill là thuật ngữ dùng để chỉ các đoạn mã javascript được dùng để cung cấp
một chức năng (hoặc công nghệ) của các trình duyệt hiện đại cho các trình duyệt cũ. Thông qua
đó, các trang web sử dụng các công nghệ mới (như HTML5) có thể chạy ổn định trên các trình
duyệt cũ chưa hỗ trợ.).
Những thay đổi của EPUB 3 so với EPUB 2:
Tài liệu đặc tả schema cho EPUB 3 đã chuyển đổi từ XHTML 1.1 sang phiên bản
XHTML của HTML5. Điều này là quan trọng cần thiết để có thể chứa các phần tử đa
phương tiện từ HTML5 (như <video>, <audio> và <canvas>).
EPUB 3 đã mở rộng phạm vi cho phép các tài liệu CSS từ một tập hợp con của phiên bản
CSS2.1 đến một tập hợp các mô đun hoàn thiện của CSS3 có liên quan đến việc soạn
thảo tài liệu.
MathML đã được thêm vào XHTML5 và SVG như là một loại nội dung quan trọng hàng
đầu.
Ngày nay, việc hỗ trợ nhiều phông chữ nhúng là bắt buộc đối với các hệ thống đọc có khả
năng hiển thị CSS. Web Open Font Format là định dạng phông chữ mở trên nền Web đã
được chấp nhận thêm vào để sử dụng.
Hỗ trợ chi tiết các kiểu trình bày hay các bố cục không theo chuẩn phương Tây, chẳng
hạn như cách trình bày trang giấy theo chiều dọc hay các kiểu của các nước châu Á khác.
Hỗ trợ tùy chọn tương tác JavaScript trung gian bằng cách sử dụng một mô hình bảo mật
tùy chỉnh.

Các tài liệu xuất bản đã được mở rộng thêm các thông tin metadata (siêu dữ liệu), bao
gồm một số hỗ trợ cho RDFa (Resource Description Framework–in–attributes: Khung
công tác mô tả tài nguyên-bằng-các thuộc tính).
Trung tâm điều hướng mở rộng NCX (Navigational Center eXtended) không tán thành
việc tạo mục lục (TOC - table of contents) dự trên XHTML5. Tuy nhiên, NCX vẫn cho
phép tương thích ngược.
Về đầu trang
Validate (xác nhận hợp lệ) các tài liệu EPUB 3
Vì EPUB 3 dựa trên khả năng tuần tự hóa của XML cho hầu hết các kiểu nội dung, nên nó tuân
thủ việc validate tự động. EpubCheck là một công cụ kinh điển để kiểm tra tính hợp lệ và sự phù
hợp của các tài liệu EPUB. Nó chính là một thư viện Java™ mở (Berkeley Software
Distribution-licensed - được cấp phép bởi hệ thống Phân phối phần mềm Berkeley). Trong bài
này, chúng ta sẽ sử dụng phiên bản dành cho nhà phát triển để làm việc với các tài liệu EPUB 3.
Xem phần Tài nguyên để tìm đường link tải phiên bản mới nhất .
Chúng tôi khuyên bạn nên sử dụng phần mở rộng .xhtml cho tất cả các tài liệu nội dung EPUB.
Bởi vì các trình duyệt sẽ không biên dịch nội dung HTML thành application/xhtml+xml nếu
thiếu phần mở rộng đó. Việc xử lý XML là bắt buộc khi làm việc với nhiều tính năng được trình
bày trong bài này, chẳng hạn như các namespace (vùng tên) CSS.
Thông thường, bạn tương tác với EpubCheck thông qua dòng lệnh sau đây.
$ java -jar epubcheck-3.0b3.jar sample.epub
Epubcheck Version 3.0b3
No errors or warnings detected.
Nếu bạn nhận được lỗi trả về java.lang.NoClassDefFoundError:
com/thaiopensource/validate/SchemaReader, bạn hãy chắc chắn rằng thư mục lib/ đang
nằm trong cùng thư mục với tệp JAR của EpubCheck.
EpubCheck 3 có thể tiến hành validate từng thành phần con riêng lẻ của gói EPUB, như trong
Liệt kê 1. Tính năng hữu ích này được sử dụng trong các ví dụ của bài này, nó:
Giúp cô lập các vấn đề.
Giảm đi việc phải đóng gói lại gói EPUB thành ZIP thì mới thực hiện validate được.
Được tích hợp trong một framework kiểm thử ở mức đơn vị (unit testing famework) dùng
cho chuỗi công cụ để xuất ra một kiểu tệp duy nhất.
Liệt kê 1. Chạy EpubCheck 3 dựa vào một kiểu tệp duy nhất

$ java -jar ~/src/epubcheck-3.0b3.jar sample-toc.xhtml -mode nav
Epubcheck Version 3.0b3
WARNING: sample-toc.xhtml: File is validated as a single file of type nav and
version 3!
Only a subset of the available tests is run!
No errors or warnings detected.
Về đầu trang
Sự điều hướng và hệ thống phân cấp trong các tài liệu EPUB 3
Mặc dù tệp TOC của NCX trong EPUB 2 đã hỗ trợ nhiều cách đánh dấu để điều hướng phân cấp
và ánh xạ tới trang tương ứng, nó được bắt nguồn từ Digital Talking Book (Sách nói số - một đặc
tả để tạo phiên bản điện tử cho các quyển sách không được in ra) của DAISY (Digital Accessible
Information System - Hệ thống thông tin số có thể truy cập được). Định dạng DAISY đã được
đặc tả rõ ràng giúp dễ dàng phát triển các trình đọc sách điện tử và hỗ trợ nhiều khả năng tiếp
cận. Từ đó, NCX có thể vận hành một cách trơn tru. Tuy nhiên, đặc tả DTD của NCX là khá lớn
bao gồm các tính năng không liên quan đến EPUB 2. Sự nhầm lẫn về việc bắt buộc phải có các
thành phần nào của NCX trong EPUB đã dẫn đến sự phân mảnh không mong muốn và tạo ra các
phần mở rộng độc quyền của một số nhà bán lẻ và các nhà cung cấp hệ thống đọc sách điện tử.
EPUB 3 không sử dụng NCX mà thay thế nó bằng END (EPUB Navigational Document – Tài
liệu điều hướng của EPUB). Liệt kê 2 cho thấy một ví dụ. END sử dụng XHTML5 chứ không
phải là một DTD tùy biến, do đó làm giảm số lượng các định dạng XML để thực thi và validate.
Các thuộc tính EPUB tùy biến được cung cấp thông qua EPUB namespace
(http://www.idpf.org/2007/ops).
Liệt kê 2. Một END tối thiểu
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:epub="http://www.idpf.org/2007/ops">
<head>
<title>Example</title>
</head>
<body>
<section epub:type="frontmatter toc">
<header>
<h1>Contents</h1>
</header>
<nav epub:type="toc" id="toc">
<ol>
<li id="chapter_001">
<a href="chapter_001.html">Chapter 1</a>
</li>
</ol>

</nav>
</section>
</body>
</html>
Phần tử <nav> của HTML5 là bắt buộc (cũng như giá trị toc của epub:type).
Khai báo END
Đặt END vào một ấn phẩm bằng cách khai báo item trong bảng kê khai manifest với giá trị nav
cho thuộc tính properties, như trong Liệt kê 3.
Liệt kê 3. Đưa một END vào một OPF (EPUB Package Document - Tài liệu đóng gói
EPUB)
<manifest>
<item id="toc"
properties="nav"
href="toc.html"
media-type="application/xhtml+xml"/>
<item id="chapter_001"
href="chapter_001.html"
media-type="application/xhtml+xml"/>
...
</manifest>
Việc đưa vào một tệp END là bắt buộc trong EPUB 3. Bạn cũng có thể thêm vào một tệp NCX
để tận dụng tính tương thích ngược, nhưng các bộ vi xử lý EPUB 3 sẽ phải sử dụng END và bỏ
qua NCX.
Tính trực quan của END
Không giống như NCX, bạn có thể đưa END vào thẳng nội dung của sách. Trong EPUB 2, nếu
bạn muốn hiển thị một mục lục tùy biến cho người sử dụng (không phải mục lục có sẵn trong các
chương trình eReader – Trình đọc sách điện tử), thì bạn phải tạo ra hai bản sao của cùng một nội
dung—một bản theo NCX và một bản tài liệu nội dung HTML. END loại bỏ sự trùng lặp này và
cho phép linh hoạt hơn nhiều trong việc trình bày một vài hay tất cả mục lục trong luồng nội
dung.
Để thêm END vào luồng nội dung, chỉ cần đặt nó vào thẻ spine của OPF, xem Liệt kê 4.
Liệt kê 4. Đưa END vào luồng nội dung