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

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

  1. # coding=cp1251
  2.  
  3. import sys, re, imp, time, logging, logging.handlers
  4. logging.basicConfig(level=logging.DEBUG,
  5.                                 format=‘%(asctime)s;%(levelname)s;%(message)s’,
  6.                                 filename=‘c:\\official\\py_log2.txt’,
  7.                 filemode=‘w+’)
  8. #smtp_log_handler = logging.handlers.SMTPHandler(’195.24.227.198′,’py-script@rospravo.local’,'K.Udartsev@rospravo.ru’,'Recon logger event’)
  9. l01 = logging.getLogger(‘l01′)
  10. #l01.addHandler(smtp_log_handler)
  11. R = imp.load_dynamic(‘RanorexPython’, ‘c:\\Python25\\DLLs\\RanorexPython.dll’)
  12. FRDir = ‘C:\\Program Files\\ABBYY FineReader 9.0\\
  13. FRExecutablePath = FRDir+‘FineReader.exe’
  14. DirListPath = ‘C:\\official\\lf_test.txt’
  15. Number_of_retries = 10000 #x 1 sec - more than enough
  16.  
  17. def fr_start(frpath):
  18.         R.ApplicationStart(frpath)
  19.         return R.FormFindTitle("ABBYY FineReader", R.MATCH_SUBSTRING, True, 5000)
  20.         #return R.ApplicationGetFirst()
  21.  
  22. def main():
  23.         iteration = 0
  24.         dirList = open(DirListPath,‘r’)
  25.         dirs = dirList.readlines()
  26.         l01.debug(‘Read list of dirs; total: %d found’ %len(dirs))
  27.         #print str(5)+’-'+dirs[1][3:].strip().replace(’\\’,'-’)+’.pdf’
  28.  
  29.         FRWnd = fr_start(FRExecutablePath)
  30.         l01.debug(‘Finereader window handle: %d’ %FRWnd)
  31.  
  32.         if FRWnd == 0:
  33.                 return 1
  34.  
  35.         R.FormActivate(FRWnd)
  36.         R.Sleep(500)
  37.         #open file dialog
  38.         for dir in dirs:
  39.                 print ‘Current directory: ‘+dir.strip()
  40.                 logging.debug(‘Current directory: ‘+dir.strip())
  41.                 R.ControlSendKeys(0, "{CTRLDOWN}o", 20)
  42.                 R.ControlSendKeys(0, "{CTRLUP}", 20)
  43.         #
  44.                 openFilesDlg = R.FormFindTitle(‘Open Image’,R.MATCH_EXACT, True, 500)
  45.                 #R.FormActivate(openFilesDlg)
  46.                 l01.debug(‘Open files dialog handle: %d’ %openFilesDlg)
  47.         #
  48.                 edit_dirname = R.FormFindChildClassName(openFilesDlg, "Edit", 1)
  49.                 l01.debug(‘edit_SrcDirName: %d’ %edit_dirname)
  50.  
  51.                 R.Sleep(500)
  52.                 edit_cancelBtn = R.FormFindChildClassName(openFilesDlg, "Button", 4)
  53.                 l01.debug(‘button_Cancel: %d’ %edit_cancelBtn)
  54.  
  55.                 R.Sleep(500)
  56.                 edit_okBtn = R.FormFindChildClassName(openFilesDlg, "Button", 3)
  57.                 l01.debug(‘button_Ok: %d’ %edit_okBtn)
  58.  
  59.                 R.Sleep(500)
  60.                 ofd_element = R.ControlGetElement(openFilesDlg)
  61.                 filesListViewEl = R.ElementFindChild(ofd_element, R.ROLE_SYSTEM_LIST,,‘SysListView32′,R.MATCH_SUBSTRING)
  62.  
  63.                 R.ControlSendKeys(edit_dirname, dir, 1)
  64.                 l01.debug(‘Set directory to ‘+dir.strip())
  65.                 R.Sleep(150)
  66.                 R.MouseClickElement(ofd_element,R.MOUSE_LEFT_BUTTON,100,100,1,1);
  67.                 R.Sleep(150)
  68.                 R.ControlSendKeys(0, "{CTRLDOWN}a{CTRLUP}", 20)
  69.                 R.Sleep(150)
  70.                 R.ControlSendKeys(0, "{ENTER}", 20)
  71.  
  72.                 processingWnd = R.FormFindTitle(‘Adding pages to the’,R.MATCH_FROM_START, True, 500)
  73.                 processingWndEl = R.ControlGetElement(processingWnd)
  74.                 processingWndValue = processingWndEl[2]
  75.                 l01.debug(‘processingWndValue: ‘ + processingWndValue)
  76.                 l01.debug(‘processingWnd: %d’ %processingWnd)
  77.                 R.Sleep(150)
  78.  
  79.                 for i in xrange(Number_of_retries):
  80.                         R.Sleep(750)
  81.                         processingWndEl = R.ControlGetElement(processingWnd)
  82.                         processingWndValue = processingWndEl[2]
  83.                         opResult = processingWndValue.count(‘complete.’)
  84.                         if opResult == 0:
  85.                                 l01.debug(‘Result: %d’ %opResult)
  86.                                 l01.debug(‘Finished; Ending operations’)
  87.                                 break
  88.                         else:
  89.                                 l01.debug(‘Progress…’)
  90.                 R.Sleep(500)
  91.                 closeProcessingWndBtn = R.ElementFindChild(processingWndEl, R.ROLE_SYSTEM_PUSHBUTTON,‘Close’,‘Button’,R.MATCH_SUBSTRING)
  92.                 R.MouseClickElement(closeProcessingWndBtn)
  93.                 R.ControlSendKeys(0, "{CTRLDOWN}s{CTRLUP}", 20)
  94.  
  95.                 saveFilesDlg = R.FormFindTitle(‘Save Pages’,R.MATCH_EXACT, True, 500)
  96.                 R.FormActivate(saveFilesDlg)
  97.                 l01.debug(‘Save files dialog handle: %d’ %saveFilesDlg)
  98.                 edit_save_dirname = R.FormFindChildClassName(saveFilesDlg, "Edit", 1)
  99.                 l01.debug(‘edit_saveDirName: %d’ %edit_save_dirname)
  100.  
  101.                 filename = dir.strip()+\\+str(iteration)+‘-’+dir[3:].strip().replace(\\,‘-’)+‘.pdf’
  102.                 R.ControlSetText(edit_save_dirname, filename)
  103.                 l01.debug(‘Set save path & filename to ‘+filename)
  104.                 R.Sleep(150)
  105.                 R.ControlSendKeys(0, "{ENTER}", 20)
  106.                 l01.debug(‘Saving file’)
  107.  
  108.                 savingWnd = R.FormFindTitle(‘Saving to file’,R.MATCH_FROM_START, True, 500)
  109.                 savingWndEl = R.ControlGetElement(savingWnd)
  110.                 savingWndValue = savingWndEl[2]
  111.                 l01.debug(’savingWndValue: ‘ + savingWndValue)
  112.                 l01.debug(’savingWnd: %d’ %savingWnd)
  113.                 R.Sleep(150)
  114.                 for i in xrange(Number_of_retries):
  115.                         R.Sleep(100)
  116.                         savingWndLoc = R.ControlGetPosition(savingWnd)
  117.                         if savingWndLoc == None:
  118.                                 l01.info(‘Saved file’)
  119.                                 break
  120.                         else:
  121.                                 l01.info(‘Still saving’)
  122.                 R.Sleep(1000)
  123.                 R.ControlSendKeys(0, "{ALTDOWN}f{ALTUP}c", 20)
  124.                 R.Sleep(100)
  125.  
  126.                 dontSaveWnd = R.FormFindTitle(‘ABBYY FineReader 9.0 Professional Edition’,R.MATCH_EXACT, True, 500)
  127.                 dontSaveWndEl = R.ControlGetElement(dontSaveWnd)
  128.  
  129.                 l01.debug(‘dontSaveWndEl: ‘ + dontSaveWndEl[2])
  130.                 l01.debug(‘dontSaveWnd: %d’ %dontSaveWnd)
  131.                 R.Sleep(150)
  132.                 closeDontSaveWndBtn = R.ElementFindChild(dontSaveWndEl, R.ROLE_SYSTEM_PUSHBUTTON,‘Нет’,‘Button’,R.MATCH_SUBSTRING)
  133.                 R.Sleep(150)
  134.                 R.MouseClickElement(closeDontSaveWndBtn)
  135.                 iteration+=1
  136.         return 0
  137.  
  138. if __name__ == "__main__":
  139.     ret = main()
  140.     if ret != 0:
  141.         print ‘Test FAILED’
  142.     else:
  143.         print ‘Test PASSED’
  144.     sys.exit(ret)
[Slashdot] [Digg] [News2] Бобрдобр [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]