Вернуться к разделу "DjVu-программы".


Распознавание в FineReader 8 без вызова его GUI

Автор: Melirius.

FR официально не поддерживает запуск из командной строки с сохранением распознанного пакета в заданное место. Это приходилось делать вручную.

После тщательных раскопок в алгоритме работы FR автором было обнаружено, что его работу всё же можно полностью автоматизировать. Для этого в пакете применяется запуск фонового распознавания FineReader примерно таким макаром:

"C:\Program Files\LizardTech\FR\FineBR.exe" FarbfehnGestunGehrat "C:\Program Files\LizardTech\FR\aga" 5614 "Software\ABBYY\FineReader\8.00" "Software\ABBYY\FineReader\8.00" 1

где FineBR.exe есть скопированный и переименованный файл FineBR.drv, "C:\Program Files\LizardTech\FR\aga" - путь к пакету, а 5614 есть PID процесса, по завершении которого фоновое распознавание прекращается. Самое интересное начинается, если процесса с заданным PID в системе в момент запуска распознавания нет - тогда работа программы продолжается бесконечно, штатными средствами её завершить нельзя, помогает только kill.

В пакете должны присутствовать следующие файлы: textlang.dat, FRBatch.opt, _FRBatch.pac, отвечающие, соответственно, за выбор языков и опций распознавания, а также за происхождение картинок.

В процессе распознавания FineBR.exe переводит изображения в указанной папке, имеющие имена 0001.tif, 0002.tif и т. д., в понятный FR формат и распознаёт их. Остаётся только следить за папкой, и когда все файлы будут распознаны, завершать работу. Такой алгоритм и применён в настоящем пакете.

Приложение к 9-ому FR затруднено рядом обстоятельств: во-первых, в этой версии ABBYY ввела проверку запускающего фонового распознавание приложения на вшивость, то бишь на соответствие каким-то внутренним признакам FineReader.exe (не названию файла —это точно), а во-вторых —был изменён формат FRF-файлов, вновь не документированный. Если кто-то сможет разобраться с данной проблемой, милости просим на профильные форумы в Интернет.


Примечание:

Дальнейшая часть раздела представляет собой исходный текст применяемого в пакете bat-файла с комментариями и может быть пропущена без ущерба для понимания остальной части изложения.


Запускается данный bat-файл с низким приоритетом.

title FR-auto

Задаём окну командного интерпретатора заголовок.

del /q C:\totalcmd\Add-ons\FR-auto.txt

del /q "C:\Program Files\LizardTech\FR\aga\*.*"

xcopy /i /h /y "C:\Program Files\LizardTech\FR\BP" "С:\Program Files\LizardTech\FR\aga\"

Чистим файлы и папки, в папке BP лежит пустая заготовка пакета - это файлы, определяющие режим распознавания и его языки (по дефолту рус/греч/англ); в папке aga будет сам пакет.

"C:\Program Files\LizardTech\Lizardtech Document Express Enterprise\bin\djvudecode.exe" --verbose %1 "C:\Program Files\LizardTech\FR\aga\out.tif"

Расшифровываем переданный в командной строке DjVu-файл.

C:\totalcmd\XnView\nconvert.exe -xall -c 3 -o $####.tif -in tiff  "C:\Program Files\LizardTech\FR\aga\out.tif"

Разбираем тифф на одностраничные с LZW-сжатием с помощью NConvert.

del "C:\Program Files\LizardTech\FR\aga\out.tif"

Удаляем исходник на всякий пожарный - FineBR как-то нервно относится к посторонним tiff-ам в своей папке, временами вылетает.

tasklist /nh /fi "Windowtitle eq FR-auto" > c:\totalcmd\Add-ons\FR-auto.txt

Определяем PID нашего командного процессора.

for /F "skip=1 tokens=1,2* delims= " %%i in (C:\totalcmd\Add-ons\FR-auto.txt) do

for /L %%z in (1,1,%NUMBER_OF_PROCESSORS%) do start /b /d "C:\Program Files\LizardTech\FR" FineBR.exe FarbfehnGestunGehrat "C:\Program Files\LizardTech\FR\aga" %%j "Software\ABBYY\FineReader\8.00" "Software\ABBYY\FineReader\8.00" 1

Вот тут-то и порыта собака :). FineBR вызывается со странными параметрами командной строки. PID ему нужен, чтобы закончить работу, если уходит вызвавшее его приложение. Так как фоновый распознаватель FR работает в один поток, то вызываются столько его экземпляров, сколько у Вас процессоров или ядер. Мешать друг другу они не будут, проверено, распределяя своё внимание лишь по незанятым файлам.

@echo.

@echo.

@echo Please wait...

@echo.

@echo off

@:loop

@ping localhost -n 30 > nul

@for %%i in ("C:\Program Files\LizardTech\FR\aga\????.tif") do if not exist "C:\Program Files\LizardTech\FR\aga\%%~ni.frf"

(echo %%~ni.frf doesn’t exist - continue for another 30 seconds & goto loop)

@echo on

Экзотика - надо же ж как-то дождаться конца распознавания. Ping-ом делаем паузы по 30 сек и проверяем, все ли файлы FRF присутствуют в папке пакета. Для развлечения пользователя печатаем, какого файла программа не нашла.

"C:\Program Files\LizardTech\OCR-new\FRFgrab.exe" -i -p 1 "C:\Program Files\LizardTech\FR\aga\*.frf" > "c:\Program Files\LizardTech\OCR-new\book.txt"

copy %1 %~dpn1.OCR.djvu

"C:\Program Files\LizardTech\OCR-new\djvused.exe" -f "C:\Program Files\LizardTech\OCR-new\book.txt" %~dpn1.OCR.djvu

Здесь вытаскиваем инфу из FRF и внедряем в DjVu.

pause

Ждём-с. . . затем выходим, процессы FineBR видят, что материнское приложение ушло, и дохнут сами.


Скачать файлы к статье  (2 КБ)


19 сентября 2008 г.

E-Mail  (monday2000 [at] yandex.ru)

Hosted by uCoz