Desenvolver um Livro Digital com EPUB

O formato de eBook baseado em XML livre

Precisa distribuir documentação, criar um eBook, ou somente arquivar suas postagens no blog favoritas? EPUB é uma especificação aberta para livros digitais baseados em tecnologias familiares como XML, CSS e XHTML, e arquivos EPUB podem ser lidos em dispositivos de e-ink móveis, telefones celulares e computadores desktop. Este tutorial explica o formato EPUB em detalhes, demonstra a validação do EPUB usando tecnologia Java e mostra, passo a passo, a criação de EPUB automatizado, usando DocBook e Python.

5 fevereiro 2009 - Seguindo comentários dos leitores, a autora revisou o conteúdo da Listagem 3 e atualizou o arquivo epub-raw-files.zip (consulte Downloads).

27 abril 2010 - Atualizou o arquivo epub-raw-files.zip (consulte Downloads).

3 junho 2010 - A pedido da autora, revisou o conteúdo das Listagens 3 e 8. Também atualizou o arquivo epub-raw-files.zip (consulte Downloads).

11 janeiro 2011 - A pedido da autora, revisou o conteúdo da Listagem 5. Alterou a segunda linha do código de <item id="ncx" href="toc.ncx" media-type="text/xml"/>; para <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>.

12 julho 2011 - Seguindo comentários dos leitores, revisou o conteúdo da Listagem 14. Removeu o caractere ` perto do final da linha de código de <?xml version="1.0" encoding="utf-8"?`>. O código foi revisado e agora é: <?xml version="1.0" encoding="utf-8"?>.

Liza Daly, Software Engineer and Owner, Threepress Consulting Inc.

Photo of Liza DalyLiza Daly é engenheira de software especializada em aplicativos para o segmento de mercado de publicações. Ela é desenvolvedora líder dos principais produtos online da Oxford University Press, O'Reilly Media e outros publicadores. Atualmente, é consultora independente e fundadora da Threepress, um projeto de software livre desenvolvendo aplicativos ebook.



01/Out/2012

Antes de Iniciar

Este tutorial orienta você na criação de eBooks no formato EPUB. O EPUB é um formato feito para o desenvolvedor, baseado em XML, que está surgindo como o padrão de facto para livros digitais. Mas EPUB não serve somente para livros, com ele é possível:

  • Empacotar documentação para leitura offline ou fácil distribuição
  • Empacotar postagens no blog ou outro conteúdo nativo da web
  • Desenvolver, procurar e recombinar usando ferramentas comuns de software livre

Sobre este tutorial

Acrônimos usados frequentemente

  • API: interface de programação de aplicativos
  • CSS: folhas de estilo em cascata
  • DOM: Modelo de Objeto de Documento
  • DTD: Definição do tipo de documento
  • GUI: Interface gráfica com o usuário
  • HTML: Linguagem de Marcação de Hipertexto
  • SAX: API simples para XML
  • W3C: World Wide Web Consortium
  • XHTML: HTML extensível
  • XML: linguagem de marcação extensível

Você inicia este tutorial gerando um livro EPUB manualmente para ajudar a conhecer todos os componentes e arquivos necessários. Em seguida, o tutorial mostra como empacotar o livro digital concluído e validá-lo com a especificação, como também testá-lo em vários sistemas de leitura.

Então, ele descreve como gerar EPUB a partir de DocBook XML—um dos padrões mais usados para documentação técnica — e como usar Python para automatizar completamente a criação de EPUB com DocBook de ponta a ponta.

Objetivos

Neste tutorial, você:

  • Aprende o que é EPUB, quem está por trás dele, e quem o está adotando no momento
  • Explora a estrutura de um pacote configurável EPUB, incluindo seus arquivos necessários e seus esquemas
  • Cria um arquivo EPUB válido a partir do rascunho usando conteúdo simples
  • Usa ferramentas de software livre para produzir arquivos EPUB a partir de DocBook, um esquema amplamente usado para documentação técnica e livros
  • Automatiza a conversão de EPUB usando Python e DocBook

Pré-requisitos

Nenhum sistema operacional particular é suposto para este tutorial, entretanto você deve estar familiarizado com mecanismos de criação de arquivos e diretórios. O uso de um editor de XML ou ambiente de desenvolvimento integrado (IDE) é bastante recomendado.

Para as demais partes deste tutorial, sobre automatizar a criação de EPUB, este tutorial supõe que você tenha uma ou mais habilidades em processamento básico de XML. — XSLT, DOM ou análise baseada em SAX — e como construir um documento XML usando uma API nativa de XML.

Nenhuma familiaridade com o formato de arquivo EPUB é necessária para concluir este tutorial.

Requisitos do sistema

Para concluir os exemplos neste tutorial, é necessário ter um interpretador Java (versão 1.5 ou posterior) e um interpretador Python (versão 2.4 ou posterior), assim como as bibliotecas XML necessárias a cada um. Entretanto, desenvolvedores de XML experientes podem adaptar os exemplos para qualquer linguagem de programação com bibliotecas XML.


Sobre o formato EPUB

Aprenda os fundamentos do EPUB, para que o EPUB é mais usado, e como o EPUB diferencia-se do Portable Document Format (PDF).

O que é EPUB?

EPUB é o formato XML para publicações e livros digitais refluíveis e padronizados pelo International Digital Publishing Forum (IDPF), uma associação de comércio e normas para o segmento de mercado de publicação digital. A IDPF adotou oficialmente o EPUB em outubro de 2007 e em meados de 2008 observou uma rápida adoção por grande parte dos publicadores. É possível ler o formato EPUB usando uma variedade de software livre e software comercial em todos os sistemas operacionais em geral, dispositivos e-ink, como Sony PRS, e dispositivos pequenos como Apple iPhone.

Quem está produzindo EPUB? Serve apenas para livros?

