Le blog de Lizzie Crowdagger

Ici, je discute écriture et auto-édition, fanzines et livres numériques, fantasy et fantastique, féminisme et luttes LGBT ; et puis de mes livres aussi quand même pas mal
Home

Aller au menu | Aller à la recherche

Comprendre le format EPUB

, 17:54 - Lien permanent

Articles précédents dans la série :

  1. L’auto-édition, pourquoi ?
  2. Typographie, composition et mise en page

Aujourd’hui, je vais parler un peu du format EPUB, utilisé pour le livre numérique. J’essaierai de ne pas trop rentrer dans les détails techniques, mais suffisamment tout de même pour que vous puissiez envisager de créer ou modifier un EPUB à la main.

Le format EPUB, c’est quoi ?

Bon, on ne va pas faire un historique, mais en bref, le format EPUB veut dire « Electronic Publication » et est utilisé pour le livre électronique (ou ebook). C’est, en gros, un moyen pour mettre ensemble différents fichiers HTML et les ressources dont ils ont besoin (feuilles de style, images, polices, …). Le format EPUB est très différent du PDF : dans ce dernier, on a une mise en page fixe, on connaît les dimensions de la page, la taille de la police, etc. Pour l’EPUB, la taille de la page dépendra de l’appareil utilisé (ordinateur, liseuse, smartphone), la police pourra être agrandie ou diminuée en fonction des besoins du lecteur ou de la lectrice, etc., donc la mise en page et la composition du texte doivent s’adapter. (En théorie, les évolutions du format permettent un fixed layout, donc une mise en page fixe, mais outre que je doute que ce soit très bien supporté à l’heure actuelle, c’est probablement une très mauvaise idée pour un roman.)

L’EPUB est un format ouvert, standardisé, développé par l’IDPF, qui est un consortium d’organisations. Bon, tout ça on s’en fout un peu, mais tout ça pour dire que si vous voulez voir les références complètes de ce format c’est vers le site de l’IDPF qu’il faut se tourner.

Il y a, à l’heure actuelle, trois versions de ce format :

  • EPUB 2.0 qui est toujours utilisé mais commence à dater un peu ;
  • EPUB 3.0 qui est plus récent et commence à être à peu près supporté par les différentes liseuses  ;
  • EPUB 3.1 qui vient tout juste de sortir en janvier 2017.

Je ne vais pas lister ici les différences entre ces versions, j’en parlerai un peu sur des points spécifiques. À l’heure actuelle, j’aurais tendance à utiliser EPUB 3.0 en faisant attention à faire en sorte que ce soit à peu près compatible pour des liseuses qui ne supportent que l’EPUB 2.0. Pour ce qui est de la version 3.1, j’attendrai un moment avant de m’en servir, d’autant plus que certains éléments de compatibilité avec EPUB2 ne sont plus acceptés.

Quelques outils pour créer ou manipuler un EPUB

L’objectif de cet article n’est pas de parler des outils qui peuvent être utilisés pour créer ou manipuler ce format, mais de voir à quoi il ressemble. Cela dit, citons quand même les logiciels libres suivant :

  • Calibre, qui en plus de vous permettre de gérer votre bibliothèque, peut faire un certain nombre de conversions à votre place (par exemple transformer un fichier MOBI en EPUB, ou vice-versa).
  • Sigil, un éditeur de fichiers EPUB que je dois admettre n’avoir jamais vraiment testé mais dont j’ai entendu dire du bien.
  • Pour ce qui est de créer un fichier EPUB à partir d’autres formats, il y a le plugin Writer2Epub pour LibreOffice. Si vous préférez écrire au format Markdown, pandoc exporte vers EPUB (et plein d’autres formats) ; et dans le même domaine, je ne peux évidemment pas ne pas faire de pub pour Crowbook.
  • Pour ce qui est de la lecture, il y a un plugin EpubReader pour Firefox.
  • Enfin, last but not least, epubckheck permet de vérifier qu’un fichier EPUB est correct. Il y a également une version en ligne si vous voulez tester ponctuellement un fichier sans rien avoir à installer.

