Друзья, вынужден признать, что опубликованный мной скрипт AutoIT для автоматизации Finereader работает из рук вон плохо, кроме того неоптимален по времени и использованию ресурсов. После небольшого прохода по Google была обнаружена компания Ranorex GmbH, предлагающая замечательные средства для работы с Windows GUI. Поскольку я давно собирался начать осваивать Python, выбор скриптового языка для работы с FR не был вопросом.

Итак, под катом – очередная вариация скрипта на тему “Как автоматизировать FineReader”. Требуется Python и библиотеки Ranorex, которые скачиваются с сайта программы.

# coding=cp1251
 
import sys, re, imp, time, logging, logging.handlers
logging.basicConfig(level=logging.DEBUG,
				format='%(asctime)s;%(levelname)s;%(message)s',
				filename='c:\\official\\py_log2.txt',
                filemode='w+')
#smtp_log_handler = logging.handlers.SMTPHandler('195.24.227.198','py-script@rospravo.local','K.Udartsev@rospravo.ru','Recon logger event')
l01 = logging.getLogger('l01')
#l01.addHandler(smtp_log_handler)
R = imp.load_dynamic('RanorexPython', 'c:\\Python25\\DLLs\\RanorexPython.dll')
FRDir = 'C:\\Program Files\\ABBYY FineReader 9.0\\'
FRExecutablePath = FRDir+'FineReader.exe'
DirListPath = 'C:\\official\\lf_test.txt'
Number_of_retries = 10000 #x 1 sec - more than enough
 
def fr_start(frpath):
	R.ApplicationStart(frpath)
	return R.FormFindTitle("ABBYY FineReader", R.MATCH_SUBSTRING, True, 5000)
	#return R.ApplicationGetFirst()
 