Embora publicadores de impressão tradicionais tenham sido os primeiros a adotarem o EPUB, nada em seu formato restringe seu uso a eBooks. Com ferramentas de software livremente disponíveis, é possível empacotar páginas da web como EPUB, converter arquivos de texto simples ou transformar documentação XML DocBook existente em EPUB válido e bem-formalizado. (Descrevo informações mais recentes em De DocBook para EPUB.)

Como EPUB difere-se de PDF?

PDF ainda é o formato de documento eletrônico mais amplamente utilizado no mundo. Do ponto de vista de um publicador de livro, PDF possui diversas vantagens:

  • Arquivos PDF permitem controle perfeito de pixel sobre layout, inclusive layouts complexos propícios à impressão, como muitas colunas e alternar entre estilos anverso/verso.
  • PDFs podem ser gerados por uma grande variedade de ferramentas de documento baseado em GUI, como Microsoft® Office Word ou Adobe® InDesign®.
  • Leitores PDF são ubíquos e instalados na maioria dos computadores modernos.
  • Fontes específicas podem ser integradas em PDF para controlar precisamente a saída final.

Três padrões em um

EPUB consiste em três especificações de IDPF separadas, embora na prática, é seguro referir-se a elas coletivamente como EPeUB:

  • Open eBook Publication Structure Container Format (OCF): Especifica a estrutura em árvore de diretórios e formato de arquivo (ZIP) de um archive EPUB.
  • Open Publication Structure (OPS): Define os vocabulários comuns do eBook, especialmente os formatos permitidos para uso no conteúdo do livro (por exemplo, XHTML e CSS).
  • Open Packaging Format (OPF): Descreve os metadados obrigatórios e opcionais, ordem de leitura e índice em um EPUB.

Adicionalmente, o EPUB reutiliza vários outros padrões, como XHTML versão 1.0 e Digital Accessible Information SYstem (DAISY), para tipos específicos de conteúdo dentro do archive EPUB.

Do ponto de vista de um desenvolvedor de software, o PDF está muito longe do ideal:

  • Não é um padrão trivial para aprender; portanto, não é uma questão simples de se trabalhar com seu próprio código gerado em PDF.
  • Embora o PDF agora seja um padrão de organização internacional para normatização (ISO) (ISO 32000-1:2008), tradicionalmente tem sido controlado por uma única corporação: Adobe Systems.
  • Embora as bibliotecas do PDF estejam disponíveis para a maioria das linguagens de programação, muitas são comerciais e estão integradas em aplicativos da GUI e não são facilmente controladas por processos externos. Nem todas as bibliotecas livres permanecem mantidas ativamente.
  • O texto nativo em PDF pode ser extraído e procurado programaticamente, mas poucos PDFs são marcados de forma que a conversão para um formato propício para web fique simples e confiável.
  • Documentos PDF não são facilmente refluíveis, o que significa que não se adaptam bem a telas pequenas ou a mudanças radicais de layout.

Porque o EPUB é propício aos desenvolvedores

O EPUB refere-se a todas as falhas em PDF relacionadas à conveniência para o desenvolvedor. Um EPUB é um arquivo de formato ZIP simples (com uma extensão .epub ) que contém arquivos ordenados de maneira proscrita. Existem alguns requisitos de "manha" sobre como o archive ZIP é preparado, os quais serão discutidos em detalhes posteriormente em Empacotando seu arquivo EPUB como um archive ZIP . Por outro lado, o EPUB é simples:

  • Quase tudo em EPUB é XML. Arquivos EPUB podem ser desenvolvidos usando kits de ferramentas XML padrão sem qualquer software especial ou proprietário.
  • Conteúdo EPUB (o texto real de um eBook) quase sempre é XHTML na versão 1.1. (Um formato alternativo é DTBook, um padrão de codificação de livros para deficientes visuais. Consulte Resources para obter mais informações sobre DTBook, as quais não estão descritas neste tutorial).
  • Muitos dos esquemas XML são tirados das especificações publicadas existentes que estão livremente disponíveis.

Os dois principais pontos são: os metadados EPUB são XML e o conteúdo EPUB é XHTML. Se seu sistema de desenvolvimento de documentação produz saída para web e/ou é baseado em XML, então está bem próximo de ser capaz de produzir EPUB, também.


Desenvolvendo seu primeiro EPUB

Um pacote configurável EPUB de conformidade mínima possui alguns arquivos obrigatórios. A especificação pode ser bem rigorosa sobre o formato, conteúdo e local desses arquivos dentro do archive EPUB. Esta seção explica o que você deve saber quando trabalhar com o padrão EPUB.

Anatomia de um pacote configurável EPUB

A estrutura básica de um arquivo EPUB mínimo segue o padrão em Listagem 1. Quando pronto para distribuição, essa estrutura de diretório é empacotadas juntamente com o requisito em formato ZIP, com alguns requisitos especiais discutidos em Empacotando seu arquivo EPUB como um archive ZIP .

Listagem 1. Layout de diretório e arquivo para um archive EPUB simples
mimetype
META-INF/
   container.xml
OEBPS/
  content.opf
  title.html
  content.html
  stylesheet.css
  toc.ncx
  images/
     cover.png

Observação: Um livro de amostra que acompanha esse padrão está disponível em Downloads, mas recomendo que você crie seu próprio enquanto segue neste tutorial.

Para iniciar o desenvolvimento de seu livro EPUB, crie um diretório para o projeto EPUB. Abra um editor de texto ou um IDE, como o Eclipse. Recomendo usar um editor que possui o modo XML — em particular, um que possa validar com os esquemas Relax NG listados em Resources.

O arquivo tipo MIME

Esse tipo é bem fácil: O arquivo tipo MIME é necessário e deve ser nomeado mimetype. O conteúdo do arquivo é sempre:

application/epub+zip

Observe que o arquivo tipo MIME não pode conter nenhuma linha nova ou retorno de linha.