Mais peu importe le logiciel que vous utilisez pour éditer ou créer votre fichier EPUB, regardons à quoi il ressemble.

En réalité, un fichier Zip

Très concrètement, un fichier EPUB est en réalité un fichier Zip qui contient un certain nombre d’autres fichiers.

Il y a quand même une petite subtilité : pour que le fichier soit bien reconnu comme un fichier EPUB, il doit contenir un fichier intitulé mimetype contenant le texte suivant, sans retour à la ligne à la fin: « application/epub+zip ».

Ce fichier doit être le premier de l’archive et ne doit pas être compressé. Concrètement, si vous voulez créer un fichier epub à la main en utilisant la commande zip, il faudra procéder en deux étapes (du moins, si vous voulez que les autres fichiers du livre soient compressés):

zip -X0 livre.epub mimetype
zip -9 livre.epub [reste des fichiers]

(L’option X dit de ne pas sauver les attributs de fichiers « extra » (comme à qui appartient le fichier sous Unix); 0 dit de ne pas compresser le fichier mimetype, et 9 de compresser au maximum le reste. Il y a beaucoup d’autres options que vous pouvez passer à la commande zip, mais ces deux-là devraient marcher pour générer un EPUB valide.)

En général, vous ne créerez pas un EPUB à partir de rien et juste en ligne de commande, mais si vous êtes amené·e à le faire autant connaître ce détail (je n’y avais pas prêté attention et j’ai mis du temps à comprendre ce qui clochait dans mes fichiers).

Une listes de fichiers XHTML

Le principal contenu du livre est une liste de fichiers XHTML, un par chapitre, ou par section, ou comme vous voulez. Bref, il n’y a pas grand chose à dire là-dessus, c’est du XHTML, si vous connaissez le HTML, vous ne serez pas dépaysé·e.

On notera tout de même que l’EPUB 3.0 permet d’utiliser le format XHTML5 alors que la version 2.0 ne supportait que XHTML 1.1. Il y a aussi un peu plus d’indications sémantique avec la version 3.0, notamment avec l’attribut epub:type, qui permet notamment sur certaines liseuses de comprendre qu’une note de bas de page est une note de bas et de l’afficher de manière plus adaptée. Si vous êtes plutôt auteur ou autrice d’articles scientifiques que de romans (ou que vous écrivez des romans avec des formules mathématiques), vous serez également heureu·x·se d’apprendre que MathML est supporté dans EPUB 3.

Exemple de fichier XHTML pour EPUB2:

<?xml version="1.0" encoding="UTF-8"?>
<!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" xml:lang="fr" lang="fr">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <title>Exemple</title>
    <link rel="stylesheet" type="text/css" href="stylesheet.css" />
  </head>
  <body xml:lang="fr" lang="fr">
    <div id = "page">
      <h1>Exemple</h1>
      <p>Bla bla bla.</p>
    </div>
  </body>
</html>

Et pour EPUB 3.0:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:epub="http://www.idpf.org/2007/ops" xml:lang = "fr" lang="fr">
  <head>
    <meta charset = "utf-8" />
    <link rel="stylesheet" type="text/css" href="stylesheet.css" />
  </head>
  <body xml:lang="fr" lang="fr">
    <section>
      <h1>Exemple</h1>
      <p>Bla bla bla.</p>
    </section>
  </body>
</html>

Remarque : vous noterez ici qu’il y a pas mal de redondance pour spécifier la langue. Ce n’est peut-être pas strictement nécessaire, mais ça ne fait pas de mal et ça permet d’être à peu près sûr que la liseuse ait bien compris. C’est assez important car sans cette information les césures ne seront pas faites au bon endroit.

Pour mettre en page ce contenu XHTML, vous utiliserez en général une feuille de style CSS. Là encore, EPUB 3.0 supporte une version de CSS plus récente, avec plus de possibilités de style, qui seront supportées, ou pas, par votre liseuse.

Des ressources supplémentaires

