Leitura do formato ePub


102

Estou tentando desenvolver um aplicativo para iPhone para ler arquivos ePub. Existe alguma estrutura disponível para desenvolver isso? Não tenho ideia de como ler este formato de arquivo. Tentei analisar um arquivo de amostra com extensão .epub usando o NSXML Parser, mas falhou.

Respostas:


304

O formato EPUB reúne um monte de especificações / formatos diferentes:

  • um para dizer como o conteúdo do livro deve ser parecido (um subconjunto de XHTML 1.1 + CSS)
  • um para definir um "manifesto" que lista todos os arquivos que compõem esse conteúdo (OPF, que é um arquivo XML)
  • um para definir como tudo é empacotado (OEBPS: um arquivo zip de tudo no manifesto mais alguns arquivos extras)

As especificações parecem um pouco assustadoras, mas, na verdade, uma vez que você tenha o básico (descompactar, analisar XML), não é particularmente difícil ou complexo.

Você precisará descobrir como fazer o download do EPUB, descompactá-lo em algum lugar, analisar o manifesto e, em seguida, exibir o conteúdo relevante.

Algumas dicas se você está apenas começando:

Para exibir o conteúdo, basta usar um UIWebViewpor enquanto.

Aqui está um passo a passo de alto nível para o seu código:

1) criar uma visualização com um UIWebView

2) baixar o arquivo EPUB

3) descompacte-o em um subdiretório na pasta de documentos do seu aplicativo usando a biblioteca zip, com link acima

4) analise o arquivo XML em META-INF/container.xml(se este arquivo não existir, o EPUB é inválido) usando TBXML, vinculado acima

5) Neste XML, encontre o primeiro "rootfile" com tipo de mídia application/oebps-package+xml. Este é o arquivo OPF do livro.

6) analise o arquivo OPF (também XML)

7) agora você precisa saber qual é o primeiro capítulo do livro.

a) cada um <item>no <manifest>elemento possui um id e um href. Armazene-os em um local NSDictionaryonde a chave seja o id e o objeto seja o href.

b) Olhe para o primeiro <itemref>no <spine>. Ele tem um atributo idref que corresponde a um dos ids em (a). Procure esse id no NSDictionarye você obterá um href.

c) este é o arquivo do primeiro capítulo a ser mostrado ao usuário. Descubra qual é o caminho completo (dica: é onde quer que você descompactou o arquivo zip em (3) mais o diretório base do arquivo OPF em (6))

8) crie um NSURLusing fileURLWithPath:, onde o caminho é o caminho completo de (7c). Carregue esta solicitação usando o que UIWebViewvocê criou em (1).

Você precisará implementar botões de avançar / retroceder ou deslizar ou algo assim para que os usuários possam mover de um capítulo para outro. Use <spine>para descobrir qual arquivo mostrar a seguir - <itemrefs>no XML estão na ordem em que devem aparecer para o leitor.


realmente um bom tutorial ..! homem legal..! Eu gastei muito tempo para essa demonstração
Paresh Thakor

16
é uma pena que só seja possível fornecer 1 voto positivo para esta resposta
Tim McNamara

Ótima resposta. Isso está se tornando um FAQ :)
Nic Gibson

9
Muito obrigado Euan ... Para todos aqueles que ainda estão procurando por uma solução, criei uma amostra e postei em ideveloperworld.blogspot.com/2011/02/epub-reader.html
MobX

Observe que não há necessidade particular de "descompactá-lo em algum lugar" se com isso você quer dizer criar novos arquivos separados que são o conteúdo descompactado do arquivo ZIP. ZIP é um formato bastante simples e deve ser bastante fácil criar bibliotecas que forneçam fluxos de entrada para os vários arquivos no arquivo que são lidos diretamente do arquivo na hora, se você ainda não tiver essas bibliotecas. Um exemplo de tal biblioteca, com fonte completa disponível, é RubyZip ( rubyzip.sourceforge.net ).
cjs

21

Aparentemente, o EPUB é "apenas" um formato XML, portanto, se você tiver um analisador xml e a especificação, não haverá problema.

Mais um pouco de tuto ? Diverta-se!

EDIT: você também pode ler algum código aqui , isso é para gerar epub, não lê-los, mas o código pode ser útil.

EDITAR novamente: E veja os links para perguntas relacionadas na barra lateral direita, existem alguns links nas respostas para o leitor de e-book gratuito que suporta ePub.


EDIT 3: Você deve adicionar um comentário ao editar sua pergunta para que as pessoas que responderem possam continuar a discussão (se você não comentar, não notamos sua edição).

Portanto, a análise falha porque você não leu as especificações ou questões relacionadas no Stack Overflow ... * .epub file é uma pasta compactada que contém arquivo (s) XML, não xml simples.


6

Li este tutorial uma vez (é necessário registro gratuito, desculpe) e ele me deu uma ótima introdução ao ePub. Tutorial do deverloperWorks aqui

Eu sugiro que você olhe para algumas das bibliotecas de processamento XML. Se você deseja apenas obter informações específicas do arquivo XML, pode escolher a estratégia de análise correta.


Este tutorial é excelente e foi escrito pela pessoa que criou muitas das ferramentas ePub de software livre padrão disponíveis. É uma leitura rápida e oferece uma introdução perfeita ao formato ePub.
Brian Moeskau,


2

Estou brincando para criar uma estrutura epub para aplicativos de iphone.

No momento (estou apenas começando), posso gerar uma página de título com links para os capítulos.

Minha abordagem é

  • Use o framework quickconnect iphone como uma camada (talvez eu mude para phonegap) que basicamente permite aplicativos javascript como aplicativos iphone
  • Adicione o epub UNZIPed como um recurso para o projeto
  • Analise tudo com uma versão personalizada do epub.js (em algum lugar do google-code)

No momento estou olhando para o pageflip, algum tipo de interface gráfica e pequenos problemas de usabilidade (salve a página atual que está sendo visualizada)

Espero que tenha dado uma ideia de como começar


Eu usei o epub.js e recebi um erro como Erro de análise XML: nenhum elemento encontrado localização linha número1 coluna número 1. Você pode me
ajudar

o que está acontecendo com sua estrutura? você publicou em algum lugar?
yasirmturk

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.