Чтение формата ePub


102

Я пытаюсь разработать приложение для iPhone для чтения файлов ePub. Есть ли какая-нибудь структура для этого? Я понятия не имею, как читать этот формат файла. Я попытался проанализировать образец файла с расширением .epub с помощью NSXML Parser, но это не удалось.

Ответы:


305

Формат EPUB объединяет множество различных спецификаций / форматов:

  • один, чтобы сказать, как должно выглядеть содержимое книги (подмножество XHTML 1.1 + CSS)
  • один для определения «манифеста», в котором перечислены все файлы, составляющие это содержимое (OPF, который является файлом XML)
  • один, чтобы определить, как все упаковано (OEBPS: zip-файл всего в манифесте плюс несколько дополнительных файлов)

Спецификации выглядят немного устрашающе, но на самом деле, как только вы освоите основы (распаковка, синтаксический анализ XML), это не будет особенно сложно или сложно.

Вам нужно будет решить, как загрузить EPUB, распаковать его куда-нибудь, проанализировать манифест и затем отобразить соответствующий контент.

Несколько указателей, если вы только начинаете:

Для отображения контента просто используйте UIWebViewпока.

Вот пошаговая инструкция для вашего кода:

1) создайте представление с UIWebView

2) скачать файл EPUB

3) разархивируйте его в подкаталог в папке с документами вашего приложения с помощью библиотеки zip, указанной выше

4) проанализируйте файл XML в META-INF/container.xml(если этот файл не существует, EPUB недействителен) с помощью TBXML, указанного выше

5) В этом XML найдите первый «корневой файл» с медиа-типом application/oebps-package+xml. Это файл OPF для книги.

6) проанализируйте файл OPF (также XML)

7) теперь вам нужно знать, что такое первая глава книги.

а) каждый элемент <item>в <manifest>элементе имеет идентификатор и href. Сохраните их в папке, NSDictionaryгде ключ - это идентификатор, а объект - это href.

б) Посмотрите на первое <itemref>в <spine>. У него есть атрибут idref, который соответствует одному из идентификаторов в (a). Посмотрите этот идентификатор в, NSDictionaryи вы получите href.

c) это файл первой главы, который должен показать пользователю. Определите полный путь (подсказка: куда бы вы ни распаковали zip-файл в (3) плюс базовый каталог OPF-файла в (6))

8) создать NSURLusing fileURLWithPath:, где путь - это полный путь из (7c). Загрузите этот запрос, используя UIWebViewсозданный вами в (1).

Вам нужно будет реализовать кнопки вперед / назад, смахивания или что-то еще, чтобы пользователи могли переходить от одной главы к другой. Используйте, <spine>чтобы определить, какой файл показывать следующим - <itemrefs>в XML они находятся в том порядке, в котором они должны отображаться для читателя.


действительно хороший учебник ..! крутой чувак..! Я потратил много времени на такую ​​демонстрацию
Пареш Такор

16
Жалко, что за этот ответ можно проголосовать только 1 раз,
Тим Макнамара

Отличный ответ. Это становится FAQ :)
Ник Гибсон

9
Большое спасибо, Юан ... Для всех тех, кто все еще ищет решение, я создал образец и разместил его в ideveloperworld.blogspot.com/2011/02/epub-reader.html
MobX

Обратите внимание, что нет особой необходимости «распаковывать его куда-нибудь», если под этим вы подразумеваете создание отдельных новых файлов, которые являются распакованным содержимым ZIP-архива. ZIP - довольно простой формат, и должно быть довольно легко создавать библиотеки, которые предоставляют вам входные потоки для различных файлов в архиве, которые читаются прямо из архива на лету, если у вас еще нет таких библиотек. Одним из примеров такой библиотеки с доступным полным исходным кодом является RubyZip ( rubyzip.sourceforge.net ).
cjs 08

21

Очевидно, EPUB - это «всего лишь» формат XML, поэтому, если у вас есть синтаксический анализатор xml и его спецификация, все в порядке.

Плюс немного туто ? Радоваться, веселиться!

РЕДАКТИРОВАТЬ: вы также можете прочитать здесь код , он предназначен для создания epub, а не для их чтения, но код может быть полезен.

ИЗМЕНИТЬ еще раз: и посмотрите ссылки на связанный вопрос на правой боковой панели, в ответах есть несколько ссылок на бесплатную программу для чтения электронных книг, поддерживающую ePub.


РЕДАКТИРОВАТЬ 3: вы должны добавить комментарий при редактировании своего вопроса, чтобы люди, ответившие на вас, могли продолжить обсуждение (если вы не комментируете, мы не заметили вашего изменения).

Итак, синтаксический анализ завершился неудачно, потому что вы не прочитали спецификацию или связанные вопросы по переполнению стека ... * .epub файл - это заархивированная папка, содержащая файл (ы) XML, а не простой xml.


6

Я однажды прочитал это руководство (требуется бесплатная регистрация, извините), и он дал мне отличное введение в ePub. deverloperWorks учебник здесь

Я настоятельно рекомендую вам взглянуть на некоторые библиотеки обработки XML. Если вы просто хотите получить конкретную информацию из файла XML, вы можете выбрать правильную стратегию синтаксического анализа.


Это превосходное руководство написано человеком, который является автором многих доступных стандартных инструментов ePub с открытым исходным кодом. Это быстрое прочтение, которое дает идеальное рабочее введение в формат ePub.
Брайан Моэскау,


2

Я играю вокруг, чтобы создать epub-framework для приложений iphone.

На данный момент (я действительно только начал) я могу создать титульную страницу со ссылками на главы.

Мой подход

  • Используйте фреймворк quickconnect iphone в качестве слоя (возможно, я перейду на phonegap), который в основном позволяет использовать приложения javascript как приложения iphone
  • Добавьте в проект UNZIPed epub в качестве ресурса
  • Разберите все это с помощью настроенной версии epub.js (где-нибудь в google-коде)

Прямо сейчас я изучаю pageflip, некоторые проблемы с графическим интерфейсом и незначительные проблемы с удобством использования (сохраните текущую просматриваемую страницу)

Я надеюсь, что это даст вам представление о том, как начать


Я использовал epub.js, что у меня возникла ошибка как XML Parsing Error: не найден элемент номер строки местоположения 1 столбец номер 1. может помочь мне, предоставив несколько ссылок
user969275

что с твоей структурой? вы это где-то публиковали?
yasirmturk

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.