En plus des fichiers XHTML pour le contenu et des feuilles de style CSS, vous aurez peut-être envie d’inclure du contenu additionnel, comme des images, des fontes, etc. La version 3.0 d’EPUB supporte aussi des vidéos et de l’audio et des scripts. parce que pourquoi pas ?

Content.opf, un fichier pour tous les lier

Jusque là, vous avez quelque chose qui est à peu près équivalent à ce que vous auriez si vous faisiez un site web, avec chaque page correspondant à un morceau (chapitre, section, etc., selon comment vous avez découpé) de votre livre.

Pour mettre tout ça ensemble, EPUB vous demande également de fournir un package document, sous la forme d’un fichier content.opf (en fait, vous pouvez le nommer différemment si vous le voulez). Il s’agit d’un fichier XML, qui commence par une déclaration XML:

<?xml version="1.0" encoding="UTF-8"?>
<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="epub-id-1">

(L’attribut version permet de spécifier le numéro de version EPUB (ici 2.0) ; unique-identifier doit correspondre à un identifiant défini dans l’élément metadata.)

Il contient ensuite quatre éléments principaux :

Metadata

L’élément metadata vous permet de renseigner des métadonnées, comme le titre, l’auteur, un « numéro d’identification » unique obligatoire (stressez pas, pas besoin de s’enregistrer, juste de générer une séquence de nombre aléatoires, mais vous pouvez mettre un numéro ISBN si vous en avez), etc.

Exemple (EPUB 2.0):

 <metadata xmlns:dc="http://purl.org/dc/elements/1.1/"
           xmlns:opf="http://www.idpf.org/2007/opf">
    <dc:identifier id="epub-id-1">urn:uuid:c3566ee1-8325-4489-b7df-aeade549b97e</dc:identifier>
    <dc:title>Exemple</dc:title>
    <dc:date>2017-01-29T19:44:59Z</dc:date>
    <dc:language>fr</dc:language>
    <dc:creator opf:role="aut">Lizzie Crowdagger</dc:creator>
    <meta name = "cover" content = "images/image_0.jpg" />
</metadata>

Avec la version 3.0, la déclaration de l’auteur se fera de manière légèrement différente :

    <dc:creator id="epub-creator-1">Lizzie Crowdagger</dc:creator>
    <meta refines="#epub-creator-1" property="role"
          scheme="marc:relators">aut</meta>

Manifest

Élément indispensable, manifest sert à lister tous les fichiers qui sont contenus dans votre archive zip. Si vous avez un fichier dans votre zip, il doit être répertorié là. Les esprit chafouins pourront trouver ça légèrement redondant, puisqu’on aurait tout aussi bien pu de se contenter de regarder ce qu’il y avait comme fichiers dans cette archive, mais c’est comme ça. (Cela dit, en plus du nom du fichier, il faut préciser dans l’élément manifest de quel type de fichier il s’agit, donc il y a quand même une légère information en plus, même si on peut argüer qu’elle pourrait être inférée d’une autre manière.)

Exemple:

<manifest>
    <item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml" />
    <item id="nav" href="nav.xhtml" media-type="application/xhtml+xml" />
    <item media-type = "application/xhtml+xml"  id = "cover_xhtml" href = "cover.xhtml" />
    <item media-type = "application/xhtml+xml"  id = "title_page_xhtml" href = "title_page.xhtml" />
    <item media-type = "application/xhtml+xml"  id = "chapter_000_xhtml" href = "chapter_000.xhtml" />
    <item media-type = "text/css"  id = "stylesheet_css" href = "stylesheet.css" />
    <item media-type = "image/jpeg"  id = "cover-image" href = "images/image_0.jpg" />
</manifest>

Spine

L’élément spine est un peu le cœur de ce fichier, puisque qu’il indique l’ordre de lecture de vos différents fichiers XHTML. Seuls les fichiers (plus exactement, leurs identifiants tels que définis dans l’élément manifest) qui sont listés dans cet élément seront affichés de manière « linéaire » par la liseuse, ce qui peut être utile pour des fichiers « annexes » qui pourront être lus si le lecteur ou la lectrice suit un lien interne dans le livre mais qui ne seront pas affichés juste en tournant les pages.

