Nun besteht so ein eBook ja nicht nur aus dem Inhalt, sondern hängt sehr stark von den den Inhalt strukturierenden Dateien ab. Es lohnt sich, Sorgfalt in diese Dateien zu investieren. Wir beginnen hier mit dem Skelett, das wir im vorangegangenen Post – ePub für ein eBook von Grund auf selbst erstellen (Teil 1) – bereits gesehen haben.
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<package xmlns="http://www.idpf.org/2007/opf"
version="2.0"
unique-identifier="bookid">
<metadata>
<!-- Metainformationen -->
</metadata>
<manifest>
<!-- Übersicht des Inhalts -->
</manifest>
<spine>
<!-- Reihenfolge des Inhalts-->
</spine>
</package>
Diese XML-Datei ist aus drei Teilen aufgebaut: <metadata>
, <manifest>
und <spine>
. Umklammert werden die drei Elemente von der XML-Definition und dem Wurzelement package
. Hier geben wir beispielsweise an, welche Hauptsprache wir verwenden, welche ePub-Version wir einsetzen und nach welchen Standards wir vorgehen. Des Weiteren erklären wir, dass unser identifier
unter „bookid“ zu finden ist. Diese Angaben zwar wichtig, aber eher formaler Natur und repetitiv, wir würden sie für alle unsere Bücher im ePub2-Format so verwenden.
Schauen wir uns daher die sich von Buch zu Buch unterscheidenden individuellen Details an. Beginnen wir damit, uns anzugucken, was unser eBook im Abschnitt <metadata>
benötigt.
Metadata
In <metadata>
stehen die übergeordneten Angaben zum Buch, die Metainformationen. Zum Beispiel der Titel, Name der Autorin oder des Autors, Erscheinungsdatum, die Sprache, in der das Buch verfasst ist usw. Hier ist wichtig, dass der identifier
eindeutig ist. Das kann eine ISBN sein oder die URL zur Seite zum eBook sein oder wie hier in unserem Fall eine UUID. Eine solche UUID kann man sich einfach online generieren lassen, zum Beispiel unter www.uuidgenerator.net. Sehen wir uns zwei Beispiele dazu an, zunächst ein einfaches:
Metadata-Beispiel 1
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:opf="http://www.idpf.org/2007/opf"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- Die eindeutige bookid -->
<dc:identifier id="bookid">uuid:HIER:BEISPIELSWEISE:EINE:UUID</dc:identifier>
<!-- Buchtitel -->
<dc:title>DER TITEL DES BUCHS</dc:title>
<!-- Autorin/Autor -->
<dc:creator>AUTORENVORNAME AUTORENNACHNAME</dc:creator>
<!-- Hauptsprache des Buchs -->
<dc:language>de</dc:language>
<!-- Titelbild -->
<meta name="cover" content="coverimage" />
</metadata>
Metadata-Beispiel 2
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:opf="http://www.idpf.org/2007/opf"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- Die eindeutige bookid -->
<dc:identifier id="bookid">uuid:HIER:BEISPIELSWEISE:EINE:UUID</dc:identifier>
<!-- Buchtitel -->
<dc:title>DER TITEL DES BUCHS</dc:title>
<!-- Autorin/Autor -->
<dc:creator>AUTORENVORNAME AUTORENNACHNAME</dc:creator>
<!-- Hauptsprache des Buchs -->
<dc:language>de</dc:language>
<!-- Schlüsselwörter zum Buchinhalt für bessere Suchergebnisse -->
<dc:subject>TOLLES THEMA</dc:subject>
<!-- Titelbild -->
<meta name="cover" content="coverimage" />
<!-- Veröffentlichungsdatum -->
<dc:date opf:event="publication">2020-01-24</dc:date>
<!-- Datum der letzten Änderung -->
<dc:date opf:event="modification">2020-01-27</dc:date>
</metadata>
Im zweiten Beispiel sind wir einen Schritt weitergegangen und haben neben den Pflichtfeldern weitere Felder verwendet. Diese Felder bieten hier die Möglichkeit von Stichwörtern zum besseren Finden des eBooks, Veröffentlichungsdatum und das Datum der letzten Änderung.
Manifest
Im <manifest>
listen wir die einzelnen Bestandteile des Buchs auf und nennen dabei den Medientyp, den diese Bestandteile haben. So geben wir bei den html-Dateien application/xhtml+xml
an, bei Bildern image/png
oder image/jpg
je nach Bildtyp. Auch die anderen Elemente werden auf diese Art beschrieben. Wir haben hier also ein Verzeichnis aller Dateien des Buches. Diese sind als item
mit einer eindeutigen id
beschrieben. Für ein gültiges eBook benötigen wir hier mindestens ein item
. Jede Datei, die im eBook erscheinen soll, muss innerhalb des Manifests gelistet sein.
Sehen wir uns auch hier ein Beispiel an:
Manifest-Beispiel
<manifest>
<!-- Übersicht der Inhalte -->
<!-- Das Inhaltsverzeichnis für ePub2 -->
<item id="inhaltsverzeichnis" href="texts/inhaltsverzeichnis.ncx" media-type="application/x-dtbncx+xml"/>
<!-- Die Titelseite -->
<item id="cover" href="texts/titel.xhtml" media-type="application/xhtml+xml"/>
<!-- Die Titelillustration -->
<item id="coverimage" href="images/cover.png" media-type="image/png"/>
<!-- Der Inhalt des Buchs -->
<item id="kapitel_1“ href="texts/kapitel_1.xhtml" media-type="application/xhtml+xml"/>
<item id="kapitel_2“ href="texts/kapitel_2.xhtml" media-type="application/xhtml+xml"/>
<item id="ende" href="texts/ende.xhtml" media-type="application/xhtml+xml"/>
<!-- Das Stylesheet, wonach der Text formatiert werden soll. -->
<item id="css" href="styles/stylesheet.css" media-type="text/css"/>
</manifest>
Um das Inhaltsverzeichnis und warum hier nun zwei Elemente dazu stehen, kümmern wir uns in einem eigenen Abschnitt, daher überspringen wir es hier.
Die Titelseite ist eine HTML-Seite, die hier die id="cover"
hat und daher mit der Titelseite assoziiert wird – ebenso die Titelillustration mit der id="coverimage"
.
Der Inhalt des Buchs besteht in unserem Beispiel aus den beiden Dateien kapitel_1.html
und kapitel_2.html
.
Abschließend nennen wir noch das Stylesheet, das angibt, wie der Inhalt für die Leserin oder den Leser aufbereitet werden soll.
Bei jedem item
ist hinter href=
angegeben, wo sich die Datei befindet. Wir erinnern uns: Die Bilder sollen in images
, das Stylesheet in styles
und die Textdateien in texts
liegen. Wir müssen natürlich sicherstellen, dass die entsprechenden Dateien auch tatsächlich dort liegen und dass sie auch ganz genau so heißen. Mein Vorschlag ist, die selbst angelegten Verzeichnisse und Dateien konsequent klein zu schreiben, damit es hierbei zu keinen Fehlern kommt, die auf die unterschiedliche Schreibweise zurückzuführen sind. Anstelle von Leerzeichen verwenden wir Unterstriche (_).
Spine
Unter <spine>
stellen wir die Reihenfolge der Darstellung der unter <manifest>
angegebenen Buchbestandteile ein. Beim Öffnen vom Element <spine>
geben wir noch den Hinweis auf das Inhaltsverzeichnis anhand der im <manifest>
verwendeten id
mit. Das Element itemref
mit der Referenz idref
auf die unter <manifest>
definierte id
einer jeweiligen Datei gibt die Reihenfolge an. Auch hier gilt, dass es mindestens ein Element innerhalb von <spine>
geben muss – in diesem Fall itemref
, damit es sich um einen gültigen Abschnitt der OPF-Datei handelt.
So könnte beispielsweise ein spine
-Abschnitt für das zuvor bearbeitete <manifest>
aussehen:
<spine toc="inhaltsverzeichnis">
<!-- Reihenfolge der Inhaltsdateien-->
<itemref idref="cover" />
<itemref idref="kapitel_1“ />
<itemref idref="kapitel_2“ />
<itemref idref="ende" />
</spine>
Wichtig ist hier Hinweis auf das lesbare Inhaltsverzeichnis toc="inhaltsverzeichnis"
beim Öffnen des Elements spine
. Das Navigational Control file for XML applications(NCX) bildet eine hierarchische Liste der Buchbestandteile ab. Darin gehen wir in einem eigenen Beitrag später gesondert ein.
Damit wären wir fertig. Nun können wir einmal sehen, wie die komplette Datei inklusive erklärender Kommentare aussieht.
Die vollständige content.opf-Datei
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<package xmlns="http://www.idpf.org/2007/opf"
version="2.0"
unique-identifier="bookid">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:opf="http://www.idpf.org/2007/opf"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- Die eindeutige bookid -->
<dc:identifier id="bookid">uuid:HIER:BEISPIELSWEISE:EINE:UUID</dc:identifier>
<!-- Buchtitel -->
<dc:title>DER TITEL DES BUCHS</dc:title>
<!-- Autorin/Autor -->
<dc:creator>AUTORENVORNAME AUTORENNACHNAME</dc:creator>
<!-- Hauptsprache des Buchs -->
<dc:language>de</dc:language>
<!-- Schlüsselwörter zum Buchinhalt für bessere Suchergebnisse -->
<dc:subject>TOLLES THEMA</dc:subject>
<!-- Titelbild -->
<meta name="cover" content="coverimage" />
<!-- Veröffentlichungsdatum -->
<dc:date opf:event="publication">2020-01-24</dc:date>
<!-- Datum der letzten Änderung -->
<dc:date opf:event="modification">2020-01-27</dc:date>
</metadata>
<manifest>
<!-- Übersicht der Inhalte -->
<!-- Das Inhaltsverzeichnis für ePub2 -->
<item id="inhaltsverzeichnis" href="texts/inhaltsverzeichnis.ncx" media-type="application/x-dtbncx+xml"/>
<!-- Die Titelseite -->
<item id="cover" href="texts/titel.xhtml" media-type="application/xhtml+xml"/>
<!-- Die Titelillustration -->
<item id="coverimage" href="images/cover.png" media-type="image/png"/>
<!-- Der Inhalt des Buchs -->
<item id="kapitel_1“ href="texts/kapitel_1.xhtml" media-type="application/xhtml+xml"/>
<item id="kapitel_2“ href="texts/kapitel_2.xhtml" media-type="application/xhtml+xml"/>
<item id="ende" href="texts/ende.xhtml" media-type="application/xhtml+xml"/>
<!-- Das Stylesheet, wonach der Text formatiert werden soll. -->
<item id="css" href="styles/stylesheet.css" media-type="text/css"/>
</manifest>
<spine toc="inhaltsverzeichnis">
<!-- Reihenfolge der Inhaltsdateien-->
<itemref idref="cover" />
<itemref idref="kapitel_1“ />
<itemref idref="kapitel_2“ />
<itemref idref="ende" />
</spine>
</package>
Das sieht doch schon recht ordentlich aus. Fehlt noch das Erstellen der inhaltsverzeichnis.ncx
, was wir zunächst zurückgestellt haben. Wie und warum wir diese Datei erstellen, sehen wir uns im nächsten Post an:
ePub selbst erstellen: Das Inhaltsverzeichnis auf NCX-Basis erstellen (Teil 3)
Photo by Perfecto Capucine on Unsplash