Вернуться к разделу "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)