Exemple :

<spine toc="ncx">
    <itemref idref = "cover_xhtml" />
    <itemref idref = "title_page_xhtml" />
    <itemref idref = "chapter_000_xhtml" />
</spine>

Guide

L’élément guide permet de lister un certain nombres de fichiers ressources et de dire à quoi elles correspondent. Par exemple, vous pourrez indiquer ici une table des matières, quelle est la page de titre, ou encore où commence vraiment le livre (après la couverture, la page de titre, l’éventuel page de copyright, etc.). Cet élément sert donc à faciliter la navigation.

Cet élément est obsolète dans EPUB 3.0, et est remplacé par l’élément landmarks dans le fichier nav.xhtml ; cela dit, je recommande de l’insérer quand même pour les liseuses qui l’utilisent encore.

Exemple :

<guide>
    <reference type = "cover" title = "Couverture" href = "cover.xhtml" />
    <reference type = "title-page" title = "Titre" href = "title_page.xhtml" />
    <reference type = "text" title = "Exemple" href = "chapter_000.xhtml" />
</guide>

 Un fichier container.xml

Dernier élément indispensable, le fichier container.xml, obligatoirement situé dans un répertoire META-INF. La seule utilité de ce fichier est de pointer vers votre fichier content.opf (ou coincoin.opf si vous l’avez nommé différemment). Là encore, on pourrait trouver ça un peu redondant (quitte à spécifier un fichier avec un nom précis, ça aurait aussi bien pu être directement le fichier package) mais c’est comme ça.

Exemple de fichier container.xml:

<?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>

Une (des) table(s) des matières

Enfin, même si je ne suis pas sûre que ce soit obligatoire, il faut mettre une table des matières. Celle-ci aura un format différent avec la version 2.0 (où il s’agira d’un fichier « NCX ») et la version 3.0 (où là il s’agit d’un fichier XHTML plus classique) d’EPUB.

Le format NCX

Là encore, même si vous faites un fichier EPUB 3.0, il est préférable d’ajouter tout de même un fichier toc.ncx pour les liseuses qui continuent à ne lire que celui-ci.

Grosso modo, dans les deux cas il s’agit d’une liste de vos chapitres/sections/etc avec les liens qui vont bien vers les fichiers de contenu (ou des liens internes à ces fichiers). Cela dit, le format NCX est un peu plus imbitable et peut contenir également des indications de numéro de page et tout un tas de trucs dont en pratique vous ne vous servirez probablement jamais.

Exemple de fichier NCX (EPUB 2.0, mais c’est mieux de l’inclure aussi si c’est un EPUB 3.0) :

<?xml version="1.0" encoding="UTF-8"?>
<ncx version="2005-1" xmlns="http://www.daisy.org/z3986/2005/ncx/">
  <head>
    <meta name="dtb:depth" content="1" />
    <meta name="dtb:totalPageCount" content="0" />
    <meta name="dtb:maxPageNumber" content="0" />
  </head>
  <docTitle>
    <text>Table des matières</text>
  </docTitle>
  
  <navMap>
    <navPoint id = "navPoint-1">
      <navLabel>
	<text>Couverture</text>
      </navLabel>
      <content src = "cover.xhtml" />
    </navPoint>
    <navPoint id = "navPoint-2">
      <navLabel>
	<text>Titre</text>
      </navLabel>
      <content src = "title_page.xhtml" />
    </navPoint>
    <navPoint id = "navPoint-3">
      <navLabel>
	<text>Exemple</text>
      </navLabel>
      <content src = "chapter_000.xhtml" />
    </navPoint>
  </navMap>
</ncx>

XHTML

Le format XHTML est un peu plus facile d’accès si vous connaissez un peu le HTML, puisqu’il s’agit juste d’une liste, éventuellement imbriquée, insérée dans un élément nav. On notera qu’il est possible d’insérer plusieurs éléments nav dans le même fichier ; c’est notamment utile pour utiliser l’attribut landmarks, qui est à peu près équivalent à l’élément guide dans EPUB 2.0.

