Отсканированная коллекция изображений в PDF файлы

Github Latest scan-images-menu2pdf Github LICENSE scan-images-menu2pdf Github Repo Github Download scan-images-menu2pdf

Отсканированная коллекция изображений в PDF файлы

В работе очень часто приходится конвертировать отсканированные изображения в PDF файлы и этот процесс довольно трудоёмкий, а приходится делать это два - три раза в неделю. Можно использовать различные программы для создания PDF файлов, оптимизации этих файлов и т. д. Но главное - я считаю, что заполнение метатегами PDF файлов крайне необходимо. Это необходимо ни только в плане SEO оптимизации, но и в плане удобства просмотра файлов в браузере. Посетитель открывает ваш файл и видит не имя файла, когда метатеги не заполнены, а нормальное отображение заголовка вашего файла.

Как это выглядит на примере, если метатеги не заполнены.

Пример просмотра PDF файла с незаполненными метатегами

И как это выглядит на примере, если метатеги заполнены.

Пример просмотра PDF файла с заполненными метатегами

Как видно посетитель видит реальный заголовок файла, который он просматривает, что очень удобно.

На одной конференции по проверке сайтов гос. учреждений мною был задан вопрос про метатеги... И что меня очень удивило, так это то, что человек, который нам всё объяснял, даже не понял о чём это я и зачем это всё :). А это был человек высокого ранга... Меня очень удивило простое не знание по такому простому вопросу.

И так, начнём разбор нашего приложения...

Приложение я решил писать на Node.JS, так как мною была найдена нужная мне библиотека создания PDF файлов pdf-lib.js. Это основной плюс в сторону Node.JS.

С версии 2.x.x.x данное описание уже не действительно

Так же под Node.JS есть куча модулей для работы с оптимизацией изображений, где я выбрал более подходящий под мои требования модуль - compress-images. Для работы данного модуля так же требуются модули gifsicle и pngquant-bin. Конечно можно использовать и по отдельности pngquant-bin, mozjpeg-bin, но тогда нужно было бы описывать свои модули для объединения работы модулей по форматом файлов. Т. е. мы бы получили на выходе практически тот же самый модуль compress-images и, если честно, лень это делать))). Задача была запустить приложение быстро и эффективно.

Вот что мне пришлось переделать, так это модуль выбора директории с файлами изображений node-file-dialog. Данное решение совершенно не подошло, но идея создания диалога на Python даже очень понравилась.

Чем же не подошёл модуль node-file-dialog?

Модуль не подошёл тем, что он не отдаёт нормально путь директории с русскими символами, а это огромный минус. Я не буду вдаваться в суть проблемы и что нужно изменить в данном модуле, но мною было принято решение создать один исполняемый файл с выводом трёх диалогов и правильной отдачей JSON данных на выход, что получилось давольно не плохо.

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

Что же мы будем передавать нашим диалогам? А передавать мы будем типы конвертирования. Т. е. мы знаем, что у нас на входе, знаем количество файлов изображений в каждом PDF файле, знаем, какой размер страницы должен получиться, знаем кто составил меню и знаем кто его публикует.

 

PS: Что же произошло нового с версии 2.х.х.х?

С версии 2.0.0.0 был полностью изменён подход к запуску диалога настроек программы, а так же отказался от использования модуля compress-images в сторону использования приложения ImageMagick, запуск которого имеется под всеми системами (Windows, Linux, Mac OS, iOS). Соответственно уменшилось и количество устанавливаемых файлов для запуска приложения.

Для меня было важно составить 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

Поделиться