Além disso, o arquivo tipo MIME deve ser o primeiro arquivo no archive ZIP e ele próprio não deve ser compactado. Você verá como incluí-lo usando os argumentos ZIP comuns em Empacotando seu arquivo EPUB como um archive ZIP . Por ora, apenas crie esse arquivo e salve-o, certifique-se de que ele esteja no nível raiz de seu projeto EPUB.

META-INF/container.xml

No nível raiz do EPUB, deve haver um diretório META-INF, e ele deve conter um arquivo denominado container.xml. Os sistemas de leitura do EPUB procurarão por esse arquivo primeiro, já que ele aponta para o local dos metadados do livro digital.

Crie um diretório chamado META-INF. Dentro dele, abra um novo arquivo chamado container.xml para composição. O arquivo de contêiner é bem pequeno, mas seus requisitos estruturais são rigorosos. Cole o código em Listagem 2 META-INF/container.xml.

Listagem 2. Amostra o arquivo container.xml
<?xml version="1.0"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
  <rootfiles>
    <rootfile full-path="OEBPS/content.opf"
     media-type="application/oebps-package+xml" />
  </rootfiles>
</container>

O valor de caminho completo (em negrito) é a única parte desse arquivo que pode variar. O caminho do diretório deve ser relativo à raiz do próprio arquivo EPUB, não relativo ao diretório META-INF.

Mais sobre META-INF

O diretório META-INF pode conter alguns arquivos opcionais, também. Esses arquivos permitem que o EPUB suporte assinaturas digitais, criptografias e gerenciamento de direitos digitais (DRM). Esses tópicos não estão cobertos neste tutorial. Consulte a especificação OCF para obter mais informações.

Os arquivos tipo MIME e contêiner são os únicos dois cuja localização no archive do EPUB é rigorosamente controlada. Conforme recomendado (embora não obrigatório), armazene os arquivos restantes no EPUB em um subdiretório. (Por convenção, geralmente ele é chamado OEBPS, para Open eBook Publication Structure, mas pode ser qualquer nome que desejar).

Em seguida, crie um diretório denominado OEBPS em seu projeto EPUB. A seção a seguir deste tutorial descreve os arquivos que ficam dentro do OEBPS — a real alimentação do livro digital: seus metadados e suas páginas.

arquivo de metadados Open Packaging Format

Embora esse arquivo possa ter qualquer nome, o arquivo OPF normalmente é chamado content.opf. Ele especifica o local de todo conteúdo do livro, desde seu texto até outra mídia como imagens. Também aponta para outro arquivo de metadados, o índice Navigation Center eXtended (NCX).

O arquivo OPF é o metadado mais complexo na especificação EPUB. Crie o OEBPS/content.opf, e cole o conteúdo de Listagem 3 nele.

Listagem 3. Arquivo de conteúdo OPF com metadados de amostra
<?xml version='1.0' encoding='utf-8'?>
<package xmlns="http://www.idpf.org/2007/opf"
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            unique-identifier="bookid" version="2.0">
  <metadata>
    <dc:title>Hello World: My First EPUB</dc:title>
    <dc:creator>My Name</dc:creator>
    <dc:identifier
id="bookid">urn:uuid:0cc33cbd-94e2-49c1-909a-72ae16bc2658</dc:identifier>
    <dc:language>en-US</dc:language>
    <meta name="cover" content="cover-image" />
  </metadata>
  <manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
    <item id="cover" href="title.html" media-type="application/xhtml+xml"/>
    <item id="content" href="content.html"
media-type="application/xhtml+xml"/>
    <item id="cover-image" href="images/cover.png" media-type="image/png"/>
    <item id="css" href="stylesheet.css" media-type="text/css"/>
  </manifest>
  <spine toc="ncx">
    <itemref idref="cover" linear="no"/>
    <itemref idref="content"/>
  </spine>
  <guide>
    <reference href="title.html" type="cover" title="Cover"/>
  </guide>
</package>

Esquemas OPF e namespaces

O documento OPF em si deve usar o namespace http://www.idpf.org/2007/opf, e os metadados estarão no namespace Dublin Core Metadata Initiative (DCMI), http://purl.org/dc/elements/1.1/.

Seria uma boa ideia incluir o OPF e o esquema DCMI em seu editor XML. Todos os esquemas utilizados no EPUB estão disponíveis em Downloads.

Metadata

Dublin Core define um conjunto de termos de metadados comuns que podem ser usados para descrever uma grande variedade de materiais digitais; ele não faz parte da especificação do EPUB em si. Todos esses termos são permitidos na seção de metadados do OPF. Quando você desenvolver um EPUB para distribuição, inclua o máximo de detalhes que puder aqui, embora a extração fornecida em Listagem 4 seja suficiente para iniciar.

Listagem 4. Extração dos metadados OPF
...
<metadata>
  <dc:title>Hello World: My First EPUB</dc:title>
  <dc:creator>My Name</dc:creator>
  <dc:identifier id="bookid">urn:uuid:12345</dc:identifier>
  <meta name="cover" content="cover-image" />
</metadata>
...

Os dois termos obrigatórios são title e identificador. De acordo com a especificação do EPUB, o identificador deve ser um valor exclusivo, muito embora seja critério do criador do livro digital definir esse valor exclusivo. Para publicadores de livro, esse campo normalmente conterá um número ISBN ou Library of Congress. Para outros criadores do EPUB, considere usar uma URL ou um ID de usuário exclu dc:identifier .

Outros metadados a considerar para incluir, se forem relevantes a seu conteúdo, incluem:

  • Idioma (como dc:language).
  • Data de publicação (como dc:date).
  • Publicador (como dc:publisher). (Esse pode ser sua empresa ou nome individual).
  • Informações sobre copyright (como dc:rights). (Se estiver liberando o trabalho sob uma licença Creative Commons, coloque a URL da licença aqui).

Consulte Resources Para obter mais informações sobre DCMI.