Exemple de fichier nav.xhtml (EPUB 3.0) :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
<head>
  <meta charset = "utf-8" />
  <meta name="generator" content="crowbook" />
  <title>Table des matières</title>
  <link rel="stylesheet" type="text/css" href="stylesheet.css" />
</head>

<body>
  <nav epub:type = "toc" id="toc">
    <h1 id="toc-title">Table des matières</h1>
    <ol>
      <li><a href = "cover.xhtml">Couverture</a></li>
      <li><a href = "title_page.xhtml">Titre</a></li>
      <li><a href = "chapter_000.xhtml">Exemple</a></li>
    </ol>
  </nav>
  
  <nav epub:type = "landmarks">
    <ol>
      <li><a epub:type="cover" href = "cover.xhtml">Couverture</a></li>
      <li><a epub:type="titlepage" href = "title_page.xhtml">Titre</a></li>
      <li><a epub:type="bodymatter" href = "chapter_000.xhtml">Exemple</a></li>
    </ol>
  </nav>
</body>
</html>

Organisation des fichiers

Mis à part le fichier container.xml, qui doit obligatoirement se trouver dans un répertoire nommé META-INF, et le fichier mimetype qui doit se trouver à la racine, il n’y a pas de règles sur l’organisation des fichiers à l’intérieur de votre Zip : vous pouvez tout mettre à la racine si ça vous chante, ou au contraire faire 15 répertoires. En pratique, l’usage est de mettre le contenu dans un répertoire nommé OEBPS. Pourquoi ? Aucune idée, mais bon, tout le monde le fait, alors je le fais aussi.

Avis personnel sur ce format

Personne ne m’a demandé ce que je pensais de ce format, et personne n’en a probablement grand chose à faire, mais je vais tout de même donner mon avis sur le format EPUB.

Grosso-modo, je trouve qu’il s’agit d’un format qui fonctionne à peu près, même s’il me semble qu’il y a quand même pas mal de boilerplate qui aurait pu être évité.

Le problème principal du format EPUB, c’est son support aléatoire selon les liseuses et logiciels de lecture : tel élément ne sera pas pris en compte par tel logiciel, tel liseuse aura tendance à rajouter des règles CSS qui vont vous niquer votre mise en page, etc.

J’avoue que je suis un peu dubitative sur l’évolution de ce format : si, globalement, je trouve la version 3.0 d’EPUB plus agréable à écrire et modifier que la version 2.0 (du moins, elle le serait s’il n’y avait pas de problème de compatibilité à prendre en compte), je suis un peu sceptique sur le fait d’inclure du support audio, vidéo, script, et blabla sur le « livre enchi ». Pour moi, l’intérêt de l’EPUB c’est pour le livre numérique, et je trouve que ce serait déjà bien si les fonctionnalités pour afficher correctement un livre étaient supportées correctement par l’essentiel des liseuses. (Pour moi, ça inclut une composition correcte et de pas se planquer derrière l’argument du « oui mais ça doit être fait à la volée alors c’est bien normal qu’on fasse de la merde. »)

Pour l’instant, ce n’est pas le cas, et j’aimerais bien, à titre personnel, que les développeurs des logiciels qui permettent d’afficher des livres sur ma liseuse se concentrent sur ces fonctionnalités plutôt que sur implémenter des choses qui me paraissent un peu plus gadget, ou en tout cas que ce n’est pas à un format conçu pour les livres numériques de les gérer.


Si vous aimez ce que j’écris, vous pouvez me soutenir en vous abonnant (à partir d’1€ par mois) sur Tipeee, et vous recevrez en contrepartie accès à des textes inédits.

Abonnez-vous sur : tipeee

Pour être tenu·e au courant de mes dernières parutions, vous pouvez vous inscrire à ma liste de diffusion (faible trafic, pas plus d’un message par mois) :

Billets connexes

9459 lectures

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet