Отсканированная коллекция изображений в PDF файлы
В работе очень часто приходится конвертировать отсканированные изображения в PDF файлы и этот процесс довольно трудоёмкий, а приходится делать это два - три раза в неделю. Можно использовать различные программы для создания PDF файлов, оптимизации этих файлов и т. д. Но главное - я считаю, что заполнение метатегами PDF файлов крайне необходимо. Это необходимо ни только в плане SEO оптимизации, но и в плане удобства просмотра файлов в браузере. Посетитель открывает ваш файл и видит не имя файла, когда метатеги не заполнены, а нормальное отображение заголовка вашего файла.
Как это выглядит на примере, если метатеги не заполнены.
И как это выглядит на примере, если метатеги заполнены.
Как видно посетитель видит реальный заголовок файла, который он просматривает, что очень удобно.
На одной конференции по проверке сайтов гос. учреждений мною был задан вопрос про метатеги... И что меня очень удивило, так это то, что человек, который нам всё объяснял, даже не понял о чём это я и зачем это всё :). А это был человек высокого ранга... Меня очень удивило простое не знание по такому простому вопросу.
И так, начнём разбор нашего приложения...
Приложение я решил писать на Node.JS, так как мною была найдена нужная мне библиотека создания PDF файлов pdf-lib.js. Это основной плюс в сторону Node.JS. Так же под Node.JS есть куча модулей для работы с оптимизацией изображений, где я выбрал более подходящий под мои требования модуль - compress-images. Для работы данного модуля так же требуются модули gifsicle и pngquant-bin. Конечно можно использовать и по отдельности pngquant-bin
, mozjpeg-bin
, но тогда нужно было бы описывать свои модули для объединения работы модулей по форматом файлов. Т. е. мы бы получили на выходе практически тот же самый модуль compress-images
и, если честно, лень это делать))). Задача была запустить приложение быстро и эффективно.
Вот что мне пришлось переделать, так это модуль выбора директории с файлами изображений node-file-dialog. Данное решение совершенно не подошло, но идея создания диалога на Python даже очень понравилась.
Чем же не подошёл модуль node-file-dialog
?
Модуль не подошёл тем, что он не отдаёт нормально путь директории с русскими символами, а это огромный минус. Я не буду вдаваться в суть проблемы и что нужно изменить в данном модуле, но мною было принято решение создать один исполняемый файл с выводом трёх диалогов и правильной отдачей JSON данных на выход, что получилось давольно не плохо.
И так, на Python я собрал запуск трёх диалогов в определённой последовательности, но главное, я осуществил передачу данных из исполняемого скрипта JS в разработанное приложение диалогов.
Что же мы будем передавать нашим диалогам? А передавать мы будем типы конвертирования. Т. е. мы знаем, что у нас на входе, знаем количество файлов изображений в каждом PDF файле, знаем, какой размер страницы должен получиться, знаем кто составил меню и знаем кто его публикует.
Для меня было важно составить PDF файлы каждодневного меню питания и примерного двухнедельного меню питания. У меня получился вот такой JSON файл:
File: menu.json
[
{
"name": "Каждодневное меню",
"files": 2,
"size": 1130,
"author": "ООО «КДП «Название_КДП»",
"produser": "ГБОУ СОШ Название_школы",
"items": [
{
"title": "Меню рациона питания для детей учащихся 1-4 классов",
"sufix": "-1-4"
},
{
"title": "Меню рациона питания для детей с ОВЗ",
"sufix": "-ovz"
},
{
"title": "Индивидуальное меню рациона питания",
"sufix": "-ind"
},
{
"title": "Меню рациона питания для учащихся",
"sufix": ""
},
{
"title": "Меню рациона питания для детей мобилизованных родителей",
"sufix": "-mob"
}
]
},
{
"name": "Двухнедельное меню",
"files": 11,
"size": 1600,
"author": "ООО «КДП «Название_КДП»",
"produser": "ГБОУ СОШ Название_школы",
"items": [
{
"title": "Примерное двухнедельное меню рациона питания для детей учащихся 1-4 класса",
"sufix": "-1-4"
},
{
"title": "Примерное двухнедельное меню рациона питания для детей c ОВЗ",
"sufix": "-ovz"
},
{
"title": "Примерное двухнедельное индивидуальное меню рациона питания",
"sufix": "-ind"
},
{
"title": "Примерное двухнедельное меню рациона питания для учащихся",
"sufix": ""
},
{
"title": "Примерное двухнедельное меню рациона питания для детей мобилизованных родителей",
"sufix": "-mob"
}
]
}
]
В каждодневном меню используется A4 в книжном формате, а в двухнедельном - альбомный формат. Естественно, изображения мною подготавливаются, но делает это программа, с помощью которой происходит сканирование с МФУ HP Laser 137fnw. У вас может быть другой МФУ или сканер. В моём случае это приложение HP MFP Scan. Т. е. изображения поварачиваются в нужное положение либо сами, либо я их поворачиваю при просмотре скана. Так же я прохожусь по именам файлов и преобразую их в нормальный порядковый номер длиною 4 символа (0001.jpg
как пример). Делается это с помощью Total Commander.
Как это выглядит в итоге:
Из файла menu.json
мы забираем только названия типов меню, формируем JSON для запуска диалогов:
JSON для запуска диалогов
[
{
"name": "Каждодневное меню"
},
{
"name": "Двухнедельное меню"
}
]
И так, на входе мы имеем подготовленный файл menu.json
и директорию с отсканированными изображениями. Далее мы запускаем программу запустив файл scan-images-menu2pdf.bat
.
Результатам я оказался полностью доволен. На переименование и генерацию PDF файлов (я не говорю про сканирование) трачу где-то порядка 15 - 30 секунд, что на много меньше ручного преобразования, где-то приблизительно пол-часа, час. Экономия времени ощутимая...
Так же в программу будет встроена возможность работы под Linux и macOS. Это зависит от наличия установленной системы под рукой, а это, я смею заметить, уже далеко не за горами...
В репозитории на GitHub можно посмотреть сам исполняемый файл main.js
, который содержит мои комментарии к работе данного файла.
Посмотреть репозиторий на GitHub