Formato EPUB

eBook

Los libros electrónicos son ya bastante comunes y populares. Resultan cómodos de manejar y tienen ciertas ventajas sobre los libros tradicionales.

Para algunas cosas resultan preferibles los libros en papel, pero para un programador tal vez sea más interesante saber cómo funcionan los e-books, y sobre todo, cómo crearlos.

Existen varios formatos de e-book. En el presente artículo nos centraremos en el formato EPUB, y concretamente en la versión 3. Existen conversores de formato, y es bastante sencillo obtener conversiones a otros tipos a partir de EPUB, ya que es un estándar bastante extendido.

Estructura de un fichero EPUB

Estructura EPUB
Estructura EPUB

Un fichero EPUB no es otra cosa que un fichero ZIP, que contiene una estructura de carpetas y ficheros XML que definen el contenido de una publicación, (casi siempre un libro, aunque puede ser cualquier documento).

Es sencillo ver el contenido de un fichero epub, basta con renombrarlo añadiendo la extensión ".zip", y descomprimirlo o navegar por su interior usando el explorador de archivos del sistema operativo.

Lo primero que encontraremos será un fichero de texto con el nombre "mimetype". Este fichero sólo contiene una línea de texto: "application/epub+zip". Es imprescindible que este fichero exista, que ese sea el contenido (que indica que se trata efectivamente de un fichero epub), y que ese fichero sea el primero que aparezca en el fichero comprimido.

Debido a esta última limitación no es recomendable utilizar cualquier herramienta de compresión, ya que en general no se puede garantizar el orden en que se añaden los ficheros al fichero de salida comprimido.

Si se quiere crear el fichero epub "a mano", se puede comprimir primero este fichero, y posteriomente añadir el resto de los ficheros al fichero comprimido.

Además de este fichero encontraremos dos carpetas:

  • META-INF: que contendrá al menos un fichero llamado "container.xml", que describiremos más adelante.
  • OEBPS: que contendrá:
    • Un fichero "content.opf" que describe el contenido del libro. También es un fichero xml, con varias secciones: metadata, manifest, spine, guide. Lo veremos con más detalles después.
    • Varias carpetas en las que se separaran diferentes tipos de archivos que definen el contenido del libro: texto, imágenes, hojas de estilo, etc.

El fichero container.xml

No hay mucho que comentar sobre éste fichero. El contenido es constante y únicamente hace referencia al fichero raiz del documento, que se encuentra en la carpeta OEBPS, y se llama content.opf.

EPUB 3 permite varias versiones del documento, de modo que pueden existir varios ficheros opf en diferentes directorios. En el presente artículo, sin embargo, nos limitaremos a documentos con una única versión.

A pesar de la extensión opf, se trata de un fichero xml, como veremos más abajo.

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

El fichero content.opf

En este archivo se almacenan los metadatos y estructura del documento. Es el fichero que se usará para procesar y mostrar el documento.

El esqueleto de este fichero es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" xmlns:opf="http://www.idpf.org/2007/opf" version="3.0" unique-identifier="BookID">
  <metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
  <!-- metadatos -->
  </metadata>
  <manifest>
  <!-- manifiesto -->
  </manifest>
  <spine toc="ncx">
  <!-- referencias de contenido -->
  </spine>
  <guide>
  <!-- guía -->
  </guide>
</package>

En cada una de las secciones: metadata, manifest, spine y guide, se incluirá información específica para que el dispositivo o programa correspondiente pueda procesar y visualizar el documento.

En el espacio con nombre opf se define la estructura del fichero y cada una de sus secciones. Puedes consultar la referencia en http://www.idpf.org/2007/opf.

Veamos cada sección por separado.

Sección de metadatos

Los metadatos contienen información sobre la publicación, como el título, autor, editorial, ISBN, fecha de publicación, etc.

La mayoria de estos metadatos están definidos en el espacio con nombre dc (Dublin Core), que puedes consultar en la página ttp://purl.org/dc/elements/1.1/.

La estructura del elemento metadata:

Uso:
REQUERIDO primer hijo del paquete.

Atributos
Ninguno