Incluindo um elemento meta com o atributo nome contendo capa não faz parte da especificação do EPUB diretamente, mas é uma maneira recomendada de criar páginas de capa e imagens de maneira mais móvel. Alguns renderizadores EPUB preferem usar um arquivo de imagem como capa, enquanto outros utilizarão um arquivo XHTML contendo uma imagem de capa em sequência. Este exemplo mostra as duas formas. O valor do atributo meta , o atributo conteúdo deve ser o ID da imagem de capa do livro no manifesto, que é a próxima parte do arquivo OPF.

Manifesto

O manifesto OPF lista todos os recursos encontrados no EPUB que fazem parte do conteúdo (e excluindo metadados). Geralmente, isso se refere a uma lista de arquivos XHTML que compõem o texto do eBook mais alguma mídia relacionada, como imagens. O EPUB encoraja o uso de CSS para conteúdo de lucro de estilo, portanto os arquivos CSS também estão incluídos no manifesto. Todo arquivo que entrar em seu livro digital deve estar listado no manifesto.

A Listagem 5 mostra a seção de manifesto extraído.

Listagem 5. Extração do manifesto OPF
...
<manifest>
  <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
  <item id="cover" href="title.html" media-type="application/xhtml+xml"/>
  <item id="content" href="content.html" media-type="application/xhtml+xml"/>
  <item id="cover-image" href="images/cover.png" media-type="image/png"/>
  <item id="css" href="stylesheet.css" media-type="text/css"/>
</manifest>
...

Manifestos OPF avançados

Uma amostra mais avançada de um arquivo de manifesto incluirá diversos arquivos XHTML como também imagens e um CSS. Obtenha um EPUB completo com exemplos de tipos comuns de Downloads.

Você deve incluir o primeiro item, toc.ncx (discutido na próxima seção). Observe que todos os itens possuem um valor de tipo de mídia apropriado e que o tipo de mídia do conteúdo XHTML é application/xhtml+xml. O valor exato é obrigatório e não pode ser text/html ou algum outro tipo.

O EPUB suporta quatro formatos de arquivo de imagem como tipos principais : Joint Photographic Experts Group (JPEG), Portable Network Graphics (PNG), Graphics Interchange Format (GIF) e Scalable Vector Graphics (SVG). É possível incluir tipos de arquivos não suportados se você fornecer um fall-back para um tipo principal. Consulte a especificação de OPF para obter mais informações sobre itens de fall-back.

Os valores do atributo href devem ser um Identificador Uniforme de Recursos (URI) que esteja relativo ao arquivo OPF. (É fácil confundir com a referência ao arquivo OPF no arquivo container.xml, no qual deve ser relativo ao EPUB como um todo). Nesse caso, o arquivo OPF está no mesmo diretório OEBPS que seu conteúdo, portanto nenhuma informação de caminho é necessária aqui.

Spine

Embora o manifesto informe ao leitor EPUB quais arquivos fazem parte do archive, o spine indica a ordem na qual eles aparecem, ou — em termos de EPUB, — a ordem de leitura linear do livro digital. Um modo de pensar do OPF spine é que ele define a ordem das "páginas" do livro. O spine é lido na ordem do documento, da parte superior para a parte inferior. A Listagem 6 mostra uma extração do arquivo OPF.

Listagem 6. Extração do OPF spine
...
<spine toc="ncx">
  <itemref idref="cover" linear="no"/>
  <itemref idref="content"/>
</spine>
...

Cada elemento itemref possui um atributo obrigatório idref, que deve corresponder a um dos IDs no manifesto. O atributo toc também é obrigatório. Refere-se a um ID no manifesto que deve indicar o nome do arquivo do índice NCX.

O atributo linear no spine indica se o item é considerado parte da ordem de leitura linear ou se é irrelevante em termos de frente ou final. Recomendo que você defina qualquer página de capa como linear=no. De acordo com o EPUB, os sistemas de leitura abrirão o livro no primeiro item no spine, ou seja não definido como linear=no.

Guia

A última parte do arquivo de conteúdo OPF é o guia. Esta seção é opcional, mas recomendada. A Listagem 7 mostra uma extração de um arquivo de guia.

Listagem 7. Extração de um guia OPF
...
<guide>
  <reference href="cover.html" type="cover" title="Cover"/>
</guide>
...

O guia é uma maneira de fornecer informações semânticas a um sistema de leitura EPUB. Enquanto o manifesto define os recursos físicos no EPUB e o spine forneça informações sobre sua ordem, o guia explica o que as seções significam. Aqui está uma lista parcial dos valores que são permitidos no guia OPF:

  • capa: A capa do livro
  • título-página: Uma página com informações do autor e publicador
  • toc: O índice

Para obter uma lista completa, consulte a especificação OPF 2.0, disponível em Resources.

Índice NCX

sobreposição entre metadados NCX e OPF

Como o NCX é emprestado de outro padrão, há algumas sobreposições entre as informações codificadas no NCX e aquelas no OPF. Isso raramente é problema quando você gera EPUBs programaticamente, onde o mesmo código pode sair para dois arquivos diferentes. Tenha cuidado ao colocar as mesmas informações nos dois lugares, já que diferentes leitores do EPUB podem usar os valores de um ou de outro.

Embora o arquivo OCF seja definido como parte do EPUB em si, o último arquivo de metadados principal é emprestado de um padrão de livro digital diferente. DAISY é um consórcio que desenvolve formatos de dados para leitores que são incapazes de usar livros tradicionais, geralmente por causa de deficiência visual ou incapacidade para manipular livros impressos. EPUB emprestou o NCX DTD do DAISY. O NCX define o índice do livro digital. Em livros complexos, normalmente ele é hierárquico, contendo partes aninhadas, capítulos e seções.

Usando seu editor de XML, crie o OEBPS/toc.ncx, e inclua o código em A Listagem 8.

Listagem 8. Arquivo NCX simples
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"
                 "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
  <head>
    <meta name="dtb:uid"
