Extraire la couver­ture d’un fichier ePub


Les ePubs ont déjà pas mal d’his­to­rique et d’im­plé­men­ta­tions diver­gentes. Je fouillais ces jours ci les diffé­rentes méthodes pour trou­ver l’image de couver­ture. J’ai proba­ble­ment du louper des choses, mais ça servira proba­ble­ment à d’autres.

Avant toute chose, il faut ouvrir l’ePub à l’aide de unzip

unzip exemple.epub

Puis repé­rer l’adresse de l’OPF dans le fichier META-INF/container.xml. Atten­tion à ne pas recher­cher manuel­le­ment un fichier content.opf à la racine de l’ePub. Si c’est souvent là qu’il se trouve, ce n’est pas toujours le cas.

L’adresse de l’OPF est dans l’at­tri­but @full-path de la balise <rootfile> avec le media-type « appli­ca­tion/oebps-packa­ge+xml ». S’il existe plusieurs corres­pon­dances, c’est la première qui doit être utili­sée.

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

C’est dans ce fichier OPF que tout va se passer. Voici mes quatre méthodes pour trou­ver les couver­tures, à essayer par ordre de prio­rité :

1– Recher­cher une balise <meta> avec pour nom « cover ». Si elle existe, son contenu réfé­rence la balise <item> qui contient la couver­ture.

En XPath, le chemin de la couver­ture donne­rait quelque chose comme //item[id=//meta[name='cover']/@content]/@href

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
<metadata xmlns:opf="http://www.idpf.org/2007/opf">
  <meta name="cover" content="img1"/>
</metadata>
<manifest>
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
<item id="style" href="style.css" media-type="text/css"/>
<item id="id1" href="1.html" media-type="application/xhtml+xml"/>
<item id="id2" href="2.html" media-type="application/xhtml+xml"/>
<!-- ... -->
<item id="id13" href="13.html" media-type="application/xhtml+xml"/>
<item id="img1" href="images/img1.jpg" media-type="image/jpeg"/>
<item id="img2" href="images/img2.jpg" media-type="image/jpeg"/>
</manifest>
</package>

2– Recher­cher, dans la liste des <item> celui qui a « cover-image » dans son attri­but @properties. Il faut regar­der l’en­semble de l’at­tri­but. Ce dernier peut conte­nir plusieurs valeurs sépa­rées par des espaces.

En XPath ce serait quelque chose de proche de //item[@properties and contains(@properties,'cover-image')]/@href

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
<metadata xmlns:opf="http://www.idpf.org/2007/opf"></metadata>
<manifest>
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
<item id="style" href="style.css" media-type="text/css"/>
<item id="id1" href="1.html" media-type="application/xhtml+xml"/>
<item id="id2" href="2.html" media-type="application/xhtml+xml"/>
<!-- ... -->
<item id="id13" href="13.html" media-type="application/xhtml+xml"/>
<item properties="cover-image" id="img1" href="images/img1.jpg" media-type="image/jpeg"/>
</manifest>
</package>

3– Recher­cher, dans la liste des <reference> du <guide>, la première avec « cover » comme attri­but @type. Le fichier réfé­rencé pourra être un fichier XHTML. Dans ce cas je consi­dère comme couver­ture la première <img> de taille égale ou supé­rieure à 200×200 pixels (oui, c’est moche, mais je n’ai pas trouvé mieux).

En XPath ce serait quelque chose de proche de //reference[@type='cover']/@href en n’ou­bliant pas ensuite qu’on obtient un fichier XHTML et non une image.

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
<metadata xmlns:opf="http://www.idpf.org/2007/opf"></metadata>
<manifest>
<item id="ncx" href="toc.ncx" media-type="application/x-dtbncx+xml"/>
<item id="style" href="style.css" media-type="text/css"/>
<item id="id1" href="1.html" media-type="application/xhtml+xml"/>
<!-- ... -->
<item id="id13" href="13.html" media-type="application/xhtml+xml"/>
</manifest>
<guide>
<reference type="cover" title="Cover image" href="1.html"/>
</guide>
</package>

4– Enfin, à défaut de mieux, je descend les trois premiers <item> du <manifest> jusqu’à trou­ver une <img> de taille égale ou supé­rieure à 200×200 pixels (oui, c’est encore plus moche que précé­dem­ment, je sais)

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">
<metadata xmlns:opf="http://www.idpf.org/2007/opf"></metadata>
<manifest>
<item media-type="application/x-dtbncx+xml"id="ncx" href="toc.ncx" />
<item media-type="text/css" id="style" href="style.css" />
<item media-type="application/xhtml+xml" id="id1" href="1.html" />
<item media-type="application/xhtml+xml" id="id2" href="2.html" />
<item media-type="application/xhtml+xml" id="id3" href="3.html" />
<item media-type="application/xhtml+xml" id="id4" href="4.html" />
<!-- ... -->
<item id="id13" href="13.html" media-type="application/xhtml+xml"/>
</manifest>
</package>

Malgré cela, certains livres n’ont pas de couver­ture, et d’autres auront une couver­ture SVG qui ne sera pas récu­pé­rable, même si c’est rare. Si vous voulez complé­ter ou préci­ser, n’hé­si­tez pas.


3 réponses à “Extraire la couver­ture d’un fichier ePub”

  1. En attendant l’epub3 c’est malheureusement les seuls méthodes.
    Pour la dernière méthode je me suis contenté de considéré que la couverture était le premier html.

    En tout cas une implémentation ruby que j’ai fait pas très documenté pour le moment mais courte est ici https://github.com/banux/ruby-epub si ça peut aider.

  2. N’y-a-t-il pas plus simple pour les novices ?
    1. renommer le fichier epub en ajoutant .zip à la fin
    2. ouvrir le zip (double click ou développer le répertoire qui le contient dans l’explorateur Windows, lequel affiche normalement le contenu des archives zip)
    3. rechercher un fichier avec une extension image (.jpg a priori), normalement il n’y en a pas 36 et c’est la couverture
    4. l’ouvrir pour voir ce que c’est
    Ne pas oublier d’enlever ensuite le .zip pour retrouver un fichier en .epub

    • Oh bien sûr. Mais je cherchais des traitements automatisés pour des développeurs, pas une procédure pour un ebook unique pour un lecteur final

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.