Contenido
En cualquier orden:
dc:identifier [1 o más]
dc:title [1 o más]
dc:language [1 o más]
DCMES Elementos Opcionales [0 o más]
meta [1 o más]
OPF2 meta [0 o más] (LEGADO)
link [0 o más]

Esto nos dice qué etiquetas deben aparecer, una o más veces, y cuáles son opcionales.

Es decir, al menos deben aparecer un identificador, un título y un idioma. El resto de etiquetas definidas en el espacio con nombre dc son opcionales.

También es obligatorio consignar una etiqueta meta.

Por último podemos añadir etiquetas del espacio con nombre opf y enlaces, opcionalmente.

Identificador identifier

Este contenido es obligatorio, y puede suponer un problema, ya que el identifiador del documento debe ser no ambiguo. Generalmente se usan números de registro, como el ISBN, pero si estamos creando una versión epub de un libro propio, o a partir de un contenido no registrado, no será sencillo generar un identificador.

En éste enlace, https://ns.editeur.org/onix/es/5 hay una tabla con posibles valores para el identificado.

Lo habitual es usar un UUID (identificador universalmente único). Hay páginas web que los generan automáticamente, y también hay librerías públicas que podemos usar en nuestros programas, por ejemplo https://github.com/rxi/uuid4.

Para usar esta librería en un programa C++ hay que modificar el fichero de cabecera "uuid4.h":

/**
 * Copyright (c) 2018 rxi
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the MIT license. See LICENSE for details.
 */

#ifndef UUID4_H
#define UUID4_H

#define UUID4_VERSION "1.0.0"
#define UUID4_LEN 37

#ifdef __cplusplus
extern "C" {
#endif
enum {
  UUID4_ESUCCESS =  0,
  UUID4_EFAILURE = -1
};

int  uuid4_init(void);
void uuid4_generate(char *dst);
#ifdef __cplusplus
}
#endif
#endif

Para generar identificadores uuid hay que invocar una vez la función uuid4_init(), para iniciar el generador de números aleatorios, y después uuid4_generate(), usando como parámetro una cadena C de UUID4_LEN caracteres.

    char uuid[UUID4_LEN];
    
    uuid4_init();
    uuid4_generate(uuid);

El mismo documento puede tener varios identificadores, por ejemplo, el dispositivo de lectura puede añadir sus propios identificadores para uso interno.

<dc:identifier id="BookId">urn:uuid:54f9d254-7234-40b6-98f5-06435b8dcbbf</dc:identifier>

Título title

Todo documento necesita un título. Pero la estructura dice que podemos añadir más, y efectivamente, se pueden añadir títulos alternativos. Por ejemplo:

<dc:title>Titulo del libro</dc:title>
<dc:title>Primera parte</dc:title>

También se pueden añadir subtítulos separando cada uno con comas:

<dc:title>Titulo del libro, Primera parte</dc:title>

Lenguaje languaje

La última etiqueta obligatoria es el lenguaje del documento. Se recomienda usar códigos definidos por el estándar ISO 639-2 o ISO 639-3.

<dc:language>es-ES</dc:language>

Creador creator

Entre las etiquetas opcionales, tal vez ésta sea la más frecuentemente usada. Generalmente se usa para indicar el autor del documento, aunque está destinada a indicar el responsable de la publicación, sea una persona, organización, etc.

Se puede añadir una etiqueta meta con la propiedad role para indicar con más precisión qué tipo de creador es.

<dc:creator id="creator">Nombre Apellido</dc:creator>
<meta refines="#creator" property="role" scheme="marc:relators" id="role">aut<:/meta>

También, opcionalmente, se puede añadir una etiqueta meta con el nombre normalizado, es decir, la cadena que se usará para ordenar. Los autores generalmente se ordenan por el apellido.

<meta refines="#creator" property="file-as">Apellido, Nombre</meta>

Alternativamente se puede usar la forma:

<dc:creator opf:file-as="Apellido, Nombre" opf:role="aut">Nombre Apellido</dc:creator>

Se pueden añadir más etiquetas creator si la publicación tiene más de un autor.

Colaborador contributor

Si se quiere añadir a más personas u organizaciones que han participado en el documento, aunque no como creadores, por ejemplo, el autor de la portada, o de algunas ilustraciones, o comentarios, etc, se puede usar la etiqueta contributor.

Por lo demás, esta etiqueta es similar a la de creator.

El Open Packaging Format (OPF) define varios posibles roles para las etiquetas de colaborador, http://idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.2.6.

Veamos algunos de ellos:

Autor [aut]Usado para una persona o entidad corporativa responsable del contenido intelectual o artístico de una obra. Se puede usar cuando más de una persona u organismo asume esa reponsabilidad.
Autor de introducción, etc. [aui]Usado para una persona o entidad responsable de una introducción, prefacio, prólogo u otro asunto crítico, pero que no es el autor principal.
Antecedente bibliográfico [ant]Usado para el autor responsable de una obra en la que se basa la obra representada se basa. Puede ser apropiado para adaptaciones, secuelas, continuaciones, índices, etc.
Productor de libro [bkp]Se utiliza para la persona o empresa responsable de la producción de libros y otros medios impresos, si no se quieren usar los códigos específicos ([bkd], [egr], [tyd], [prt]).
Colaborador [clb]Usado para una persona o empresa que participa de forma limitada en la elaboración de un trabajo de otro autor o que aporta complementos (por ejemplo, apéndices, notas).
Compilador [com]Se usa para una presona que produce una obra o publicación mediante la selección y reunión de material a partir de otras obras de varias presonas u organismos.
Diseñador [dsr]Se usa para una persona u organización responsable del diseño si no se quieren usar los códigos específicos ([bkd], [tyd]).
Editor [edt]Se usa para una persona que prepara una obra que no es principalmente suya para su publicación, aclarando un texto, añadiendo una introducción u otro asunto crítico, o dirigiendo técnicamente un equipo editorial.
Ilustrador [ill]Usado para la persona que concible, y talvez también implementa, un diseño o ilustración, que normalmente acompaña a un texto escrito.
Otro [oth]Se puede usar para códigos de relación que no tengan equivalente en la lista MARC o para términos que no tengan asignado un código.
Fotógrafo [pht]Usado para las personas u organizaciones responsables de hacer las fotografías, tanto si se usan en su forma original o como reproducciones.
Impresor [prt]Usado para la persona u organización que imprime los textos, ya sea de tipos o de placas.
Redactor [red]Usado para una persona que escribe o desarrolla un marco para un artículo sin ser el responsable intelectual del contenido.
Revisor [rev]Usado para una persona u organización responsable de la revisión del libro, cuadro, performance, etc.
Esponsor [spn]Se usa para la persona o agencia que emitió un contrato, o bajo cuyos auspicios se ha escrito, puntado, publicado, etc, una obra.
Asesor de tesis [ths]Usado para la persona bajo cuya supervisión un candidato de grado desarrolla y presenta una tesis, memoria o texto de una disertación.
Transcriptor [trc]Usado para una presona que prepara una copia manuscrita o escrita a máquina desde el material original, incluyendo material oral grabado o dictado.
Traductor [trl]Usado para una persona que traduce un texto de un lenguaje a otro, o desde un formato antiguo de un lengaje a uno moderno.

Por ejemplo de contribución de un traductor:

<dc:contributor opf:file-as="Apellido, Nombre" opf:role="trl">Nombre Apellido</dc:contributor>

Fecha date

Esta etiqueta se debe usar únicamente para indicar la fecha de publicación del documento, y se recomienda usar la norma ISO8601:

<dc:date>2021-07-25T11:20:00Z</dc:date>

Se pueden añadir modificadores opf para indicar otras fechas de interés, por ejemplo, creation, publication o modification.

<dc:date opf:event="creation">2000-09-09T17:30:00Z</dc:date>
<dc:date opf:event="publication">2021-07-20T19:15:00Z</dc:date>
<dc:date opf:event="modification">2021-07-26T19:02:00Z</dc:date>

Asunto subject

Se usa para indicar el asunto sobre el que trata el documento. En libros se suele indicar si es una novela, ensayo, etc, y la categoría: ciencia ficción, fantasía, policiaca, terror, etc.