content="urn:uuid:0cc33cbd-94e2-49c1-909a-72ae16bc2658"/>
    <meta name="dtb:depth" content="1"/>
    <meta name="dtb:totalPageCount" content="0"/>
    <meta name="dtb:maxPageNumber" content="0"/>
  </head>
  <docTitle>
    <text>Hello World: My First EPUB</text>
  </docTitle>
  <navMap>
    <navPoint id="navpoint-1" playOrder="1">
      <navLabel>
        <text>Book cover</text>
      </navLabel>
      <content src="title.html"/>
    </navPoint>
    <navPoint id="navpoint-2" playOrder="2">
      <navLabel>
        <text>Contents</text>
      </navLabel>
      <content src="content.html"/>
    </navPoint>
  </navMap>
</ncx>

Metadados NCX

O DTD requer quatro elementos meta dentro do NCX <head> :

  • uid: É o ID exclusivo do livro digital. Esse elemento deve corresponder ao dc:identifier no arquivo OPF.
  • profundidade: Reflete o nível de hierarquia no índice. Esse exemplo possui somente um nível, portanto esse valor é 1.
  • totalPageCount e maxPageNumber: Aplica-se somente a livros impressos e pode ser deixado como 0.

O conteúdo de docTitle/text é o título do trabalho, e corresponde ao valor de dc:title no OPF.

NCX navMap

Qual a diferença entre NCX e o OPF spine?

É compreensível estar confuso, já que ambos os arquivos descrevem a ordem e o conteúdo do documento. A maneira mais fácil de explicar a diferença é por analogia com um livro impresso: O OPF spine descreve como as seções do livro são fisicamente vinculadas entre si, como que a última página do final de um capítulo revela a primeira página do segundo capítulo. O NCX descreve o índice no final do livro. O índice sempre inclui todas as principais seções do livro, mas também pode listar as subseções, o que não ocorre em suas próprias páginas.

Uma boa regra prática e que o NCX normalmente contém mais elementos navPoint do que elementos itemref no OPF spine. Na prática, todos os itens no spine aparecem no NCX, mas o NCX pode ser mais granular do que o spine.

