Lesen des ePub-Formats


102

Ich versuche, eine iPhone-Anwendung zum Lesen von ePub-Dateien zu entwickeln. Gibt es einen Rahmen, um dies zu entwickeln? Ich habe keine Ahnung, wie ich dieses Dateiformat lesen soll. Ich habe versucht, eine Beispieldatei mit der Erweiterung .epub mit NSXML Parser zu analysieren, aber das schlägt fehl.

Antworten:


304

Das EPUB-Format vereint eine Reihe verschiedener Spezifikationen / Formate:

  • man kann sagen, wie der Inhalt des Buches aussehen soll (eine Teilmenge von XHTML 1.1 + CSS)
  • eine, um ein "Manifest" zu definieren, das alle Dateien auflistet, aus denen dieser Inhalt besteht (OPF, eine XML-Datei)
  • eine, um zu definieren, wie alles verpackt ist (OEBPS: eine Zip-Datei von allem im Manifest plus ein paar zusätzliche Dateien)

Die Spezifikationen sehen ein bisschen entmutigend aus, aber sobald Sie die Grundlagen (Entpacken, Parsen von XML) kennen, ist es nicht besonders schwierig oder komplex.

Sie müssen herausfinden, wie Sie das EPUB herunterladen, irgendwo entpacken, das Manifest analysieren und dann den relevanten Inhalt anzeigen können.

Einige Hinweise, wenn Sie gerade erst anfangen:

Um Inhalte anzuzeigen, verwenden Sie zunächst ein UIWebView.

Hier ist eine Schritt-für-Schritt-Anleitung für Ihren Code:

1) Erstellen Sie eine Ansicht mit a UIWebView

2) Laden Sie die EPUB-Datei herunter

3) Entpacken Sie es mithilfe der oben verlinkten Zip-Bibliothek in ein Unterverzeichnis im Dokumentenordner Ihrer App

4) Analysieren Sie die XML-Datei unter META-INF/container.xml(wenn diese Datei nicht vorhanden ist, ist die EPUB ungültig) mit TBXML, das oben verlinkt ist

5) Suchen Sie in dieser XML die erste "Root-Datei" mit Medientyp application/oebps-package+xml. Dies ist die OPF-Datei für das Buch.

6) Analysieren Sie die OPF-Datei (auch XML).

7) Jetzt müssen Sie wissen, was das erste Kapitel des Buches ist.

a) Jeder <item>im <manifest>Element hat eine ID und eine href. Speichern Sie diese an einem Ort, an NSDictionarydem der Schlüssel die ID und das Objekt die href ist.

b) Schauen Sie sich die erste <itemref>in der <spine>. Es hat ein idref-Attribut, das einer der IDs in (a) entspricht. Schlagen Sie diese ID in der NSDictionaryund Sie erhalten eine href.

c) Dies ist die Datei des ersten Kapitels, die den Benutzer zeigt. Ermitteln Sie den vollständigen Pfad (Hinweis: Er befindet sich überall dort, wo Sie die Zip-Datei in (3) und im Basisverzeichnis der OPF-Datei in (6) entpackt haben.)

8) Erstellen Sie eine NSURLVerwendung fileURLWithPath:, wobei der Pfad der vollständige Pfad von (7c) ist. Laden Sie diese Anfrage mit der UIWebViewin (1) erstellten.

Sie müssen Vorwärts- / Rückwärtsschaltflächen oder Wischbewegungen oder ähnliches implementieren, damit Benutzer von einem Kapitel zum anderen wechseln können. Verwenden Sie die Option <spine>, um herauszufinden, welche Datei als Nächstes <itemrefs>angezeigt werden soll. Die Dateien in XML befinden sich in der Reihenfolge, in der sie dem Leser angezeigt werden sollen.


wirklich ein gutes Tutorial ..! cooler Mann ..! Ich habe viel Zeit für eine solche Demo verbracht
Paresh Thakor

16
Es ist eine Schande, dass es nur möglich ist, 1 Upvote für diese Antwort abzugeben
Tim McNamara

Gute Antwort. Dies wird eine FAQ :)
Nic Gibson

