Ускорение работы сканирования и преобразования документов в pdf

230
пользователей
3 / 0,36
Размер файла до/после в Мб
> 5 раз
ускорение процесса
Заказчик: АО "ОДК-ГТ"
Исполнитель: самостоятельно
Теги:

Задача

При создании документов в РКК со сканера заметил, что размер файла громадный -- 3 мб для одностраничного текстового документа. Стал разбираться и вот, что нашел: документ сканируется сканером в tiff, который сохраняется во временной папке. Затем этот документ подхватывается программой обработки директума и преобразуется в пдф, который и регистрируется в системе, но размер исходного (tiff) и конечного (pdf) файла при этом отличается всего, примерно, на 10%, т.е. 3 МБ и 2,7 МБ. 

В техподдержке посоветовали посмотреть в сторону twain-драйвера для сканера, но перехватив промежуточный документ (tif) я попробовал его сохранить стандартным принтером win10: "Microsoft Print to PDF" и увидел, что размер файла pdf уменьшился, почти, в 10 раз! 300 КБ - приемлемый размер для документа. 

Возникло предположение , что дело в настройках конвертера directum, но установки качества в центре администрирования не привели вообще  ни к какому результату.

Поиск решения

Для устранения проблемы решили использовать стороннее приложение. 

Для этого был выбран ImageMagick. Эта программа позволяет производить операции над графическими файлами в неинтерактивном режиме и совершенно бесплатна.

Полученный от сканера файл кодирую в jpeg (эта кодировка дала наилучший результат) и сохраняю в pdf. Причем в случае многостраничного документа исходник автоматически разбивается на несколько файлов, которые затем сами собираются в один файл). Результат превзошел ожидания: размер тестового файла уменьшился с 3 МБ до 360 КБ (без видимых потерь в качестве), скорость преобразования - пара секунд для пятистраничного файла, с нативным занимало более 10 секунд.

Описание решения

Скачал портативную версию программы ImageMagick с сайта и положил в общедоступную папку на сервере директума (расположение может быть любым, главное, чтобы была открыта для чтения внутри сети), путь к которой поместил в константу. Это было сделано для того, чтобы обеспечить доступ любого клиента внутри сети к этой программе без необходимости устанавливать ее на каждом компьютере. Создал функцию(описание из созданной справки): 

Функция предназначена для конвертирования файлов в pdf. 

Группа: 

ОДК 

Синтаксис: 

ODK_ConvertFileToPDF(
  InputFileName: Строка;
  OutputFileName: Строка;
  [compressType: Строка = 'JPEG'];
  [qualityPercent: Целое число = 80])
 
 

Параметры: 

InputFileName - Имя исходного файла 

OutputFileName - Имя выходного файла 

compressType - Тип сжатия 

qualityPercent - Качество выходного файла в процентах. 

Возвращаемое значение: 

В случае успешного завершения возвращается 0.
При возникновении ислючения возвращается -1.
При возникновении ошибки конвертирования возвращается значение >0.
 

Описание: 

Альтернатива стандартного преобразования, но с увеличенной скоростью работы и возможностью способов сжатия. В качестве конвертера исопльзуется imagemagick.
Подробнее:
https://www.imagemagick.org
Типы сжатия:
https://www.imagemagick.org/script/command-line-options.php#compress
Качество картинки:
https://www.imagemagick.org/script/command-line-options.php#quality

Текст функции:

//проверяем параметры
CheckParam('InputFileName'; InputFileName)
CheckParam('OutputFileName'; OutputFileName)
//получаем путь к конвертеру(общедоступная папка)
converterPath = GetConstant('ODK_ConverterToPDFPath')
//формируем командную строку
command = format( '"%s" "%s" -compress %s -quality %s "%s"'; arrayof(converterPath; InputFileName; compressType; qualityPercent; OutputFileName))
//запускаем с заданными параметрами
try
  Shell = CreateObject("WScript.Shell")
  Result = Shell.Run(command; 0; True)
except
  Result = -1
endexcept

Далее, вызов функции поместил в начало стандартной функции по преобразованию файла в PDF(DCTSConvertFileToPDF) таким образом, чтобы в случае неудачной обработки нашей функции запускалась стандартная(нативная).

 // Объявление констант
  ADO_BINARY_TYPE           = 1 // adTypeBinary
  ADO_READ_ALL              = -1 // adReadAll
  ADO_SAVE_CREATE_OVERWRITE = 2 // adSaveCreateOverWrite
  EXTENSION_MASK            = "E"
  FIRST_AVAILABLE_TRANSFORMATION_INDEX = 0
  
  // Проверить входные параметры
  CheckParam("WSDLFileName"; WSDLFileName; "")
  CheckParam("InputFileName"; InputFileName; "")
  CheckParam("OutputFileName"; OutputFileName; "")
  
  
  //исправляем громадный размер файла за счет преобразования в сторонней программе imagemagick
  imagemagickResult = ODK_ConvertFileToPDF(InputFileName; OutputFileName)
  if imagemagickResult <> 0 
  //стандартное преобразование
    
    // Инициализация подключения к сервису  
    SoapClient = CreateObject("MSSOAP.SoapClient30")
    //...
    //...
    //...
    ADOStream.Close()  
  endif      

Проверено для версии 5.3 По умолчанию выставлена степень сжатия 80% JPEG

Состав команды: 1 человек.

Номинация: Forum
Утверждено 33 3

У вас похожая задача?

Обсудите реализацию с экспертом Directum

Обязательное поле
Обязательное поле
Обязательное поле
Обязательное поле
Обязательное поле
Обязательное поле

Благодарим за интерес! Мы свяжемся с вами.

Комментарии (3)

Владимир Гладких

Ставить imagemagick надо на каждый комп с которого будет идти преобразование?

Кирилл Ревенков

Владимир, нет. В нашем случае портативную версию программы поставили на сервер директума в общедоступную папку.

Юрий Юсупбаев

Проверили. Работает на 5.5.

Спасибо

Авторизуйтесь, чтобы написать комментарий

Directum Awards 2024
Какой проект лучше?
Авторизуйтесь, чтобы оценить материал.
Авторизуйтесь, чтобы оценить материал.
Directum Awards 2024
Спасибо за активность!
Ваш голос принят