O operador navMap é a parte mais importante do arquivo NCX, já que ele define o índice do livro real. A seção navMap contém um ou mais elementos navPoint . Cada navPoint deve conter os seguintes elementos:

  • Um atributo playOrder , que reflete a ordem de leitura do documento. Essa ordem segue a mesma da lista de elementos itemref no OPF spine.
  • Um elemento navLabel/text , que descreve o título dessa seção do livro. Normalmente é um título do capítulo ou número, como "Capítulo um," ou—como nesse exemplo —"Página de capa."
  • Um elemento conteúdo cujo atributo src aponta para o recurso físico que contém o conteúdo. Esse será um arquivo declarado no manifesto OPF. (também é aceitável usar identificadores de fragmento aqui para apontar para âncoras dentro do conteúdo XHTML — por exemplo, content.html#footnote1.)
  • Opcionalmente, um ou mais elementos filho navPoint . Pontos aninhados são como os documentos hierárquicos são expressos no NCX.

A estrutura do livro de amostra é simples: Possui apenas duas páginas e não estão aninhadas. Isso significa que você terá dois elementos navPoint com valores ascendentes playOrder , começando em 1. No NCX, você tem a oportunidade de nomear essas seções, permitindo que os leitores pulem para diferentes partes do eBook.

Incluindo o conteúdo final.

Agora você conhece todos os metadados necessários no EPUB, então é hora de inserir o conteúdo real do livro. É possível usar o conteúdo de amostra fornecido em Downloads ou criar seu próprio conteúdo, desde que os nomes de arquivo correspondam aos metadados.

Em seguida, crie esses arquivos e pasta:

  • title.html: Esse arquivo será a página de titularidade do livro. Crie esse arquivo e inclua um elemento img que faça referência a uma imagem de capa, com o valor do atributo src como images/cover.png.
  • imagens: Crie essa pasta dentro do OEBPS, em seguida copie a imagem de amostra (ou crie sua própria), nomeando-a cover.png.
  • content.html: Esse será o texto real do livro.
  • stylesheet.css: Coloque esse arquivo no mesmo diretório OEBPS que os arquivos XHTML. Esse arquivo pode conter qualquer declaração CSS que você desejar, como a configuração de tipo de fonte ou cor de texto. Consulte A Listagem 10 para obter um exemplo desse arquivo CSS.

XHTML e CSS em um livro EPUB

Listagem 9 contém um exemplo de uma página de conteúdo EPUB válida. Use essa amostra para sua página de título (title.html) e uma semelhante para a página de conteúdo principal (content.html) de seu livro.

Listagem 9. Página de título de amostra (title.html)
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Hello World: My First EPUB</title>
    <link type="text/css" rel="stylesheet" href="stylesheet.css" />
  </head>
  <body>
    <h1>Hello World: My First EPUB</h1>
    <div><img src="images/cover.png" alt="Title page"/></div>
  </body>
</html>

O conteúdo XHTML no EPUB segue algumas regras que podem ser pouco familiares a você do ponto de vista de desenvolvimento da desenvolvimento geral:

  • O conteúdo deve ser validado como XHTML 1.1: A única diferença significativa entre XHTML 1.0 Strict e XHTML 1.1 é que o atributo nome foi removido. (Use os IDs para se referir às âncoras dentro do conteúdo). Elementos
  • img podem fazer referência somente a imagens locais no eBook: Os elementos não podem fazer referência a imagens na web.
  • script blocos devem ser evitados: Não há requisito para leitores do EPUB terem suporte de código JavaScript.

Há algumas diferenças menores na maneira como o EPUB suporta CSS, mas nenhuma que afete o uso comum dos estilos (consulte a especificação OPS para obter detalhes). A Listagem 10 demonstra um arquivo CSS simples que pode ser aplicado ao conteúdo para definir recomendações de fontes básicas e a cor dos títulos em vermelho.

Lista 10. Estilos da amostra para o eBook (stylesheet.css)
body {
  font-family: sans-serif;     
}
h1,h2,h3,h4 {
  font-family: serif;     
  color: red;
}

Um ponto de interesse é que o EPUB suporta especialmente a regra CSS 2 @font-face , que permite fontes integradas. Se você criar documentação técnico, isso provavelmente não é relevante, mas os desenvolvedores que criarem EPUBs em vários idiomas ou para domínios especializados apreciarão a capacidade de especificar dados de fonte exatos.

Agora você já possui tudo o que precisa para criar seu primeiro EPUB. Na seção seguinte, você irá empacotar o livro de acordo com as especificações OCF e descobrir como validá-lo.


Empacotar e Verificar seu EPUB

Nesta altura, você já deve ter um pacote configurável EPUB pronto para empacotar. Esse pacote configurável poderá ser um novo livro que você mesmo criou ou um que utiliza os arquivos brutos disponíveis de Downloads.

Empacotando seu arquivo EPUB como um archive ZIP

A parte do Formato de Contêiner OEBPS da especificação EPUB possui diversas coisas para serem expostas sobre EPUB e ZIP, mas as mais importantes são:

  • O primeiro arquivo no archive deve ser um arquivo tipo MIME (consulte Mimetype neste tutorial). O arquivo tipo MIME não deve ser compactado. Isso permite que utilitários não ZIP descubram o tipo MIME lendo os bytes brutos, começando da posição 30 no pacote configurável EPUB.
  • O archive ZIP não pode ser criptografado. O EPUB suporta criptografia mas não no nível do arquivo zip.

Usando ZIP versão 2.3 sob um sistema operacional como o UNIX®, crie o arquivo EPUB ZIP em dois comandos, como em Listagem 11. (Esses comandos presumem que seu diretório atualmente em funcionamento seja seu projeto EPUB).

Listagem 11. Empacotando o EPUB em um arquivo epub+zip válido
$ zip -0Xq  my-book.epub mimetype
$ zip -Xr9Dq my-book.epub *

No primeiro comando, você cria o novo archive ZIP e inclui o arquivo tipo MIME sem nenhuma compactação. No segundo, você inclui os itens restantes. Os sinalizadores -X e -D minimizam as informações irrelevantes no arquivo zip; -r incluirá recursivamente o conteúdo dos diretórios META-INF e OEBPS.

Validação do EPUB

Embora o padrão do EPUB não seja especialmente difícil, seus arquivos XML devem ser validados com esquemas específicos. Se você usar um editor XML ciente de esquema para gerar os metadados e XHTML, já terá mais de meio caminho andado. Faça uma verificação final com o pacote EpubCheck (consulte Resources).

Adobe mantém o pacote EpubCheck, e está disponível como um software livre sob licença de Berkeley Software Distribution (BSD). É um programa Java que pode executar como uma ferramenta independente ou como um aplicativo da web, ou pode ser integrado em um aplicativo que execute em Java Runtime Environment (JRE) versão 1.5 ou posterior.

Executá-lo a partir da linha de comando é simples. Listagem 12 dá um exemplo.

Listagem 12. Executando o utilitário EpubCheck
$ java -jar /path/to/epubcheck.jar my-book.epub

Se você falhar ao criar alguns dos arquivos auxiliares ou se introduziu um erro nos arquivos de metadados, poderá obter uma mensagem de erro semelhante aquela em Listagem 13.

Lista 13. Amostra de erros do EpubCheck
my-book.epub: image file OEBPS/images/cover.png is missing
my-book.epub: resource OEBPS/stylesheet.css is missing
my-book.epub/OEBPS/title.html(7): 'OEBPS/images/cover.png': 
     referenced resource missing in the package

Check finished with warnings or errors!

Pode ser necessário configurar seu CLASSPATH aqui para apontar para o local da instalação EpubCheck, já que ele possui algumas bibliotecas externas para importar. Você provavelmente precisará configurar o CLASSPATH se receber uma mensagem como:

org.xml.sax.SAXParseException: no implementation available for schema language 
   with namespace URI "http://www.ascc.net/xml/schematron"

Se a validação foi bem-sucedida, verá "Nenhum erro ou avisos detectados". Nesse caso, parabéns por produzir seu primeiro EPUB!

Visualização do EPUB

Testar não serve somente para validação: Trata-se também de certificar-se de que o livro esteja correto. As folhas de estilo funcionam corretamente? As seções estão realmente na ordem lógica correta? O livro inclui todo o conteúdo esperado?

Diversos leitores do EPUB estão disponíveis para você usar para testar. a Figura 1 mostra uma captura de tela de Adobe Digital Editions (ADE), o leitor do EPUB mais usado normalmente.

Figura 1. O EPUB no ADE
O EPUB no ADE

As cores da fonte e imagens estão aparecendo, o que é bom. O ADE não apresenta renderização correta no título em uma fonte sans-serif, apesar de que isso pode ser um problema com o CSS. É interessante aqui verificar em outro leitor. a Figura 2 mostra o mesmo livro renderizado em meu software livre, Bookworm, leitor do EPUB baseado na web.

Figura 2. O EPUB em Bookworm
O EPUB em Bookworm

Neste caso, acontece apenas que esse ADE não suporta essa declaração particular. Conhecer as sutilezas de um software de leitura individual será fundamental se em seu livro digital for importante uma formatação precisa.

Agora que você já passou pelo processo trabalhoso de criação de um EPUB simples a partir de rascunho, veja o que é preciso para converter DocBook, um esquema de documentação XML comum, em EPUB.


De DocBook para EPUB

DocBook é uma opção comum para desenvolvedores que precisam manter documentação técnica em formato longo. Diferentemente dos arquivos produzidos por programas de processamento de texto tradicionais, é possível gerenciar a saída de DocBook com sistemas de controle de versão baseados em texto. Como o DocBook é XML, você pode transformá-lo facilmente em diversos formatos de saída. Desde o terceiro trimestre de 2008, é possível localizar suporte de EPUB como um formato de saída do projeto DocBook XSL oficial.

Executando o pipeline DocBook-para-EPUB básico com XSLT

Inicie com um documento DocBook simples, em a Listagem 14. Esse documento está definido como tipo livro e inclui um prefácio, dois capítulos e uma imagem sequencial exibida na página de título. Esse imagem estará localizada no mesmo diretório em que o arquivo de origem do DocBook. Crie esse arquivo e a página de título você mesmo, ou faça download de amostras de Downloads.

Listagem 14. Um livro DocBook simples
<?xml version="1.0" encoding="utf-8"?>
<book>
  <bookinfo>
    <title>My EPUB book</title>
    <author><firstname>Liza</firstname>
            <surname>Daly</surname></author>
    <volumenum>1234</volumenum>
  </bookinfo>
  <preface id="preface">
    <title>Title page</title>
    <figure id="cover-image">
      <title>Our EPUB cover image icon</title>
      <graphic fileref="cover.png"/>
    </figure>
  </preface>
  <chapter id="chapter1">
    <title>This is a pretty simple DocBook example</title>
    <para>
      Não há muito para ver aqui. 
    </para>
  </chapter>
  <chapter id="end-notes">
    <title>End notes</title>
    <para>
      Este espaço é deixado em branco intencionalmente.
    </para>
  </chapter>
</book>

Em seguida, consulte Resources para fazer o download da versão mais recente das folhas de estilo do DocBook XSL, e certifique-se de ter um processador XSLT como xsltproc ou Saxon instalado. Esse exemplo utiliza xsltproc, que está disponível na maioria dos sistemas como UNIX. Para converter o arquivo DocBook, simplesmente execute esse arquivo com o módulo do EPUB incluído no DocBook XSL, como em A Listagem 15.

Lista 15. Convertendo DocBook em EPUB
$ xsltproc /path/to/docbook-xsl-1.74.0/epub/docbook.xsl docbook.xml
Writing OEBPS/bk01-toc.html for book
Writing OEBPS/pr01.html for preface(preface)
Writing OEBPS/ch01.html for chapter(chapter1)
Writing OEBPS/ch02.html for chapter(end-notes)
Writing OEBPS/index.html for book
Writing OEBPS/toc.ncx
Writing OEBPS/content.opf
Writing META-INF/container.xml

Customizando o DocBook XSL

O pipeline de conversão do DocBook-para-EPUB ainda é relativamente novo, pode ser necessário customizar o XSLT para obter a saída desejada.

Em seguida, inclua o arquivo tipo MIME e desenvolva o archive epub+zip você mesmo. Listagem 16 mostra os três comandos rápidos e o resultado de uma passagem pelo validador EpubCheck.

Listagem 16. Criando o archive EPUB de DocBook
$ echo "application/epub+zip" > mimetype
$ zip -0Xq  my-book.epub mimetype
$ zip -Xr9D my-book.epub *
$ java -jar epubcheck.jar my-book.epub 
No errors or warnings detected

Bem fácil! a Figura 3 mostra sua criação em ADE.

Figura 3. DocBook EPUB convertido em ADE
DocBook EPUB convertido em ADE

Conversão automática de DocBook-para-EPUB com Python e lxml

O DocBook XSL tem se empenhado em tornar a geração do EPUB menos complicada, mas você deve executar algumas etapas fora do XSLT. Esta última seção demonstra um programa Python de amostra que conclui a criação de um pacote configurável EPUB válido. Mostro métodos individuais no tutorial; você pode obter o programa docbook2epub.py completo em Downloads.

Diversos bibliotecas Python XSLT estão disponíveis, mas minha preferida é lxml. Ela fornece não penas funcionalidade XSLT 1.0, mas também análise de alto desempenho, suporte integral de XPath 1.0 e extensões especiais para manipulação de HTML. Se preferir uma biblioteca diferente ou usar uma linguagem de programação diferente de Python, esses exemplos devem ser fáceis de adaptar.

Chamando o DocBook XSL com lxml

O método mais eficiente de chamar XSLT usando lxml é de antemão analisar o XSLT, então criar um transformador para uso repetitivo. Isso é útil, desde que meu script DocBook-para-EPUB aceite vários arquivos DocBook para converter.A Listagem 17 demonstra essa abordagem.

Listagem 17. Executando o DocBook XSL usando lxml
import os.path
from lxml import etree

def convert_docbook(docbook_file):
    docbook_xsl = os.path.abspath('docbook-xsl/epub/docbook.xsl')
    # Dê ao processador XSLT a capacidade de criar novos diretórios
    xslt_ac = etree.XSLTAccessControl(read_file=True,
                                      write_file=True,
                                      create_dir=True,
                                      read_network=True,
                                      write_network=False)
    transform = etree.XSLT(etree.parse(docbook_xsl), access_control=xslt_ac)
    transform(etree.parse(docbook_file))

O módulo EPUB em DocBook XSL cria ele mesmo os arquivos de saída, assim nada é retornado da avaliação da transformação aqui. Em vez disso, o DocBook cria duas pastas (META-INF e OEBPS) no diretório ativo atual para conter os resultados da conversão.

Copiando as imagens e outros recursos no archive

O DocBook XSL não faz nada com as imagens que você possa fornecer para uso em seu documento; ele apenas cria os arquivos de metadados e o XHTML renderizado. Como a especificação do EPUB requer que todos os recursos sejam listados no manifesto content.opf, é possível inspecionar o manifesto para localizar as imagens que foram referidas no arquivo DocBook original. A Listagem 18 mostra essa técnica, que presume que a variável path contenha o caminho para seu EPUB em andamento, conforme criado pelo DocBook XSLT.

Listagem 18. Analisar o arquivo de conteúdo OPF para localizar quaisquer recursos ausentes.
import os.path, shutil
from lxml import etree

def find_resources(path='/path/to/our/epub/directory'):
    opf = etree.parse(os.path.join(path, 'OEBPS', 'content.opf'))

    # Todos os elementos opf:item são recursos para o item em opf.xpath('//opf:item',
                          namespaces= { 'opf': 'http://www.idpf.org/2007/opf' }):

        # Se o recurso ainda não tiver sido criado pelo próprio DocBook XSL,
        # copie-o na pasta do OEBPS
        href = item.attrib['href']
        referenced_file = os.path.join(path, 'OEBPS', href):
        if not os.path.exists(referenced_file):
            shutil.copy(href, os.path.join(path, 'OEBPS'))