9
Vielen Dank Euan ... Für alle, die noch nach einer Lösung suchen, habe ich ein Beispiel erstellt und in ideveloperworld.blogspot.com/2011/02/epub-reader.html
MobX

Beachten Sie, dass es nicht unbedingt erforderlich ist, "irgendwo zu entpacken", wenn Sie damit separate neue Dateien erstellen möchten, die den entpackten Inhalt des ZIP-Archivs darstellen. ZIP ist ein ziemlich einfaches Format, und es sollte ziemlich einfach sein, Bibliotheken zu erstellen, die Ihnen Eingabestreams für die verschiedenen Dateien im Archiv geben, die direkt aus dem Archiv gelesen werden, wenn Sie noch keine solchen Bibliotheken haben. Ein Beispiel für eine solche Bibliothek mit vollständiger Quelle ist RubyZip ( rubyzip.sourceforge.net ).
cjs

21

Anscheinend ist EPUB "nur" ein XML-Format. Wenn Sie also einen XML-Parser und die Spezifikation haben, sollte dies in Ordnung sein.

Plus ein kleines Tuto ? Habe Spaß!

EDIT: Sie auch einige Codes lesen können hier , dann ist dies epub zur Erzeugung, nicht , sie zu lesen , aber der Code kann nützlich sein.

Nochmals BEARBEITEN: Und siehe Links zu verwandten Fragen in der rechten Seitenleiste. In den Antworten zum kostenlosen E-Book-Reader finden Sie einige Links, die ePub unterstützen.


BEARBEITEN 3: Sie sollten einen Kommentar hinzufügen, wenn Sie Ihre Frage bearbeiten, damit Personen, die Ihnen antworten, die Diskussion fortsetzen können (wenn Sie keinen Kommentar abgeben, werden wir von Ihrer Bearbeitung nicht bemerkt).

Das Parsen schlägt also fehl, weil Sie die Spezifikation oder verwandte Fragen zu Stack Overflow nicht gelesen haben ... * .epub-Datei ist ein komprimierter Ordner, der XML-Dateien enthält, keine einfache XML-Datei.


6

Ich habe dieses Tutorial einmal gelesen (kostenlose Registrierung erforderlich, sorry) und es gab mir eine großartige Einführung in ePub. deverloperWorks Tutorial hier

Ich empfehle Ihnen dringend, sich einige der XML-Verarbeitungsbibliotheken anzusehen. Wenn Sie nur bestimmte Informationen aus der XML-Datei abrufen möchten, können Sie die richtige Analysestrategie auswählen.


Dieses Tutorial ist ausgezeichnet und wurde von der Person geschrieben, die viele der verfügbaren Standard-Open-Source-ePub-Tools verfasst hat. Es ist eine schnelle Lektüre und bietet eine perfekte Einführung in das ePub-Format.
Brian Moeskau


2

Ich spiele herum, um ein Epub-Framework für iPhone-Apps zu erstellen.

Im Moment (ich habe gerade erst angefangen) kann ich eine Titelseite mit Links zu den Kapiteln erstellen.

Mein Ansatz ist

  • Verwenden Sie das Quickconnect-iPhone-Framework als Ebene (möglicherweise wechsle ich zu Phonegap), die im Grunde Javascript-Apps als iPhone-Apps zulässt
  • Fügen Sie dem Projekt den UNZIPed-Epub als Ressource hinzu
  • Analysieren Sie das Ganze mit einer angepassten Version der Datei epub.js (irgendwo auf Google-Code).

Im Moment beschäftige ich mich mit Pageflip, einer Art GUI und kleineren Usability-Problemen (speichere die aktuelle Seite, die gerade angezeigt wird).

Ich hoffe, das gibt Ihnen eine Idee, wie Sie anfangen sollen


Ich habe die epub.js verwendet, was ich als XML-Parsing-Fehler erhalten habe: Kein Element gefunden Position Zeile Nummer 1 Spalte Nummer 1. Kannst du mir helfen, indem ich einige Links
bereitstelle

Was ist mit deinem Framework los? Hast du es irgendwo veröffentlicht?
Yasirmturk

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.