Czytanie formatu ePub


102

Próbuję stworzyć aplikację na iPhone'a do odczytywania plików ePub. Czy są dostępne jakieś ramy, aby to rozwinąć? Nie mam pojęcia, jak czytać ten format pliku. Próbowałem przeanalizować przykładowy plik z rozszerzeniem .epub za pomocą parsera NSXML, ale to się nie udaje.

Odpowiedzi:


305

Format EPUB łączy kilka różnych specyfikacji / formatów:

  • jedno, aby powiedzieć, jak powinna wyglądać treść książki (podzbiór XHTML 1.1 + CSS)
  • jeden do zdefiniowania „manifestu”, który zawiera listę wszystkich plików tworzących tę zawartość (OPF, który jest plikiem XML)
  • jeden do określenia, jak wszystko jest pakowane (OEBPS: plik zip zawierający wszystko w manifeście plus kilka dodatkowych plików)

Specyfikacje wyglądają nieco zniechęcająco, ale w rzeczywistości po opanowaniu podstaw (rozpakowywanie, parsowanie XML) nie jest to szczególnie trudne ani skomplikowane.

Musisz dowiedzieć się, jak pobrać plik EPUB, gdzieś go rozpakować, przeanalizować manifest, a następnie wyświetlić odpowiednią zawartość.

Kilka wskazówek, jeśli dopiero zaczynasz:

Aby wyświetlić zawartość, użyj UIWebViewna razie.

Oto wysoki poziom, krok po kroku, dotyczący Twojego kodu:

1) utwórz widok za pomocą pliku UIWebView

2) pobierz plik EPUB

3) rozpakuj go do podkatalogu w folderze dokumentów aplikacji za pomocą biblioteki zip, do której link znajduje się powyżej

4) przeanalizuj plik XML pod adresem META-INF/container.xml(jeśli ten plik nie istnieje, plik EPUB jest nieprawidłowy) przy użyciu TBXML, do którego link znajduje się powyżej

5) W tym kodzie XML znajdź pierwszy „plik główny” z typem nośnika application/oebps-package+xml. To jest plik OPF dla książki.

6) przeanalizuj plik OPF (również XML)

7) Teraz musisz wiedzieć, jaki jest pierwszy rozdział książki.

a) każdy <item>w <manifest>elemencie ma identyfikator i href. Przechowuj je w NSDictionarymiejscu, w którym klucz jest identyfikatorem, a obiektem jest href.

b) Spójrz na pierwszy <itemref>w <spine>. Posiada atrybut idref, który odpowiada jednemu z identyfikatorów w (a). Wyszukaj ten identyfikator w, NSDictionarya otrzymasz href.

c) jest to plik z pierwszego rozdziału do pokazania użytkownikowi. Sprawdź, jaka jest pełna ścieżka (wskazówka: jest to miejsce, w którym rozpakowałeś plik zip w (3) oraz katalog podstawowy pliku OPF w (6))

8) utwórz NSURLusing fileURLWithPath:, gdzie ścieżka jest pełną ścieżką z (7c). Załaduj to żądanie, korzystając z UIWebViewutworzonego w (1).

Będziesz musiał zaimplementować przyciski do przodu / do tyłu, przesunięcia lub coś w tym rodzaju, aby użytkownicy mogli przechodzić z jednego rozdziału do drugiego. Użyj, <spine>aby dowiedzieć się, który plik pokazać jako następny - <itemrefs>w XML są w kolejności, w jakiej powinny pojawić się czytelnikowi.


naprawdę dobry tutorial ..! spoko gość..! poświęciłem dużo czasu na takie demo
Paresh Thakor

16
szkoda, że ​​za tę odpowiedź można oddać tylko 1 głos za
Tim McNamara

Świetna odpowiedź. To staje się często zadawanymi pytaniami :)
Nic Gibson,

9
Wielkie dzięki Euan ... Dla wszystkich, którzy wciąż szukają rozwiązania, stworzyłem próbkę i opublikowałem ją w ideveloperworld.blogspot.com/2011/02/epub-reader.html
MobX

Zauważ, że nie ma szczególnej potrzeby "rozpakowywania go gdzieś", jeśli masz na myśli tworzenie oddzielnych nowych plików, które są rozpakowaną zawartością archiwum ZIP. ZIP jest dość prostym formatem i powinno być dość łatwe do tworzenia bibliotek, które dają strumienie wejściowe dla różnych plików w archiwum, które odczytują bezpośrednio z archiwum w locie, jeśli jeszcze nie masz takich bibliotek. Przykładem takiej biblioteki z pełnym dostępnym źródłem jest RubyZip ( rubyzip.sourceforge.net ).
cjs

21

Najwyraźniej EPUB to „tylko” format XML, więc jeśli masz parser xml i specyfikację, wszystko powinno być w porządku.

Plus trochę tuto ? Baw się dobrze!

EDIT: można również odczytać kodu tutaj , to jest do generowania EPUB, nie je czytać, ale kod może być przydatne.

EDYTUJ ponownie: I zobacz linki do pokrewnych pytań na prawym pasku bocznym, są linki w odpowiedziach na darmowy czytnik e-booków, który obsługuje ePub.


EDYCJA 3: Powinieneś dodać komentarz, kiedy edytujesz swoje pytanie, aby osoby, które na nie odpowiedziały, mogły kontynuować dyskusję (jeśli nie skomentujesz, nie zauważyliśmy Twojej zmiany).

Tak więc analiza nie powiodła się, ponieważ nie przeczytałeś specyfikacji ani powiązanych pytań dotyczących Stack Overflow ... Plik * .epub to spakowany folder zawierający pliki XML, a nie zwykły plik XML.


6

Przeczytałem raz ten samouczek (wymagana bezpłatna rejestracja, przepraszam) i dał mi świetne wprowadzenie do ePub. poradnik deverloperWorks tutaj

Gorąco sugeruję przyjrzenie się niektórym bibliotekom przetwarzającym XML. Jeśli chcesz tylko uzyskać określone informacje z pliku XML, możesz wybrać odpowiednią strategię analizowania.


Ten samouczek jest doskonały i został napisany przez osobę, która jest autorem wielu dostępnych standardowych narzędzi ePub typu open source. To krótka lektura i doskonałe robocze wprowadzenie do formatu ePub.
Brian Moeskau


2

Gram wokół, aby stworzyć platformę epub dla aplikacji na iPhone'a.

W tej chwili (tak naprawdę dopiero zaczynam) mogę wygenerować stronę tytułową z linkami do rozdziałów.

Moje podejście jest takie

  • Użyj frameworka QuickConnect dla iPhone'a jako warstwy (może zmienię na phonegap), co w zasadzie pozwala na aplikacje javascript jako aplikacje na iPhone'a
  • Dodaj UNZIPED epub jako zasób do projektu
  • Przeanalizuj całość za pomocą dostosowanej wersji pliku epub.js (gdzieś w google-code)

W tej chwili przyglądam się zmianie strony, jakiegoś rodzaju GUI i drobnych problemów z użytecznością (zapisz przeglądaną bieżącą stronę)

Mam nadzieję, że daje ci pomysł, jak zacząć


Użyłem epub.js, co dostałem błąd jako błąd analizy XML: nie znaleziono elementu lokalizacji numer wiersza 1 numer kolumny 1. możesz mi pomóc, podając kilka linków
user969275

co słychać w twoim frameworku? opublikowałeś to gdzieś?
yasirmturk

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.