[ Пред. ] [ Содержание ] [ След. ]

exiftool

[ @console @mc @pdf @exiftool @изображения ]



Это консольная утилита, которую можно использовать для редактирования метаданных файлов, в том числе и файлов ”pdf”.


Если хочется в GUI, то можно рассмотреть PaperClip (github) — есть во многих дистрибутивах.


Также метаданные pdf можно редактировать в calibre, и оттуда экспортировать нужные книги на читалку.


exiftool ценят фотографы за возможность автоматизации всяких дел с файлами, вроде повынимать отовсюду метаданные, на основе полученной информации понасоздавать каталоги по датам и местам съёмки, затем распихать файлы по этим каталогам соответственно…


Установка



Но в обеих системах утилита вызывается идентично — «exiftool».


Рабочий алгоритм


  1. В Konsole сделать на читалке отдельный каталог metadata
  2. Сделать отдельный каталог metadata\pdf
  3. Переместить в каталог metadata\pdf все файлы pdf, чьи поля нужно отредактировать
  4. В Konsole запустить Midnight Commander, открыть в левой панели каталог metadata\pdf, а в правой панели — каталог metadata
  5. Сделать отдельный файл metadata\metadata.txt
  6. Открыть файл metadata.txt на редактирование в Kate
  7. Записать в файл metadata.txt все поля, которые нужно обновить
  8. Переместить очередной pdf слева направо и свернуть Midnight Commander (Ctrl+O)
  9. В файле metadata.txt в Kate отредактировать поля для очередного файла (Ctrl+S)
  10. В Konsole выполнить команду (при повторах вызвать её из истории через клавиатуру и кнопку “Up”):

exiftool -@ metadata.txt *.pdf && exiftool -Title -Author *.pdf && rm *.pdf_original && mv *.pdf /media/astenix/PB1040/Books/


  1. Получить в консоли зрительное подтверждение измененных полей. Файл ”*.pdf_original” удалён, а отредактированный файл перемещён в каталог с книгами на читалке.
  2. Вернуть на экран Midnight Commander (Ctrl+O) и GoTo step #8.

Получить метаданные из файла pdf


Получить метаданные из файла pdf


Здесь подразумевается, что в каталоге находится один файл pdf и мы хотим получить ВСЕ метаданные, которые в нём есть (а их там много, некоторые пустые):


exiftool *.pdf


Можно прямо указать имя нужного файла:


exiftool file_one.pdf


но при этом следует учесть, что если имя файла будет составлено из нескольких слов (то есть, через пробелы), да ещё и с разными печатными символами, то придётся это всё грамотно экранировать кавычками. Проще будет сделать отдельный каталог, переносить туда каждый файл по-отдельности и обращаться к нему через шаблон имени «*.pdf».


Сохранить метаданные в отдельный файл .txt


exiftool *.pdf > pdf_metadata.txt


Получить отдельные метаданные из pdf


Например, нужны только заголовок и имя автора. Их надо прямо перечислить:


exiftool *.pdf -author -title > title_metadata.txt


Получить метаданные из нескольких файлов pdf


Можно перечислить имена этих файлов:


exiftool file_one.pdf file_two.pdf file_three.pdf > pdf_metadata.txt


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


exiftool *.pdf > all_pdf_metadata.txt


Получить метаданные из файлов pdf из другого каталога


Например, файлы находятся на электрокниге (ограничимся только запросом заголовка):