Criando o arquivo tipo MIME automaticamente

O DocBook XSL não criará seu arquivo tipo MIME, também, mas uma rápida consulta no código da Listagem 19 pode resolver isso.

Listagem 19. Criar um arquivo tipo MIME
def create_mimetype(path='/path/to/our/epub/directory'):
    f = '%s/%s' % (path, 'mimetype')
    f = open(f, 'w')
    # Cuidado para não incluir uma nova linha aqui
    f.write('application/epub+zip')
    f.close()

Criando o pacote configurável do EPUB com Python

Tudo o que resta agora é empacotar os arquivos em um arquivo EPUB ZIP válido. Isso exige duas etapas: incluir o arquivo tipo MIME como o primeiro no archive sem nenhuma compactação e, em seguida, incluir os diretórios restantes. A Listagem 20 mostra o código para esse processo.

Listagem 20. Usando o módulo do arquivo zip Python para criar um pacote configurável EPUB
import zipfile, os

def create_archive(path='/path/to/our/epub/directory'):
    '''Create the ZIP archive.  The mimetype must be the first file in the archive 
    and it must not be compressed.'''

    epub_name = '%s.epub' % os.path.basename(path)

    # The EPUB must contain the META-INF and mimetype files at the root, so 
    # we'll create the archive in the working directory first and move it later
    os.chdir(path)    

    # Open a new zipfile for writing
    epub = zipfile.ZipFile(epub_name, 'w')

    # Add the mimetype file first and set it to be uncompressed
    epub.write(MIMETYPE, compress_type=zipfile.ZIP_STORED)
    
    # For the remaining paths in the EPUB, add all of their files
    # using normal ZIP compression
    for p in os.listdir('.'):
        for f in os.listdir(p):
            epub.write(os.path.join(p, f)), compress_type=zipfile.ZIP_DEFLATED)
    epub.close()