def main():
	iteration = 0
	dirList = open(DirListPath,'r')
	dirs = dirList.readlines()
	l01.debug('Read list of dirs; total: %d found' %len(dirs))
	#print str(5)+'-'+dirs[1][3:].strip().replace('\\','-')+'.pdf'
 
	FRWnd = fr_start(FRExecutablePath)
	l01.debug('Finereader window handle: %d' %FRWnd)
 
	if FRWnd == 0:
		return 1
 
	R.FormActivate(FRWnd)
	R.Sleep(500)
	#open file dialog
	for dir in dirs:
		print 'Current directory: '+dir.strip()
		logging.debug('Current directory: '+dir.strip())
		R.ControlSendKeys(0, "{CTRLDOWN}o", 20)
		R.ControlSendKeys(0, "{CTRLUP}", 20)
	#
		openFilesDlg = R.FormFindTitle('Open Image',R.MATCH_EXACT, True, 500)
		#R.FormActivate(openFilesDlg)
		l01.debug('Open files dialog handle: %d' %openFilesDlg)
	#
		edit_dirname = R.FormFindChildClassName(openFilesDlg, "Edit", 1)
		l01.debug('edit_SrcDirName: %d' %edit_dirname)
 
		R.Sleep(500)
		edit_cancelBtn = R.FormFindChildClassName(openFilesDlg, "Button", 4)
		l01.debug('button_Cancel: %d' %edit_cancelBtn)
 
		R.Sleep(500)
		edit_okBtn = R.FormFindChildClassName(openFilesDlg, "Button", 3)
		l01.debug('button_Ok: %d' %edit_okBtn)
 
		R.Sleep(500)
		ofd_element = R.ControlGetElement(openFilesDlg)
		filesListViewEl = R.ElementFindChild(ofd_element, R.ROLE_SYSTEM_LIST,'','SysListView32',R.MATCH_SUBSTRING)
 
		R.ControlSendKeys(edit_dirname, dir, 1)
		l01.debug('Set directory to '+dir.strip())
		R.Sleep(150)
		R.MouseClickElement(ofd_element,R.MOUSE_LEFT_BUTTON,100,100,1,1);
		R.Sleep(150)
		R.ControlSendKeys(0, "{CTRLDOWN}a{CTRLUP}", 20)
		R.Sleep(150)
		R.ControlSendKeys(0, "{ENTER}", 20)
 
		processingWnd = R.FormFindTitle('Adding pages to the',R.MATCH_FROM_START, True, 500)
		processingWndEl = R.ControlGetElement(processingWnd)
		processingWndValue = processingWndEl[2]
		l01.debug('processingWndValue: ' + processingWndValue)
		l01.debug('processingWnd: %d' %processingWnd)
		R.Sleep(150)
 
		for i in xrange(Number_of_retries):
			R.Sleep(750)
			processingWndEl = R.ControlGetElement(processingWnd)
			processingWndValue = processingWndEl[2]
			opResult = processingWndValue.count('complete.')
			if opResult == 0:
				l01.debug('Result: %d' %opResult)
				l01.debug('Finished; Ending operations')
				break
			else:
				l01.debug('Progress...')
		R.Sleep(500)
		closeProcessingWndBtn = R.ElementFindChild(processingWndEl, R.ROLE_SYSTEM_PUSHBUTTON,'Close','Button',R.MATCH_SUBSTRING)
		R.MouseClickElement(closeProcessingWndBtn)
		R.ControlSendKeys(0, "{CTRLDOWN}s{CTRLUP}", 20)
 
		saveFilesDlg = R.FormFindTitle('Save Pages',R.MATCH_EXACT, True, 500)
		R.FormActivate(saveFilesDlg)
		l01.debug('Save files dialog handle: %d' %saveFilesDlg)
		edit_save_dirname = R.FormFindChildClassName(saveFilesDlg, "Edit", 1)
		l01.debug('edit_saveDirName: %d' %edit_save_dirname)
 
		filename = dir.strip()+'\\'+str(iteration)+'-'+dir[3:].strip().replace('\\','-')+'.pdf'
		R.ControlSetText(edit_save_dirname, filename)
		l01.debug('Set save path & filename to '+filename)
		R.Sleep(150)
		R.ControlSendKeys(0, "{ENTER}", 20)
		l01.debug('Saving file')
 
		savingWnd = R.FormFindTitle('Saving to file',R.MATCH_FROM_START, True, 500)
		savingWndEl = R.ControlGetElement(savingWnd)
		savingWndValue = savingWndEl[2]
		l01.debug('savingWndValue: ' + savingWndValue)
		l01.debug('savingWnd: %d' %savingWnd)
		R.Sleep(150)
		for i in xrange(Number_of_retries):
			R.Sleep(100)
			savingWndLoc = R.ControlGetPosition(savingWnd)
			if savingWndLoc == None:
				l01.info('Saved file')
				break
			else:
				l01.info('Still saving')
		R.Sleep(1000)
		R.ControlSendKeys(0, "{ALTDOWN}f{ALTUP}c", 20)
		R.Sleep(100)
 
		dontSaveWnd = R.FormFindTitle('ABBYY FineReader 9.0 Professional Edition',R.MATCH_EXACT, True, 500)
		dontSaveWndEl = R.ControlGetElement(dontSaveWnd)
 
		l01.debug('dontSaveWndEl: ' + dontSaveWndEl[2])
		l01.debug('dontSaveWnd: %d' %dontSaveWnd)
		R.Sleep(150)
		closeDontSaveWndBtn = R.ElementFindChild(dontSaveWndEl, R.ROLE_SYSTEM_PUSHBUTTON,'Нет','Button',R.MATCH_SUBSTRING)
		R.Sleep(150)
		R.MouseClickElement(closeDontSaveWndBtn)
		iteration+=1
	return 0
 
if __name__ == "__main__":
    ret = main()
    if ret != 0:
        print 'Test FAILED'
    else:
        print 'Test PASSED'
    sys.exit(ret)
Социальные закладки:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • TwitThis
  • Live
  • email
  • MySpace
  • Technorati
  • RSS

Похожих записей нет.