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

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

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

Задача

При создании документов в РКК со сканера заметил, что размер файла громадный -- 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
30
Подписаться
Опубликовано:
19 октября 2018 в 14:08
  • 3

Комментарии

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

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

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

Спасибо

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