Como desenvolver um livro digital com EPUB
Autor: Adriano Azevedo | Publicado: 2012-11-26T22:39:00-03:00


Este artigo 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 artigo

Você inicia este artigo gerando um livro EPUB manualmente para ajudar a conhecer todos os componentes e arquivos necessários. Em seguida, o artigo 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.

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.



Objetivos

Neste artigo, 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 artigol, 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 artigo, sobre automatizar a criação de EPUB, este artigo 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 artigo.

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.

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.



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”.

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.

 &lt;?xml version="1.0"?&gt;
&lt;container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container"&gt;
  &lt;rootfiles&gt;
    &lt;rootfile full-path="OEBPS/content.opf"
     media-type="application/oebps-package+xml" /&gt;
  &lt;/rootfiles&gt;
&lt;/container&gt;


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.

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.

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


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.

...
&lt;manifest&gt;
&lt;item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/&gt;
&lt;item id="cover" href="title.html" media-type="application/xhtml+xml"/&gt;
&lt;item id="content" href="content.html" media-type="application/xhtml+xml"/&gt;
&lt;item id="cover-image" href="images/cover.png" media-type="image/png"/&gt;
&lt;item id="css" href="stylesheet.css" media-type="text/css"/&gt;
&lt;/manifest&gt;
...


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.

...
&lt;spine toc="ncx"&gt;
&lt;itemref idref="cover" linear="no"/&gt;
&lt;itemref idref="content"/&gt;
&lt;/spine&gt;
...


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.

...
&lt;guide&gt;
&lt;reference href="cover.html" type="cover" title="Cover"/&gt;
&lt;/guide&gt;
...


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

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.

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


Metadados NCX

O DTD requer quatro elementos meta dentro do NCX &lt;head&gt; :


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

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.

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;title&gt;Hello World: My First EPUB&lt;/title&gt;
&lt;link type="text/css" rel="stylesheet" href="stylesheet.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Hello World: My First EPUB&lt;/h1&gt;
&lt;div&gt;&lt;img src="images/cover.png" alt="Title page"/&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;


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);


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.

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 artigo). 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.

$ 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.

$ 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.

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.



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.



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.

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


Em seguida, consulte Recursos 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.

$ 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


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.

$ echo "application/epub+zip" &gt; 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.



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.

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.

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.

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.

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.

***

IBM® Tivoli® Monitoring ajuda a otimizar o desempenho e a disponibilidade da infraestrutura de TI. Use o software Tivoli Monitoring para gerenciar sistemas operacionais, bancos de dados e servidores em ambientes distribuídos e de host.

Downloads


DescriçãoNomeTamanhoMétodo de download
Resources to build the EPUB in this tutorialepub-raw-files.zip8KBHTTP
DocBook to EPUB tools1docbook-to-epub.zip7KBHTTP



Informações sobre métodos de download

Nota


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


Especificações de EPUB completas : Leia as especificações disponíveis no site da IDPF, inclusive Open Publication Structure (OPS), Open Packaging Format (OPF) e OEBPS Container Format (OCF).


XHTML 1.1 e DAISY: Para obter mais informações sobre os formatos de conteúdo do EPUB, consulte a especificação XHTML 1.1 (atualmente um Rascunho do trabalho W3C) e a especificação DAISY para Digital Talking Book (DTBook).


Inclua validação EPUB automática para seu editor XML com os diversos esquemas de formatos e arquivos EPUB:


NCX DTD (conversão para Relax NG)


OPF 2.0 (Relax NG)


OCF 1.0 (Relax NG)




Dublin Core Metadata: Para saber mais sobre termos de metadados disponíveis em Dublin Core, consulte o documento Termos DCMI e o guia de uso .


eventos técnicos do developerWorks e webcasts: Mantenha-se atualizado com relação à tecnologia mais recente.


biblioteca técnica de XML: Consulte a zona XML do developerWorks para obter uma ampla faixa de artigos técnicos e dicas, tutoriais, normas e IBM Redbooks.


Livraria de tecnologia: Procure livros sobre esses e outros tópicos técnicos.


Certificação XML da IBM: Descubra como é possível se tornar um Desenvolvedor Certificado pela IBM em XML e tecnologias relacionadas.


Podcasts do developerWorks: escute entrevistas e debates interessantes para desenvolvedores de software.



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


Fóruns de discussão da zona de XML: Participe de qualquer uma das várias discussões relacionadas a XML.


zona XML do developerWorks: Compartilhe seus pensamentos: Depois de ler esse artigo, poste seus comentários e pensamentos neste fórum. Os editores da zona XML atuam como moderadores do fórum e recebem bem sua entrada.


Blogs do developerWorks Confira os blogs do developerWorks e participe da Comunidade do developerWorks.



***

Sobre o autor: Liza 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.

***

Artigo original disponível em: http://www.ibm.com/developerworks/br/xml/tutorials/x-epubtut/authors.html