Экстракт TOC файла epub

В последнее время я ударил команду, которая будет печатать TOC файла pdf .

mutool show file.pdf outline

Я хотел бы использовать команду для формата epub с аналогичной простотой использования и хорошим результатом, как указано выше для формата pdf .

Есть что-то в этом роде?

2 Solutions collect form web for “Экстракт TOC файла epub”

.epub файлы .zip содержащие XHTML и CSS, а также некоторые другие файлы (включая изображения, различные файлы метаданных и, возможно, XML-файл с именем toc.ncx содержащий оглавление).

Следующий скрипт использует unzip -p для извлечения toc.ncx в stdout, toc.ncx его через команду xml2 , а затем sed извлекает только текст каждого заголовка раздела.

Он принимает одно или несколько аргументов имени файла в командной строке.

 #! /bin/sh # This script needs InfoZIP's unzip program # and the xml2 tool from http://ofb.net/~egnor/xml2/ # and sed, of course. for f in "$@" ; do echo "$f:" unzip -p "$f" toc.ncx | xml2 | sed -n -e 's:^/ncx/navMap/navPoint/navLabel/text=: :p' echo done 

Он выводит имя файла epub, за которым следует a : затем отступы заголовка каждой главы двумя пробелами в следующих строках. Например:

 book.epub: Chapter One Chapter Two Chapter Three Chapter Four Chapter Five book2.epub: Chapter One Chapter Two Chapter Three Chapter Four Chapter Five 

Если epub-файл не содержит toc.ncx , вы увидите такой вывод для этой конкретной книги:

 book3.epub: caution: filename not matched: toc.ncx error: Extra content at the end of the document 

Первая строка ошибки – от unzip , вторая – от xml2 . xml2 также предупреждает о других найденных ошибках – например, неправильно отформатированный файл toc.ncx .

Обратите внимание, что сообщения об ошибках находятся на stderr, а имя файла книги по-прежнему находится на уровне stdout.

xml2 доступен для пакетов Debian, Ubuntu и других debian-производных и, возможно, для большинства других дистрибутивов Linux.

Для простых задач, подобных этому (то есть, когда вы просто хотите преобразовать XML в линейный формат для использования с sed , awk , cut , grep и т. Д.), xml2 проще и проще в использовании, чем xmlstarlet .

BTW, если вы хотите напечатать название epub, измените сценарий sed на:

 sed -n -e 's:^/ncx/navMap/navPoint/navLabel/text=: :p s!^/ncx/docTitle/text=! Title: !p' 

или замените его на awk скрипт:

 awk -F= '/(navLabel|docTitle)\/text/ {print $2}' 

Хотя ответ, который дает @cas, работает в некоторых случаях, он основан на предположении epub версии 2.0 с документом toc.ncx именем toc.ncx на верхнем уровне контейнера zip. Из 223 epubs, которые у меня есть в одной папке, только 5 по-прежнему соответствуют этому предположению – и они содержат только совместимость со старыми системами чтения. toc.ncx не является обязательным файлом – требуемым файлом является META-INF/content.xml . Это будет содержать указатели на все остальные элементы epub. Это делает скрипты через bash немного более сложными, но возможными. Вот сценарий, который вытащит заголовок и автора из файла opf (с указанием через content.xml):

 #! /bin/sh for f in "$@" ; do echo -n "$f"" " opf=$(unzip -p "$f" META-INF/container.xml | xml2 | sed -n -e 's:^/container/rootfiles/rootfile/@full-path=::p') unzip -p "$f" "$opf" | xml2 | sed -n -e 's!^/package/metadata/dc:title=! !p' | tr ' ' ' ' unzip -p "$f" "$opf" | xml2 | sed -n -e 's!^/package/metadata/dc:creator=! !p' | tr ' ' ' ' echo done 

Да, он анализирует opf дважды, чтобы обеспечить порядок результатов – это генерирует вкладку, разделенную с тремя столбцами (это вкладки в линиях sed между двумя ошибками), подходящие для импорта электронных таблиц.

Переход на еще один шаг для поиска файла ncx немного сложнее, поскольку с помощью xml2 для создания отдельной строки для каждого тега и атрибута работает против нас здесь: нам нужно значение атрибута href атрибут media-type равен application/x-dtbncx+xml . Мы можем немного обмануть и надеемся, что исходный элемент все в одной строке, и используйте grep для извлечения только этого фрагмента, а затем обработайте это с помощью xml2, чтобы получить значение href.

Поскольку это относительный URL-адрес, нам также необходимо извлечь часть пути из записи opf. Соединяя все это, дает нам:

 #! /bin/sh for f in "$@" ; do echo "$f"" " opf=$(unzip -p "$f" META-INF/container.xml | xml2 | sed -n -e 's:^/container/rootfiles/rootfile/@full-path=::p') ncx=$(unzip -p "$f" "$opf" | grep application/x-dtbncx+xml| xml2 | sed -n -e 's!^/item/@href=!!p') opf_filename=${opf##*/} opf_path=${opf%$opf_filename} unzip -p "$f" ${opf_path}${ncx} | xml2 | sed -n -e 's:^/ncx/navMap/navPoint/navLabel/text=: :p s!^/ncx/docTitle/text=!Title: !p' done 

Это все еще делает предположения, самое сильное, что они являются совместимыми с epub2 файлами и, следовательно, содержат файл ncx. В документах Epub3 используется другой формат на основе HTML. Тем не менее, я получаю TOC для всех 223 моих тестовых файлов (хотя некоторые из них не имеют заголовков в ncx)

Linux и Unix - лучшая ОС в мире.