Ejemplo:

<dc:subject>Educativo, Programación</dc:subject>

Tipo

Esta etiqueta se usa para indicar si el documento EPUB es de un tipo especializado.

Otras etiquetas

Existen otras etiquetas opcionales:

  • Cobertura coverage: Hace referencia a la aplicación del documento, ya sea un rango de tiempo, una situación geográfica o de juridiscción.
    <dc:coverage>C++98</dc:coverage>
    
  • Descripción description: Pequeña descripción del contenido, en novelas es el equivalente al texto que aparece en las solapas o en la contraportada. Un resumen del argumento, intentando evitar revelar la trama.
    <dc:description>El protagonista se ve envuelto en muchas aventuras, aplica su ingenio: sale mal.</dc:description>
    
  • Formato format: Se refiere al formato del documento, medio físico o dimensiones.
  • Editor publisher: Identifica al editor del documento.
    <dc:publisher>Con Clase</dc:publisher>
    
  • Relacción relation: Un recurso relacionado. Se puede usar una URL.
    <dc:relation>http://conclase.net</dc:relation>
    
  • Derechos rights: Información sobre los derechos sobre el documento.
  • Fuente source: Un recurso relacionado del que se deriva el documento actual.

Meta

Las etiquetas meta proporcionan una forma genérica para incluir metadatos.

Uso
Como hijo del elemento metadata. Repetible.

Atributos
dir [opcional]
id [opcional]
property [requerido]
refines [opcional]
scheme [opcional]
xml:lang [opcional]
Modelo de Contenido
Texto

Aquí hay infinidad de opciones que se escapan del objetivo de este artículo. Puedes ver todas ellas en la documentación de w3.

Generalmente se usan para definir valores, tendrán un contenido content y un nombre name. Veamos algunos de los ejemplos de uso más frecuente:

<meta content="cover.jpg" name="cover" />

El uso más frecuente el por programas de lectura o edición de documentos epub, que añaden variables internas que ayudan a clasificar, ordenar, etc.

Sección de manifiesto

En esta sección se consignan cada uno de los contenidos del documento. Cuando se trata de libros, estos suelen ser ficheros de texto, en formato xhtml, imágenes, en formato jpg, png, gif, etc, hojas de estilo en formato css. Por compatibilidad con versiones anteriores de epub se suele añadir un fichero de índice, "toc.ncx".

Ficheros de texto

El formato es xhtml, es decir HTML compatible con XML. Se suele añadir un fichero separado para cada capítulo, aunque la división es arbitraria. Estos ficheros se almacenarán en la carpeta "OEBPS/Text".

El formato general es:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Capítulo n</title>
  <link href="../Styles/style.css" rel="stylesheet" type="text/css" />
</head>

<body>
  <h1>Capítulo n</h1>
   Texto en formato HTML
</body>
</html>

Se pueden añadir varias hojas de estilos, si es necesario.

La versión 3 del formato epub admite HTML 5.

Por cada fichero de texto se debe incluir una línea en el manifiesto con el siguiente formato:

<item id="capitulo<i>n</i>" href="Text/capitulo<i>n</i>.xhtml" media-type="application/xhtml+xml"/>

id es el identificador del recurso, que se puede usar en otras secciones para referirse a él. href se refiere a la ubicación física del recurso. media-type es el tipo de aplicación con el que se puede leer o editar el recurso.

Imágenes

Todas las imágenes del documento deben aparecer en el manifiesto. Generalmente también aparecerán en el texto, como una etiqueta img. Estos ficheros se almacenarán en la carpeta "OEBPS/Images".

<item id="cover.jpg" href="Images/cover.jpg" media-type="image/jpeg"/>

Hojas de estilo

Del mismo modo, las hojas de estilo que se usen en el documento también deben aparecer en el manifiesto. Estos ficheros se almacenarán en la carpeta "OEBPS/Styles".

<item id="style.css" href="Styles/style.css" media-type="text/css"/>

Fuentes

Se pueden añadir fuentes de caracteres. Para ello deben aparecer en el manifiesto, y también en algún fichero de hoja de estilos. Si se añaden fuentes adicionales se deben almacenar en la carpeta "OEBPS/Fonts". Epub sólo admite fuentes OTF.

<item id="fuente.otf" href="Fonts/fuente.otf" media-type="font/otf"/>

En la hoja de estilos se debe declarar la fuente, y usarla en las etiquetas o clases que sea necesario:

@font-face {
font-family: "fuente.otf";
font-weight: normal;
font-style: normal;
src: url("../Fonts/fuente.otf");
}
...
p {
    margin: 0;
    text-align: justify;
    text-indent: 1.5em;
    font-family: "fuente.otf", serif;
}

Tabla de contenido toc

Independientemente de que el documento contenga una fichero con una tabla de contenido en formato xhtml, también suele existir un fichero especial con la extensión "ncx" (Navigation Center eXtended). Se trata de un fichero xml con un formato específico que los dispositivos de lectura pueden usar para mejorar la accesibilidad. Se almacena en la carpeta raíz.

Aunque en la versión 3 de epub no es necesario, no es mala idea añadirlo por compatibilidad con dispositivos de lectura que no soporten epub 3.

<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>

Contiene una cabecera y una estructura en árbol con los contenidos del documento.

<?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:caca9c5c-3779-4cdb-9a76-23624ba586fd" />
    <meta name="dtb:depth" content="2" />
    <meta name="dtb:totalPageCount" content="0" />
    <meta name="dtb:maxPageNumber" content="0" />
  </head>
  <docTitle>
    <text>Curso de C++</text>
  </docTitle>
  <navMap>
  <navPoint id="navPoint1">
    <navLabel>
      <text>Cubierta</text>
    </navLabel>
    <content src="Text/cubierta.xhtml" />
  </navPoint>
  <navPoint id="navPoint2">
    <navLabel>
      <text>Introducción</text>
    </navLabel>
    <content src="Text/cap0.xhtml" />
    <navPoint id="navPoint3">
      <navLabel>
        <text>Proceso para la obtención de un programa ejecutable</text>
      </navLabel>
      <content src="Text/cap0.xhtml#I_proceso" />
      <navPoint id="navPoint4">
        <navLabel>
          <text>Fichero fuente y programa o código fuente</text>
        </navLabel>
        <content src="Text/cap0.xhtml#I_C_fuente" />
      </navPoint>
      <navPoint id="navPoint5">
        <navLabel>
          <text>Interpretes y compiladores</text>
        </navLabel>
        <content src="Text/cap0.xhtml#I_C_compinter" />
      </navPoint>
      <navPoint id="navPoint6">
        <navLabel>
          <text>Ficheros objeto, código objeto y compiladores</text>
        </navLabel>
        <content src="Text/cap0.xhtml#I_C_objeto" />
      </navPoint>
      <navPoint id="navPoint7">
        <navLabel>
          <text>Librerías o bibliotecas</text>
        </navLabel>
        <content src="Text/cap0.xhtml#I_C_biblioteca" />
      </navPoint>
      <navPoint id="navPoint8">
        <navLabel>
          <text>Ficheros ejecutables y enlazadores</text>
        </navLabel>
        <content src="Text/cap0.xhtml#I_C_ejecutable" />
      </navPoint>
      <navPoint id="navPoint9">
        <navLabel>
          <text>Errores</text>
        </navLabel>
        <content src="Text/cap0.xhtml#I_C_errores" />
      </navPoint>
    </navPoint>
    <navPoint id="navPoint10">
      <navLabel>
        <text>Propósito de C y C++</text>
      </navLabel>
      <content src="Text/cap0.xhtml#I_proposito" />
    </navPoint>
  </navPoint>
  </navMap>
</ncx>

En cada navpoint se puede indicar un valor playOrder opcionalmente, pero no es imprescindible incluirlo.

<navPoint id="navPoint1" playOrder="1">

Cada navpoint se corresponde un una etiqueta hn del texto, y dependiendo del valor de n los navpoint se anidan de forma recursiva.

Por ejemplo, el navpoint con id navPoint-2 se corresponde con una etiqueta h1, con texto "Introducción", en el documento "Text/cap0.xhtml". El que tiene id navPoint-3 se corresponde con un h2, con texto "Proceso para la obtención...", en el mismo documento, pero con un id "I_proceso":

<!-- cap0.xhtml -->
<h1 id="inicio">Introducción</h1>
<!-- texto -->
<h2 id="I_proceso">Proceso para la obtención de un programa ejecutable</h2>
<!-- texto -->
<h3 id="I_C_fuente">Fichero fuente y programa o código fuente</h3>
<!-- texto -->
<h3 id="I_C_compinter">Interpretes y compiladores</h3>
...

Sección de columna vertebral spine

En ésta sección se define el orden en que se mostrarán los contenidos del documento en el dispositivo que se use para la lectura.

Cada línea corresponde a uno de los contenidos declarado en el manifiesto que deba mostrarse al lector. El orden es importante, porque será el mismo en el que se iran mostrando al lector. Dentro de cada item se podrá navegar usando las teclas de avance y retroceso de página, y se podrá navegar por los items usando el avance y retroceso de capítulo.

<spine toc="ncx">
    <itemref idef="capitulo1"/>
    <itemref idef="capitulo2"/>
    <itemref idef="capitulo3"/>
    <itemref idef="capitulon"/>
</spine>

Opcionalmente se puede añadir la propiedad linear con los valores "yes" (por defecto) o "no". Los items con la propiedad linear="no" no se mostrarán al lector en la navegación normal, pero se podrán visualizar si se accede a través de un enlace. Se usan, por ejemplo, para notas al pié de página, o para las respuestas en libros con ejercicios.

<itemref idef="capitulo1"/>
<itemref idef="capitulo2"/>
<itemref idef="notas2" linear="no"/>
<itemref idef="capitulo3"/>
<itemref idef="capitulon"/>

El resto de contenidos consignados en el manifiesto, como imágenes u hojas de estilo, no se incluyen en ésta sección.

Sección de guía guide

Esta sección también se mantiene por compatibiliad con la versión 2 de epub.

Aquí se incluye al menos una referencia a estructuras fundamentales del documento, como tablas de contenido, listas de ilustraciones, referencias bibliográficas, etc. De modo que sean accesibles para el dispositivo de lectura.

Los posibles valores para tipo son:

coverCubierta: cubierta del libro, información de solapas, etc.
title-pagePágina de título: página con el título y posiblemente autor, editor y otros datos.
tocTabla de contenidos.
indexÍndice: normalmente al final del libro.
glossaryGlosario
acknowledgementsReconocimientos.
bibliographyBibliografía
colophonColofón.
copyright-pagePágina de información de derechos de copia.
dedicationDedicatoria.
epigraphEpígrafe.
forewordTrabajos anteriores.
loiLista de ilustraciones.
lotLista de tablas.
notesNotas.
prefacePrefacio.
textPrimera página con texto "real" (por ejemplo "Capítulo 1").

Por ejemplo:

<guide>
    <reference type="cover" title="Portada" href="Text/cover.xhtml"/>
    <reference type="toc" title="Índice de contenido" href="Text/nav.xhtml"/>
    <reference type="toi" title="Lista de ilustraciones" href="Text/ilustraciones.xhtml"/>
</guide>

Programas

Existen programas para gestionar, crear, modificar o cambiar el formato de ebooks. Veamos un par de ellos.

Calibre

Esta aplicación Calibre nos permite gestionar una colección de libros, transferirlos a nuestro dispositivo de lectura, modificarlos, hacer conversiones de formato, etc. Es gratuita, y se financia a través de donaciones.

Sigil

Sigil nos proporciona dos aplicaciones útiles, un editor epub, que nos permite crear documentos epub desde cero, y un editor xhtml. Al igual que Calibre, es gratuita y se financia por donaciones.

Bibliografía

Dublin CoreTM Metadata Initiative dublincore.org

EDR Lab, Anatomy of an EPUB 3 file www.edrlab.org

W3c EPUB Packages 3.2 www.w3.org

Idpf, Open Packaging Format (OPF) 2.0.1 v1.0.1 idpf.org