Só isso! Lembre-se de validar.


Resumo

O script Python na seção anterior é somente uma primeira etapa ao automatizar integralmente qualquer tipo de conversão do EPUB. Para ser breve, essa etapa não lida com muitos casos comuns, como caminhos aninhados arbitrariamente, folhas de estilos ou fontes integradas. Os fãs de Ruby podem dar uma olhada em dbtoepub, incluído na distribuição do DocBook XSL, para verem uma abordagem semelhante nessa linguagem.

Como o EPUB é um formato relativamente novo, muitos caminhos de conversão úteis ainda aguardam criação. Felizmente, muitos tipos de marcação estruturada, como reStructuredText ou Markdown, possuem pipelines que já produzem HTML ou XHTML. Adaptar isso para produzir EPUBs deve ser bastante simples, especialmente usando os scripts do DocBook-para-EPUB Python ou Ruby como guia.

Como o EPUB é principalmente ZIP e XHTML, há poucos motivos para não distribuir pacotes configuráveis de documentação como archives do EPUB, em vez de simples arquivos .zip. Usuários com leitores de EPUB se beneficiam dos metadados adicionais e índices automáticos, mas aqueles sem podem simplesmente tratar o archive do EPUB como um arquivo ZIP normal e visualizar o conteúdo XHTML em um navegador. Considere a inclusão do código gerado por EPUB para qualquer tipo de sistema de documentação, como Javadoc ou Perldoc. O EPUB é desenvolvido para documentação no comprimento de livro, portanto é um formato de distribuição perfeito para o crescente número de livros de programação online ou em andamento.


Downloads

DescriçãoNomeTamanho
Resources to build the EPUB in this tutorialepub-raw-files.zip8KB
DocBook to EPUB tools1docbook-to-epub.zip7KB

Nota

  1. Esse arquivo .zip contém a amostra do arquivo DocBook XML ilustrado no tutorial e um script docbook2epub.py completo. Você deve fazer o download do lxml e DocBook XSL separadamente; consulte os links em Resources.

Recursos

Aprender

Obter produtos e tecnologias

  • EpubCheck: Adobe EpubCheck é uma ferramenta de grande valor para criação do EPUB. Faça download e execute-o como um programa independente, um aplicativo da web, ou como uma biblioteca (requer Java versão 1.5 ou posterior).
  • DocBook XSL: Faça download da última versão das folhas de estilo para processamento de DocBook no EPUB. O pacote DocBook XSL também inclui um script Ruby para processamento em um archive de EPUB completo, semelhante ao script Python demonstrado neste tutorial.
  • lxml: Caso você não o tenha instalado atualmente, o lxml é a biblioteca XML mais bem equipada disponível para Python. Para obter mais informações sobre lxml, consulte o artigo do autor High-performance XML parsing in Python with lxml (Liza Daly, developerWorks, outubro de 2008).
  • Edições Digitais Adobe e Bookworm: Para teste de EPUB, os e-readers que seguem mais de perto a especificação são ADE, um aplicativo desktop de plataforma cruzada, e Bookwork, o e-reader baseado na web do autor, que utiliza o navegador para renderização de EPUB.
  • Software de avaliação da IBM para avaliação de produto : Desenvolva seu próximo projeto com o software de avaliação disponível para download diretamente do developerWorks, incluindo ferramentas de desenvolvimento de aplicativo e produtos de middleware do DB2®, Lotus®, Rational®, Tivoli®eWebSphere®.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Desenvolvimento móvel
ArticleID=837870
ArticleTitle=Desenvolver um Livro Digital com EPUB
publish-date=10012012