exiftool /media/astenix/myPoketBook/Books/*.pdf -title > all_pdf_from_external_folder_metadata.txt


Удалить все метаданные из файла pdf


exiftool -all:all= *.pdf


Записать новые значения метаданных в pdf-файл


Учесть перед обработкой метаданных в pdf для PoketBook


  1. Имя автора надо прописывать так: «Имя Фамилия»

Во встроенной библиотеке в Poketbook сортировка по имени автора происходит по последнему слову в этом поле.


  1. Несколько имен авторов у одной книги следует разделять словом «and» или амперсандом

Всё это важно потому, что при регистрации книг в библиотеке Calibre сперва создаёт каталог с именем автора, затем переносит туда все книги, помеченные этим именем автора.


Общепринято разделять имена авторов амперсандом («Василий Шукшин & Флоризель Карамзин») или словом «and» («Василий Шукшин and Флоризель Карамзин»). В Calibre этот амперсанд учитывается и фильтрация по отдельным именам авторов происходит грамотно. А слово «and» в Calibre принудительно превращается в амперсанд и тоже учитывается как полагается.


«Запятая» или «точка с запятой» в именах авторов не используются и воспринимаются Calibre как простой текст.


А в PoketBook всё это не имеет значения. Что в поле Author в метаданных файла pdf написано, то и отображается. Сортировка «по автору» будет выполняться как было указано ранее, по первой букве последнего слова. И неважно, амперсанд там прописан или запятая…



Изменить метаданные одной строкой в консоли


exiftool *.pdf -Author="Имя Фамилия" -Title="Заголовок книги" -Subject="ЕслиОченьНужно" && rm *.pdf_original


Осторожно с дополнительной командой «rm *.pdf_original»! Для безопасности при редактировании метаданных отдельного файла создаётся новый файл pdf, а нетронутый исходный сохраняется отдельно в виде «*.pdf_original» в том же каталоге. Иногда это спасает.


Можно эти файлы-оригиналы перемещать в отдельный каталог (сперва его надо создать, назовём его Originals):


exiftool *.pdf -Author="имяАвтора" -Title="Заголовок книги" && mv *.pdf_original Originals


Изменить метаданные через отдельный файл


  1. Переместить pdf-файл в отдельный каталог.

Название файла несущественно, бо в итоговой команде будет обращение к *.pdf, что означает «любой файл с расширением pdf, который найдётся в текущем каталоге». Это избавит от необходимости экранировать пробелов в названии обрабатываемого файла.


В этот же каталог положить файл metadata.txt.


  1. Записать в файл metadata.txt нужные значения будущих метаданных.

Пример:

-Title=Учебник по этике воровства
-Author=Имя Фамилия
-Description=Любая дополнительная информация
-Subject=Компьютеры, Технологии, Ротоскопинг
-Producer=LaTeX
-Creator=Имя создателя файла

Важно учесть: строки должны начинаться от левого края без отступов.


Неочевидно то, что Subject = Keywords. То есть, что в поле Subject запишешь, то же будет отображаться в поле Keywords.


Разделять данные можно и запятой, и точкой с запятой — будут записаны оба эти символа.


Если какие-то поля объявить, но текстом их не снабдить, то содержимое этих полей будет обнулено.


Рекомендую имя автора книги записать сразу в оба поля:


-Author=Жан Вальжан
-Creator=Жан Вальжан

Итоговый пример:


-Title=Пираты и мачта
-Author=Жан Вальжан
-Creator=Жан Вальжан
-Subject=Computer Science
-Description=
-Producer=

Продвигаемся без фанатизма, бо нужны только те метаданные, которых будет достаточно для каталогизации pdf в контексте PoketBook.


  1. Выполнить запись метаданных в файл pdf из файла metadata.txt

exiftool -@ metadata.txt *.pdf


Инструкция -@ указывает на необходимость считать данные из файла metadata.txt.


По-умолчанию используется кодировка utf-8. Если по какой-то причине надо записать метаданные из файла metadata.txt в файл pdf в другой кодировке, то надо указать это явно:


exiftool -charset Greek -@ metadata.txt *.pdf


Что есть ещё


qpdf


Опциональная утилита, из всех возможностей которой мне подошла только линеаризация — оптимизация pdf под веб. В эпоху HDD на 400 мб это было важным делом, бо размер файла уменьшается, все дела. Сегодня это может быть несущественно, но если нужно…


qpdf --linearize input.pdf output.pdf


При этом также происходит «to remove orphan data» из файла, что помогает уменьшить его размер.


pdftk


Мощный комбайн, который позволяет делать с pdf почти всё, что может захотеться. Можно выкинуть из файл определённые страницы, можно соединить в один pdf определённые файлы или сразу все файлы из каталога, можно страницы поворачивать, можно очищать и записывать метаданные.


Общая команда записи
pdftk input.pdf update_info metadata.txt output output.pdf


Но… Формат записи данных в metadata.txt у этой утилиты несколько… неадекватный. Много лишнего.


Для сравнения, так народ удаляет метаданные из pdf:


#Считать метаданные во временный файл
pdftk input.pdf dump_data | \
# поискать внутри dump_data все символы из метаданных
# и превратить их в ноль
sed -e 's/\(InfoValue:\)\s.*/\1\ /g' | \
# обновить метаданные существующего файла
# (образовавшейся пустотой)
# и создать новый файл "ouput.pdf"
pdftk input.pdf update_info output output.pdf


Это супротив одной команды в exiftool? Да ну…


Также у pdftk есть какие-то ограничения, вроде «существующие значения не перезаписываются». Я накатил на файл предыдущий скрипт, чтобы pdftk было удобно записывать метаданные в пустые поля. Однако результатом были постоянные Error, которые я решал-решал, решал-решал, но на ошибке UpdateInfo(): no Info dictionary found уже сломался. Есть же exiftool, там всё просто и работает. Поэтому pdftk для работы с метаданными можно не дёргать.