Tworzenie książek w formacie ePub.
Czym jest ePub
EPUB to otwarty standard opracowany przez International Digital Publishing Forum, oparty na języku XML, służący do publikowania elektronicznych książek (ebooków). Jest to bezpośredni następca rozwijanego wcześniej standardu Open eBook. Charakterystyczną cechą standardu jest to, że tworzone w nim książki są niestronicowane. Publikacje w PDF mają z góry narzucony podział na strony i wierszy.
Praktyczne znaczenie tego rozwiązania jest takie, że publikacje mogą być czytane w dowolnym czytniku - w programie zainstalowanym w komputerze stacjonarnym (jak np. Adobe Digital Editions, Stanza, Mobipocket Reader, Calibre), w telefonie komórkowym (Android lub iPhone), wreszcie w dedykowanym czytniku hardware'owym (jak Kindle, Onyx, Sony Reader). Tekst zawsze będzie się wlewać swobodnie na szerokość widocznego interfejsu, który w monitorze jest zwykle szeroki, a w smartfonach bardzo wąski.
Jest zatem oczywiste, że w wypadku elastycznie wyświetlanego wiersza trudno mówić o jakimkolwiek podziale na strony, podobnie jak w wypadku strony internetowej.
Struktura archiwum plik ePub
Plik EPUB (kontener) jest plikiem o pewnej strukturze. Przede wszystkim zauważmy, że jest to zwykłe archiwum zip, które można rozpakować - gdy zmienisz rozszerzenie pliku z .epub na .zip, będziesz mógł łatwo wczytać taki plik do dowolnego archiwizera.
Gdy zajrzysz do środka pliku zobaczysz w nim przykładową zawartość:
- plik mimetype
- folder META-INF z metadanymi publikacji
- container.xml
- folder OPS (nazwy tego folderu bywają różne, np. OEBPS, content) z zawartością publikacji - pliki XHTML (w praktyce stosuje się .html, .xhtml, .xml), CSS i inne
- folder z ilustracjami, np. o nazwie images
- obrazek1.jpg
- obrazek2.jpg
- ...
- opis struktury content.opf (nazwa jest dowolna, np. metadata.opf, mojebook.opf)
- spis treści toc.ncx
- arkusz stylów stylesheet.css
- rozdział 1 rozdzial1.xhtml
- rozdział 2 rozdzial2.xhtml
- ...
- folder z ilustracjami, np. o nazwie images
Uwaga: nazwy plików i odwołań są wrażliwe na wielkość liter, czyli PLIK.png nie jest tym samym co plik.png
Poniższa ilustracja pochodzi z dokumentu EPUB Best Practices sygnowanego przez Adobe i pokazuje zawartość kontenera EPUB.

Co ciekawe, plik EPUB można utworzyć za pomocą zwykłego notatnika, w którym piszemy zawartość, i programu do archiwizacji, za pomocą którego tworzymy plik .zip. Po zmianie rozszerzenia z .zip na .epub mamy już działający plik EPUB, który możemy wczytać do czytnika ebooków, jak Stanza, Adobe Digital Editions czy Mobipocket Reader.
Oczywiście na rynku są narzędzia wspomagające budowanie takich plików, podobnie jak w przypadku stron HTML, ale tekstowy format "wnętrza" pliku EPUB nie wymaga ich bezwględnego stosowania.
Plik mimetype
Plik mimetype, znadujący się w kontenerze na samym wierzchu, nie ma rozszerzenia, a jego zawartość składa się z jednego wiersza:
application/epub+zip
Plik ten informuje o typie kontenera - zzipowanym pliku EPUB.
Plik container.xml
Plik container.xml znajdujący się w folderze META-INF, powtarzalny w różnych ebookach (jednak z różną ścieżką full-path), wskazuje położenie content.opf. Jego przykładowa zawartość jest następująca:
<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
<rootfiles>
<rootfile full-path="OPS/content.opf" media-type="application/oebps-package+xml"/>
</rootfiles>
</container>
Plik OPF
Plik OPF (stosuje się zwykle nazwę content.opf lub metadata.opf, ale może być dowolna inna, jak choćby MojaPublikacja.opf) zawiera ogólne informacje o publikacji, manifest deklarujący pliki w publikacji oraz kolejność występowania poszczególnych rozdziałów publikacji.
Przykładowy plik OPF ma następującą postać:
<?xml version="1.0" ?>
<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:dcterms="http://purl.org/dc/terms/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:opf="http://www.idpf.org/2007/opf">
<dc:title>Moja Publikacja</dc:title>
<dc:language xsi:type="dcterms:RFC3066">pl</dc:language>
<dc:identifier id="BookId" opf:scheme="URI">PW-0001</dc:identifier>
<dc:subject>Edukacja</dc:subject>
<dc:description>Opis EPUB</dc:description>
<dc:creator>Paweł Wimmer</dc:creator>
<dc:publisher>Wimmer Digital Publishing</dc:publisher>
<dc:date xsi:type="dcterms:W3CDTF">01/20/2009</dc:date>
</metadata>
<manifest>
<item id="toc" href="/toc.ncx" media-type="application/x-dtbncx+xml" />
<item id="04500036" href="/04500036.png" media-type="image/png" />
<item id="04500038" href="/04500038.jpg" media-type="image/jpeg" />
<item id="CoverDesign" href="/CoverDesign.jpg" media-type="image/jpeg" />
<item id="style" href="/style.css" media-type="text/css" />
<item id="r1" href="/r1.html" media-type="application/xhtml+xml" />
<item id="r2" href="/r2.html" media-type="application/xhtml+xml" />
</manifest>
<spine toc="toc">
<itemref idref="r1" />
<itemref idref="r2" />
</spine>
</package>
Jak widać, plik zawiera trzy podstawowe, obowiązkowe sekcje informacji, spięte razem parzystym znacznikiem package:
- Ogólne informacje o publikacji, autorze, wydawcy itd. - metadata
- Manifest wyliczający użyte w publikacji pliki - manifest
- Deklarację kolejności wyświetlania plików składowych w publikacji - spine (czyli kręgosłup).
W sekcji ogólnej objętej znacznikami metadata - występują tu specjalne "zaklęcia" (adresy specyfikacji) oraz znaczniki ze standardowego zbioru metadanych Dublin Core - obowiązkowe są trzy elementy: tytuł (dc:title), język (dc:language) oraz identyfikator (dc:identifier) - w roli tego ostatniego może wystąpić międzynarodowy numer ISBN, ale oczywiście w przypadku indywidualnych publikacji takim nie dysponujemy, zatem może to być np. imię i nazwisko z kolejnym numerem (PWimmer001) czy adres mailowy lub strony internetowej - chodzi o jakiś unikatowy identyfikator.
Pozostałe znaczniki są opcjonalne - autor, wydawca, data, temat, opis i inne. Wygodnie wprowadza się je w programie Anthemion eCub, o którym powiemy w dalszej części podręcznika.
Zwróć uwagę, że znaczniki, jak we wszystkich dokumentach XML-owych, mają część otwierającą i zamykającą, np.:
<dc:title>Moja Publikacja</dc:title>.
Sekcja objęta znacznikami manifest zawiera listę plików użytych w publikacji. Tylko wymienione tu pliki zostaną uwzględnione podczas wyświetlania publikacji (może być ich jednak mniej, jeśli wyłączymy pewne elementy publikacji). Kolejność jest tu obojętna, a kolejność czytania elementów w publikacji jest wyznaczona w części spine.
Elementy w manifeście elementy zawierają identyfikator elementu id, odwołanie do konkretnego pliku href oraz typ medium media-type, którym może być plik xhtml, plik ze stylami, ilustracja. Jednym z elementów manifestu jest plik spisu treści toc.ncx, o którym powiemy szerzej w następnym rozdziale.
Sekcja objęta znacznikami spine, jak powiedzieliśmy, określa kolejność czytania elementów, ale dotyczy wyłącznie dokumentów XHTML, które zawierają treść publikacji. W sekcji tej odwołania dotyczą identyfikatorów przypisanych elementom treści w manifeście, czyli - w naszym akurat przypadku - r1 i r2.
Podkreślmy ponownie, że zawartość pliku OPF najwygodniej jest tworzyć za pomocą specjalnych narzędzi, które same dbają o właściwą postać kodu na podstawie podawanych danych - pokażemy to później na przykładzie Anthemion eCub. Tutaj chodzi jedynie o objaśnienie treści tego pliku, aby wszelkie działania były dobrze zrozumiałe.
Jest jeszcze jedna, opcjonalna sekcja pliku OPF, mianowicie guide, w której możemy zdefiniować główne części dokumentu, jak okładka, spis treści, przedmowa, tekst, skorowidz, bibliografia, spis ilustracji itd., przypisując do nich poszczególne pliki XHTML zawierające treść.
Spis treści
Kolejnym plikiem wchodzącym w skład konteneru EPUB jest spis treści, znajdujący się w pliku toc.ncx umieszczanym w tym samym katalogu, co treść i pliki z metadanymi.
Rodzi się zasadne pytanie, jak ma się plik toc.ncx do sekcji spine w pliku OPF, skoro oba ustalają kolejność czytania. Otóż plik ten steruje wyświetlaniem spisu treści w czytniku Adobe Digital Editions, w jego lewym panelu (pokazuje to powyższa ilustracja), a ponadto zawiera informację o wielopoziomowej hierarchii rozdziałów, łącznie z linkami do samych rozdziałów, jak i zawartych w nich sekcji.
Plik spisu treści ma następującą, przykładową zawartość:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "
http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" xml:lang="pl" version="2005-1">
<head>
<meta name="dtb:uid" content="PW-0001" />
<meta name="dtb:depth" content="1" />
<meta name="dtb:totalPageCount" content="0" />
<meta name="dtb:maxPageNumber" content="0" />
</head>
<docTitle>
<text>Moja Publikacja</text>
</docTitle>
<navMap>
<navPoint id="navPoint-1" playOrder="1">
<navLabel>
<text>Table of Contents</text>
</navLabel>
<content src="/TableOfContents.html" />
</navPoint>
<navPoint id="navPoint-2" playOrder="2">
<navLabel>
<text>Rozdział I</text>
</navLabel>
<content src="/r1.html" />
</navPoint>
<navPoint id="navPoint-3" playOrder="3">
<navLabel>
<text>Rozdział II</text>
</navLabel>
<content src="/r2.html" />
</navPoint>
</navMap>
</ncx>
W sekcji head są następujące elementy:
- dtb:uid zawiera identyfikator publikacji podany w pliku OPF, np. PWimmer0001.
- dtb:depth informuje o głębokości hierarchii spis treści - jeśli jest dwupoziomowy, wartość wynosi 2.
- dtb:totalPageCount i dtb:maxPageNumber mają wartość 0.
Sekcja docTitle podaje tytuł publikacji.
Sekcja navMap podaje właściwą hierarchię spisu treści. W tym przykładzie mamy jednopoziomowy spis treści - wszystkie rozdziały są na tym samym poziomie - ale można tworzyć spisy wielopoziomowe, które będą w taki właśnie sposób widoczne w ADE. Przykład tworzenia dwupoziomowego spisu pokazujemy w rozdziale Anthemion eCub - opcje.
Tutaj każda pozycja spisu jest objęta znacznikiem navPoint, z jednoznacznym identyfikatorem i kolejnością odtwarzania, w ramach którego jest etykieta NavLabel opisująca element (widoczna w spisie w czytniku) i odwołanie do konkretnego pliku źródłowego HTML z tekstem.
Guide
Guide to opcjonalna sekcja występująca w pliku OPF (za sekcją spine), która informuje o głównych częściach publikacji, jak strona tytułowa, spis treści, tekst, bibliografia, skorowidz, spis ilustracji itd. Adobe Digital Editions nie wykorzystuje jej, natomiast informacje w niej zawarte są widoczne w czytniku Mobipocket Reader, gdy klikniesz przycisk Contents w pasku narzędziowym czytnika.

Sekcja ma następującą, przykładową postać:
<guide>
<reference type="title-page" title="Strona tytułowa" href="/st.html" />
<reference type="toc" title="Spis treści" href="/str.html" />
<reference type="forword" title="Przedmowa" href="/pm.html" />
<reference type="text" title="Rozdział I" href="/r1.html" />
<reference type="text" title="Rozdział II" href="/r2.html" />
<reference type="text" title="Rozdział III" href="/r3.html" />
<reference type="bibliography" title="Bibliografia" href="/bg.html" />
<reference type="index" title="Skorowidz" href="/sw.html" />
</guide>
Można stosować następujące, predefiniowane typy: cover, title-page, toc (table of contents), index, glossary, acknowledgements, bibliography, colophon, copyright-page, dedication, epigraph, foreword, loi (list of illustrations), lot (list of tables), notes, preface, text.
Anthemion eCub - kreator
Anthemion eCub jest bezpłatnym kreatorem, autorstwa Juliana Smarta, ułatwiającym tworzenie ebooków w formacie EPUB. Jest dostępny dla środowisk Windows, Mac, Linux, FreeBSD i Solaris.
W rozdziale tym pokażemy, jak utworzyć pierwszą publikację, a w następnym, jakie skutki dla zawartości poszczególnych plików w kontenerze daje stosowanie rozmaitych opcji w kreatorze.
Zgromadźmy w jakimś folderze pliki XHTML i ilustracje, z których będziemy składać publikację. Program eCub ma problem z kompilowaniem ilustracji umieszczonych w podkatalogu z grafikami, zatem wszystkie pliki źródłowe umieścimy w tym samym folderze.
Po uruchomieniu programu zamykamy stronę powitalną i klikamy przycisk New, chcąc zapoczątkować tworzenie nowej publikacji. W pierwszym oknie kreatora, New Project, wprowadzamy informacje opisowe i klikamy Next. O opcjach eCub czytaj tutaj!
Stanza
Stanza jest bezpłatnym czytnikiem i konwerterem ebooków opracowanym przez firmę Lexcycle. Jest to najpopularniejszy obecnie czytnik dla smartfonów iPhone, ale równolegle powstają też wersje dla Windows i Mac OS X.
W wersji desktopowej program pozwala wczytywać wiele formatów dokumentów. Gdy otworzysz program i sięgniesz w menu do polecenia Plik - Open File (program ma kilka spolszczonych pozycji menu), możesz sięgnąć po plik w jednym z około 20 formatów. Przykładowo, gdy wybierzesz plik Worda, zostanie on w locie przekonwertowany i otwarty.
Niestety, żadne formatowanie nie jest uwzględniane, zatem zobaczysz tylko czystą treść, ale bez kłopotu są obsługiwane polskie litery.
Każdy otwarty plik możesz od razu zapisać (Plik - Save As) w formacie EPUB, a gdy skorzystasz z funkcji eksportu, będzie mógł wyeksportować go w jednym z kilkunastu formatów.
Plik EPUB zapisany na dysku możesz rozpakować za pomocą archiwizera (po zmianie rozszerzenia na .zip) i sprawdzić, jak wygląda zawartość kontenera. Jest to oczywiście znany nam już plik mimetype, folder META-INF z plikiem container.xml oraz folder OEBPS z plikami źródłowymi. W folderze tym zapisywany jest plik XHTML (w standardzie XHTML 1.0) z rozszerzeniem .xhtml. Jest oczywiście content.opf ze strukturą publikacji i toc.ncx ze strukturą spisu treści.
Pliki takie możesz naturalnie ręcznie zmodyfikować, a potem spakować ponownie publikację za pomocą archiwizera i nadać rozszerzenie .epub. Może to być dogodna forma tworzenia publikacji z dowolnych źródeł, z wykorzystaniem programu Stanza jako pośrednika. Warto poeksperymentować z różnymi formatami.
