Tạo ứng dụng đọc sách điện tử với EPUB (Phần 1- Cấu trúc Epub)

alt

Trong bài này tôi sẽ giới thiệu cách để tạo riêng cho mình 1 trình đọc sách điện tử trên Android. Và trong bài này tôi sẽ hướng chủ yếu tới sách điện tử định dạng Epub

Bài này tôi sẽ chia thành 2 phần:

+ Phần 1: Giúp bạn hiểu được cấu trúc file Epub
+ Phần 2: Đi sâu vào đọc và trình bày nội dung epub lên ứng dụng

1. Giới thiệu Epub

EPUB 3.0 là phiên bản mới nhất của định dạng sách điện tử (e-book) tiêu chuẩn XML, đã sử dụng các công nghệ web hiện đại như HTML5 và CSS3. Nó vẫn tập trung vào XML bằng cách giữ lại tính năng tuần tự hóa XHTML và bổ sung thêm các phụ trợ, chẳng hạn như MathML và SVG. EPUB 3 cung cấp một loạt các tùy chỉnh để phát triển các ấn phẩm số bản địa, tiên tiến. Trong bài này, hãy tìm hiểu cách tạo ra các trang sách có bố cục trình bày phong phú bằng cách sử dụng các tính năng mới trong EPUB 3

2. Cấu trúc 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.

Hình thư mục gốc khi đã giải nén file epub

alt Thư mục META-INF alt Thư mục OEBPS alt

Trong 1 file epub cần phải có ít nhất những file/folders sau:

  • Mimetype : báo cho phần mềm đọc sách/hệ thống biết trong đây là gì
  • Thư mục META-INF : trong thư mục này phải có file container.xml để cho ứng dụng đọc sách tìm được nội dung sách
  • Thư mục OEBPS: Là nơi chứa nội dung cuốn sách. Bao gồm: + Thư mục images: chứa ảnh ở đây + Content.opf :file xml chưa danh sách các file trong epub + Toc.ncx : Mục lục sách + File xhtml : Nội dung sách chưa ở đây + Page-template.xpgt: file này không cần thiết nhưng sẽ trông đẹp hơn trong Adobe Digital Editions

Mimetype

File này chỉ chứa chuỗi “application/epub+zip” hệ điều hành có thể nhìn nhận ra đây là file epub thay vì dùng đuôi mở rộng “.epub”. File epub được đóng gói như file zip và không được phép nén dữ liệu

Thư mục META-INF

Thư mục này chứa container.xml và sẽ chỉ ra file content.opf nằm ở đâu. Thư mục này giống nhau trên mọi e-book.

Thư mục OEBPS

alt Thông thường thư mục này chứa nội dung cuốn sách. Nếu muốn đặt chỗ khác thì phải được chỉ rõ trong file content.opf

a) Thư mục images

Ảnh của eBook sẽ được để tại đây. (thực ra cũng không bắt buộc nếu như đã chỉ định rõ ràng)

b) Content.opf

File này cho biết danh sách các file nội dung cuốn sách. Định nghĩa theo thứ tự và chứa metadata (tác giả, tên sách, ...) Tên file content.opf có thể thay đổi nhưng phải được định nghĩa trong container.xml

?xml version="1.0" encoding="UTF-8"??>
<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookID" version="2.0" >
    <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
        <dc:title>Sample .epub eBook</dc:title> 
        <dc:creator opf:role="aut">Yoda47</dc:creator>
        <dc:language>en-US</dc:language> 
        <dc:rights>Public Domain</dc:rights> 
        <dc:publisher>Jedisaber.com</dc:publisher> 
        <dc:identifier id="BookID" opf:scheme="UUID">jedisaber06282007214712</dc:identifier>
    </metadata>
    <manifest>
        <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
        <item id="style" href="stylesheet.css" media-type="text/css" />
        <item id="pagetemplate" href="page-template.xpgt" media-type="application/vnd.adobe-page-template+xml" />
        <item id="titlepage" href="title_page.xhtml" media-type="application/xhtml+xml" />
        <item id="chapter01" href="chap01.xhtml" media-type="application/xhtml+xml" />
        <item id="chapter02" href="chap02.xhtml" media-type="application/xhtml+xml" />
        <item id="imgl" href="images/sample.png" media-type="image/png" />
    </manifest>
    <spine toc="ncx">
        <itemref idref="titlepage" />
        <itemref idref="chapter01" />
        <itemref idref="chapter02" />
    </spine>
</package>

Trong đó:

  • Dc: title – tiêu đề của sách
  • Dc: language – xác định ngôn ngữ sử dụng trong nội dung sách. Xác định ngôn ngữ theo mã code ISO 639-1 Code (http://www.loc.gov/standards/iso639-2/php/code_list.php )
  • Dc: identifier – là mã xác sách. Mã này là duy nhất và để phân biệt sách này với sách khác Tiếp theo là manifest khai báo các file nội dung. Tuy nhiên có thể xem ở trong file NCX

Spine là phần khai báo mục lục

c) Toc.ncx

Đây là file xác định mục lục cuốn sách.

<?xml version="1.0" encoding="UTF-8"?>
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">

<head>
    <meta name="dtb:uid" content="jedisaber.com06282007214712"/>
    <meta name="dtb:depth" content="1"/>
    <meta name="dtb:totalPageCount" content="0"/>
    <meta name="dtb:maxPageNumber" content="0"/>
</head>

<docTitle>
    <text>Sample .epub eBook</text>
</docTitle>

<navMap>
    <navPoint id="title_page" playOrder="1">
        <navLabel>
            <text>Title Page</text>
        </navLabel>
        <content src="title_page.xhtml"/>
    </navPoint>

<navPoint id="chapter01" playOrder="2">
    <navLabel>
        <text>Chapter 1</text>
    </navLabel>
    <content src="chap01.xhtml"/>
</navPoint>

<navPoint id="chapter02" playOrder="3">
    <navLabel>
        <text>Chapter 2</text>
    </navLabel>
    <content src="chap02.xhtml"/>
</navPoint>
</navMap>
</ncx>

Lưu ý: + Bảo đảm rằng uid khớp với bên trong content.opf + Phải có tag navpoint.

NavPoint TAG:

<navPoint id="chapter01" playOrder="1">
     <navLable>
          <text>Chapter 1</text>
     </navLable>
     <content src="chap01.xhtml" />
</navPoint>

Mỗi 1 navPoint tag là 1 chapter truyện gồm :

  • Id: là id của chương
  • PlayOrder: là thứ tự của chương trong mục lục
  • <text>title</text>: là tên chương
  • <content src="chap01.xhtml" />: là nguồn trang (hoặc là file html)

Lời kết

Trong phần tiếp theo tôi sẽ trình bày cách triển khai code để có thể hiển thị nội dung epub lên ứng dụng.

Tài liệu tham khảo

  1. http://www.jedisaber.com/eBooks/Introduction.shtml
  2. https://www.ibm.com/developerworks/vn/library/opensource/201301/x-richlayoutepub/

Linh Git: Đang cập nhật