[Pycodeocr-main] SF.net SVN: pycodeocr:[58] trunk
Status: Beta
Brought to you by:
drtrigon
|
From: <drt...@us...> - 2011-09-17 18:41:19
|
Revision: 58
http://pycodeocr.svn.sourceforge.net/pycodeocr/?rev=58&view=rev
Author: drtrigon
Date: 2011-09-17 18:41:11 +0000 (Sat, 17 Sep 2011)
Log Message:
-----------
PEP 8
Modified Paths:
--------------
trunk/PyCodeOCR.py
trunk/utils/RunExternal.py
trunk/utils/RunLibdmtx.py
trunk/utils/RunMagickWand.py
trunk/utils/blacklist_manager.py
trunk/utils/checksum.py
trunk/utils/logging.py
trunk/utils/ocr.py
Modified: trunk/PyCodeOCR.py
===================================================================
--- trunk/PyCodeOCR.py 2011-07-27 13:51:33 UTC (rev 57)
+++ trunk/PyCodeOCR.py 2011-09-17 18:41:11 UTC (rev 58)
@@ -77,10 +77,10 @@
#from pythonmagickwand.image import Image
# search optional pakages
-if "LD_LIBRARY_PATH" not in os.environ: # patch/work-a-round for libdmtx bindings
- os.environ["LD_LIBRARY_PATH"] = "/usr/local/lib" #
- os.system('python %s' % sys.argv[0]) #
- sys.exit() #
+if "LD_LIBRARY_PATH" not in os.environ: # patch/work-a-round for libdmtx bindings
+ os.environ["LD_LIBRARY_PATH"] = "/usr/local/lib" #
+ os.system('python %s' % sys.argv[0]) #
+ sys.exit() #
## list of available pakages
print "To check and install requirements run: 'python %s --install-deps'" % sys.argv[0]
pakages = []
@@ -89,21 +89,21 @@
"dmtxread": utils.requirements.which("dmtxread"),
"pdf417decode.exe": utils.requirements.which("pdf417decode.exe"), }
if os.path.exists(paths["gocr"]):
- pakages.append( "gocr" )
- print "gocr found."
+ pakages.append( "gocr" )
+ print "gocr found."
# libdmtx bindings
#try:
-# from pydmtx import DataMatrix
-# pakages.append( "libdmtx" )
-# print "libdmtx and pydmtx found."
-#except: pass
+# from pydmtx import DataMatrix
+# pakages.append( "libdmtx" )
+# print "libdmtx and pydmtx found."
+#except: pass
if os.path.exists(paths["dmtxread"]):
- pakages.append( "libdmtx" )
- print "libdmtx and pydmtx found."
+ pakages.append( "libdmtx" )
+ print "libdmtx and pydmtx found."
# pdf417decode
if os.path.exists(paths["pdf417decode.exe"]):
- pakages.append( "pdf417decode" )
- print "pdf417decode.exe found."
+ pakages.append( "pdf417decode" )
+ print "pdf417decode.exe found."
# global variables and constants
@@ -115,712 +115,704 @@
## users home path /home/user
home_path = os.path.expanduser('~')
## default scanning coordinates
-std_scan_koords = { "0 deg": (( 82, 60, 20, 155 ), 0), # or with higher res. ( 820, 600, 200, 1559 ),
+std_scan_koords = { "0 deg": (( 82, 60, 20, 155 ), 0), # or with higher res. ( 820, 600, 200, 1559 ),
"90 deg": (( 1, 82, 150, 20 ), 90),
"180 deg": (( 3, 1, 20, 150 ), 180),
"270 deg": (( 60, 3, 150, 20 ), 270),
- "A4": (( 0, 0, 296, 215 ), 0), } # scan whole range (A4: http://www.cl.cam.ac.uk/~mgk25/iso-paper.html)
- #"A4": (( 0, 0, 290, 210 ), 0), } # (more secure; with small border)
+ "A4": (( 0, 0, 296, 215 ), 0), } # scan whole range (A4: http://www.cl.cam.ac.uk/~mgk25/iso-paper.html)
+ #"A4": (( 0, 0, 290, 210 ), 0), } # (more secure; with small border)
## MainWindow
# The GUI was created/designed using GLADE
#
class MainWindowGTK:
- """
- PyCodeOCR main GUI window and application class.
- """
+ """
+ PyCodeOCR main GUI window and application class.
+ """
- # initialization
- # (variables)
- max_retry = 3 # max. scan attempts
- valid_code_len = [ 53, 42, 32 ] # valid code lenghts
- scan_koords = std_scan_koords["0 deg"][0] # default scan pos.
- mode = std_scan_koords["0 deg"][1] # default scan orient.
- res_color = { True: gtk.gdk.color_parse("#00FF00"),
- False: gtk.gdk.color_parse("#FF0000"),
- None: gtk.gdk.color_parse("#FFFFFF"), }
- temp = os.path.join(home_path, "PyCodeOCR_tmp")
- debug = ( os.path.join(home_path, "PyCodeOCR_debug"),
- os.path.join(home_path, "PyCodeOCR_debug.txt"), )
- regex_gocr = re.compile('<barcode(.*?)/>')
+ # initialization
+ # (variables)
+ max_retry = 3 # max. scan attempts
+ valid_code_len = [ 53, 43, 42, 32 ] # valid code lenghts
+ scan_koords = std_scan_koords["0 deg"][0] # default scan pos.
+ mode = std_scan_koords["0 deg"][1] # default scan orient.
+ res_color = { True: gtk.gdk.color_parse("#00FF00"),
+ False: gtk.gdk.color_parse("#FF0000"),
+ None: gtk.gdk.color_parse("#FFFFFF"), }
+ temp = os.path.join(home_path, "PyCodeOCR_tmp")
+ debug = ( os.path.join(home_path, "PyCodeOCR_debug"),
+ os.path.join(home_path, "PyCodeOCR_debug.txt"), )
+ regex_gocr = re.compile('<barcode(.*?)/>')
- #cmd_scan = "scanimage --format=tif --resolution 600 --mode Gray -t %d -l %d -y %d -x %d > %s" # SANE scan command
- cmd_convert = "convert %s -depth 8 -rotate %d %s" # ImageMagick command
- cmd_tesser = "tesseract %s.tif %s" # TesserAct command
- cmd_gocr = paths["gocr"] + " -i %s.pnm" # GOCR command (local)
- cmd_pdf417dec = "wine " + paths["pdf417decode.exe"] + " %s.png" # pdf417decode/wine command (local)
+ #cmd_scan = "scanimage --format=tif --resolution 600 --mode Gray -t %d -l %d -y %d -x %d > %s" # SANE scan command
+ cmd_convert = "convert %s -depth 8 -rotate %d %s" # ImageMagick command
+ cmd_tesser = "tesseract %s.tif %s" # TesserAct command
+ cmd_gocr = paths["gocr"] + " -i %s.pnm" # GOCR command (local)
+ cmd_pdf417dec = "wine " + paths["pdf417decode.exe"] + " %s.png" # pdf417decode/wine command (local)
- __stop = False
+ __stop = False
- # (constants)
- MDE = { 'invoices': 0, 'barcode': 1, 'DataMatrix': 2, 'PDF417': 3 }
+ # (constants)
+ MDE = { 'invoices': 0, 'barcode': 1, 'DataMatrix': 2, 'PDF417': 3 }
- ## Initialize
- def __init__(self):
-
-
-# # retrieve widgets
-# # main_window - main window
-# ## gladefile raw_path.glade
- self.gladefile = raw_path + ".glade"
- # open GTKBuilder
- self.builder = gtk.Builder()
- self.builder.add_from_file(self.gladefile)
- # connect signal handlers
- self.builder.connect_signals(self)
-
- # get objects from glade/GTKBuilder
- ## main window
- self.main_window = self.builder.get_object('main_window')
- self.main_window.set_icon_from_file(raw_path+".png")
- ## notebok
- self.notebook = self.builder.get_object('notebook')
- ## image window
- self.img_popup = self.builder.get_object('img_popup')
- ## scan button
- self.scan_button = self.builder.get_object('scan_button')
- ## restart button
- self.retry_button = self.builder.get_object('retry_button')
- ## exit button
- self.exit_button = self.builder.get_object('exit_button')
- ## placement frame
- self.placement_frame = self.builder.get_object('placement_frame')
- ## image
- self.main_image = self.builder.get_object('main_image')
- ## image
- self.popup_image = self.builder.get_object('popup_image')
- ## output line
- self.output = self.builder.get_object('output')
- self.log_text = self.builder.get_object('log_text')
- self.textbuffer = self.log_text.get_buffer()
- self.device_info_text = self.builder.get_object('device_info_text')
- ## progressbar
- self.progressbar = self.builder.get_object('progressbar')
- ## Orientation label
- self.placement_label = self.builder.get_object('placement_label')
- ## Orientation combobox
- self.orientation = self.builder.get_object('orientation')
- ## mode combobox
- self.mode_combobox = self.builder.get_object('mode_combobox')
- ## list with possible values for modes
- self.mode_list = self.builder.get_object('mode_list')
- ## x-position
- self.position_x = self.builder.get_object('position_x')
- ## y-position
- self.position_y = self.builder.get_object('position_y')
- ## x-size
- self.size_x = self.builder.get_object('size_x')
- ## y-size
- self.size_y = self.builder.get_object('size_y')
- ## file input
- self.file_input_button = self.builder.get_object('file_input_button')
- ## sane input
- self.sane_input_button = self.builder.get_object('sane_input_button')
- ## choose file
- self.filechooserbutton = self.builder.get_object('filechooserbutton')
- ## device list
- self.device_treeview = self.builder.get_object('device_treeview')
- ## blacklisted device list
- self.blacklist_treeview = self.builder.get_object('blacklist_treeview')
- ## OK button
- self.device_chooser_button = self.builder.get_object('device_chooser_button')
- ## event box for image
- self.main_image_eventbox = self.builder.get_object('main_image_eventbox')
- ## event box for image window
- self.popup_image_eventbox = self.builder.get_object('popup_image_eventbox')
+ ## Initialize
+ def __init__(self):
+# # retrieve widgets
+# # main_window - main window
+# ## gladefile raw_path.glade
+ self.gladefile = raw_path + ".glade"
+ # open GTKBuilder
+ self.builder = gtk.Builder()
+ self.builder.add_from_file(self.gladefile)
+ # connect signal handlers
+ self.builder.connect_signals(self)
+
+ # get objects from glade/GTKBuilder
+ ## main window
+ self.main_window = self.builder.get_object('main_window')
+ self.main_window.set_icon_from_file(raw_path+".png")
+ ## notebok
+ self.notebook = self.builder.get_object('notebook')
+ ## image window
+ self.img_popup = self.builder.get_object('img_popup')
+ ## scan button
+ self.scan_button = self.builder.get_object('scan_button')
+ ## restart button
+ self.retry_button = self.builder.get_object('retry_button')
+ ## exit button
+ self.exit_button = self.builder.get_object('exit_button')
+ ## placement frame
+ self.placement_frame = self.builder.get_object('placement_frame')
+ ## image
+ self.main_image = self.builder.get_object('main_image')
+ ## image
+ self.popup_image = self.builder.get_object('popup_image')
+ ## output line
+ self.output = self.builder.get_object('output')
+ self.log_text = self.builder.get_object('log_text')
+ self.textbuffer = self.log_text.get_buffer()
+ self.device_info_text = self.builder.get_object('device_info_text')
+ ## progressbar
+ self.progressbar = self.builder.get_object('progressbar')
+ ## Orientation label
+ self.placement_label = self.builder.get_object('placement_label')
+ ## Orientation combobox
+ self.orientation = self.builder.get_object('orientation')
+ ## mode combobox
+ self.mode_combobox = self.builder.get_object('mode_combobox')
+ ## list with possible values for modes
+ self.mode_list = self.builder.get_object('mode_list')
+ ## x-position
+ self.position_x = self.builder.get_object('position_x')
+ ## y-position
+ self.position_y = self.builder.get_object('position_y')
+ ## x-size
+ self.size_x = self.builder.get_object('size_x')
+ ## y-size
+ self.size_y = self.builder.get_object('size_y')
+ ## file input
+ self.file_input_button = self.builder.get_object('file_input_button')
+ ## sane input
+ self.sane_input_button = self.builder.get_object('sane_input_button')
+ ## choose file
+ self.filechooserbutton = self.builder.get_object('filechooserbutton')
+ ## device list
+ self.device_treeview = self.builder.get_object('device_treeview')
+ ## blacklisted device list
+ self.blacklist_treeview = self.builder.get_object('blacklist_treeview')
+ ## OK button
+ self.device_chooser_button = self.builder.get_object('device_chooser_button')
+ ## event box for image
+ self.main_image_eventbox = self.builder.get_object('main_image_eventbox')
+ ## event box for image window
+ self.popup_image_eventbox = self.builder.get_object('popup_image_eventbox')
- # initiate orientation and position
- self.orientation.set_active(0)
- self.position_x.set_value(self.scan_koords[0])
- self.position_y.set_value(self.scan_koords[1])
- self.size_x.set_value(self.scan_koords[2])
- self.size_y.set_value(self.scan_koords[3])
-
-
- self.mode_combobox.set_active(0)
- if "gocr" not in pakages:
- self.mode_combobox.remove_text(1)
- self.mode_combobox.insert_text(1, "< not installed >")
- if "libdmtx" not in pakages:
- self.mode_combobox.remove_text(2)
- self.mode_combobox.insert_text(2, "< not installed >")
- if "pdf417decode" not in pakages:
- self.mode_combobox.remove_text(3)
- self.mode_combobox.insert_text(3, "< not installed >")
-
-
- # connect eventbox to close image window
- (self.new_width, self.new_height ) = (0,0)
-
- # set tooltips
- self.retry_button.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.")
- self.retry_button.set_visible(True)
- self.main_image.set_tooltip_text("Click for bigger image")
- self.popup_image.set_tooltip_text("Leave window to close")
-
-
- # redirect print
- self.logging = utils.logging(self.textbuffer)
- sys.stdout = self.logging
- sys.stderr = self.logging
-
-
- # initialize treeviews in Blacklist Manager
- BlacklistMgr.post_init(self.device_treeview, self.blacklist_treeview, local_path)
-
- print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------"
-
-
-
-
- # display window
- self.main_window.show()
+ # initiate orientation and position
+ self.orientation.set_active(0)
+ self.position_x.set_value(self.scan_koords[0])
+ self.position_y.set_value(self.scan_koords[1])
+ self.size_x.set_value(self.scan_koords[2])
+ self.size_y.set_value(self.scan_koords[3])
+
+
+ self.mode_combobox.set_active(0)
+ if "gocr" not in pakages:
+ self.mode_combobox.remove_text(1)
+ self.mode_combobox.insert_text(1, "< not installed >")
+ if "libdmtx" not in pakages:
+ self.mode_combobox.remove_text(2)
+ self.mode_combobox.insert_text(2, "< not installed >")
+ if "pdf417decode" not in pakages:
+ self.mode_combobox.remove_text(3)
+ self.mode_combobox.insert_text(3, "< not installed >")
+
+
+ # connect eventbox to close image window
+ (self.new_width, self.new_height ) = (0,0)
+
+ # set tooltips
+ self.retry_button.set_tooltip_text("Restart PyCodeOCR to search for a SANE device.")
+ self.retry_button.set_visible(True)
+ self.main_image.set_tooltip_text("Click for bigger image")
+ self.popup_image.set_tooltip_text("Leave window to close")
+
+
+ # redirect print
+ self.logging = utils.logging(self.textbuffer)
+ sys.stdout = self.logging
+ sys.stderr = self.logging
+
+
+ # initialize treeviews in Blacklist Manager
+ BlacklistMgr.post_init(self.device_treeview, self.blacklist_treeview, local_path)
+
+ print "---------",strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()),"----------"
- return
-
- ## Run gtk mainloop and with it THIS APP.
- def run(self):
- gtk.gdk.threads_init()
-
- self.device_chooser_event = threading.Event()
-
- ## initialize sane
- self.run_sane = utils.ocr.RunSANE(self.notebook, self.progress, self.device_chooser_button, BlacklistMgr,self.device_chooser_event,self.device_info_text)
- self.run_sane.start()
- # redirect print again to old textbuffer
- sys.stdout = self.logging
-
- gtk.main()
-
-
- def on_device_chooser_button_clicked(self, source=None):
- self.device_chooser_button.set_visible(False)
- self.device_chooser_event.set()
-
-
-
- ## set sensitivity of buttons the first time
- def init_sensitivity(self):
- # set sensitivity
- if self.run_sane.found_scanner:
- self.sane_input_button.set_active(True)
- self.sane_input_button.set_sensitive(True)
- else:
- self.file_input_button.set_active(True)
- self.sane_input_button.set_sensitive(False)
-
- # Try to set orientation and placement sensitive
- self.toggle_orientation_sensitive(True)
- self.toggle_placement_sensitive(True)
-
- ## toggle orientation sensitivity
- def toggle_orientation_sensitive(self, value):
- self.placement_label.set_sensitive(value)
- self.orientation.set_sensitive(value)
+
+ # display window
+ self.main_window.show()
- ## toggle placement sensitivity
- def toggle_placement_sensitive(self, value):
- if self.sane_input_button.get_active():
- self.placement_frame.set_sensitive(value)
- else:
- self.placement_frame.set_sensitive(False)
+ return
+
+ ## Run gtk mainloop and with it THIS APP.
+ def run(self):
+ gtk.gdk.threads_init()
+
+ self.device_chooser_event = threading.Event()
+
+ ## initialize sane
+ self.run_sane = utils.ocr.RunSANE(self.notebook, self.progress, self.device_chooser_button, BlacklistMgr,self.device_chooser_event,self.device_info_text)
+ self.run_sane.start()
+ # redirect print again to old textbuffer
+ sys.stdout = self.logging
+
+ gtk.main()
+
+
+ def on_device_chooser_button_clicked(self, source=None):
+ self.device_chooser_button.set_visible(False)
+ self.device_chooser_event.set()
+
+
+ ## set sensitivity of buttons the first time
+ def init_sensitivity(self):
+ # set sensitivity
+ if self.run_sane.found_scanner:
+ self.sane_input_button.set_active(True)
+ self.sane_input_button.set_sensitive(True)
+ else:
+ self.file_input_button.set_active(True)
+ self.sane_input_button.set_sensitive(False)
+
+ # Try to set orientation and placement sensitive
+ self.toggle_orientation_sensitive(True)
+ self.toggle_placement_sensitive(True)
+
+ ## toggle orientation sensitivity
+ def toggle_orientation_sensitive(self, value):
+ self.placement_label.set_sensitive(value)
+ self.orientation.set_sensitive(value)
+ ## toggle placement sensitivity
+ def toggle_placement_sensitive(self, value):
+ if self.sane_input_button.get_active():
+ self.placement_frame.set_sensitive(value)
+ else:
+ self.placement_frame.set_sensitive(False)
+ ## signals / glade callbacks
+ #
+ def on_pointer_motion(self, source=None, event=None):
+ pass
+# (x,y,state) = self.main_window.window.get_pointer()
+# (wxim, wyim ) = self.main_image.get_size_request()
+# if x > 16+(wxim-self.new_width)/2 and x < 16+(wxim+self.new_width)/2 and y > 75+(wyim-self.new_height)/2 and y < 75+(wyim+self.new_height)/2:
+# if not self.img_popup.get_visible():
+# self.on_main_image_eventbox_button_press_event()
+
+ def on_main_image_eventbox_button_press_event(self, source=None, event=None):
+ if self.img_popup.get_visible():
+ # clean-up
+ os.remove( self.image_file_big )
+ # hide window
+ self.img_popup.hide()
+ else:
+ # load original image
+ im1 = Image.open(self.imageFile)
+ # adjust width and height to your needs and keep ratio
+ (im_width, im_height) = im1.size #get image size
+ # get size of shown image
+ width = self.main_image.allocation.width
+ height = self.main_image.allocation.height
+
+ # make it bigger in window
+ # size should be at least 600
+ if max(width,height) < 300:
+ ratio = min(600/float(width),600/float(height))
+ width = ratio*width
+ height = ratio*height
+ # or 2x bigger
+ else:
+ width = 2*width
+ height = 2*height
+
+ ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio
+ new_width = int(im_width*ratio)
+ new_height = int(im_height*ratio)
+ # resize to fit popup window
+ im = im1.resize((new_width, new_height), Image.BILINEAR)
+ # save
+ self.image_file_big = self.temp+"06.jpg"
+ im.save( self.image_file_big )
+ # set image
+ self.popup_image.set_from_file( self.image_file_big )
+ # show window
+ self.img_popup.show()
- ## signals / glade callbacks
- #
- def on_pointer_motion(self, source=None, event=None):
- pass
-# (x,y,state) = self.main_window.window.get_pointer()
-# (wxim, wyim ) = self.main_image.get_size_request()
-# if x > 16+(wxim-self.new_width)/2 and x < 16+(wxim+self.new_width)/2 and y > 75+(wyim-self.new_height)/2 and y < 75+(wyim+self.new_height)/2:
-# if not self.img_popup.get_visible():
-# self.on_main_image_eventbox_button_press_event()
-
- def on_main_image_eventbox_button_press_event(self, source=None, event=None):
- if self.img_popup.get_visible():
- # clean-up
- os.remove( self.image_file_big )
- # hide window
- self.img_popup.hide()
- else:
- # load original image
- im1 = Image.open(self.imageFile)
- # adjust width and height to your needs and keep ratio
- (im_width, im_height) = im1.size #get image size
- # get size of shown image
- width = self.main_image.allocation.width
- height = self.main_image.allocation.height
-
- # make it bigger in window
- # size should be at least 600
- if max(width,height) < 300:
- ratio = min(600/float(width),600/float(height))
- width = ratio*width
- height = ratio*height
- # or 2x bigger
- else:
- width = 2*width
- height = 2*height
-
- ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio
- new_width = int(im_width*ratio)
- new_height = int(im_height*ratio)
- # resize to fit popup window
- im = im1.resize((new_width, new_height), Image.BILINEAR)
- # save
- self.image_file_big = self.temp+"06.jpg"
- im.save( self.image_file_big )
- # set image
- self.popup_image.set_from_file( self.image_file_big )
- # show window
- self.img_popup.show()
+
+ ## add device to blacklist
+ def blacklist_add(self, widget=None):
+ BlacklistMgr.blacklist_add()
+
+ ## remove device from blacklist
+ def blacklist_remove(self, widget=None):
+ BlacklistMgr.blacklist_remove()
+
+ ## one of the placement coordinates changed
+ def on_placement_value_changed(self, source=None, event=None):
+ self.scan_koords = (self.position_x.get_value(),self.position_y.get_value(),
+ self.size_x.get_value(),self.size_y.get_value())
-
- ## add device to blacklist
- def blacklist_add(self, widget=None):
- BlacklistMgr.blacklist_add()
-
- ## remove device from blacklist
- def blacklist_remove(self, widget=None):
- BlacklistMgr.blacklist_remove()
-
- ## one of the placement coordinates changed
- def on_placement_value_changed(self, source=None, event=None):
- self.scan_koords = (self.position_x.get_value(),self.position_y.get_value(),
- self.size_x.get_value(),self.size_y.get_value())
+ ## Orientation changed
+ def on_orientation_changed(self, source=None, event=None):
+ orient = self.orientation.get_model()[self.orientation.get_active()][0]
- ## Orientation changed
- def on_orientation_changed(self, source=None, event=None):
- orient = self.orientation.get_model()[self.orientation.get_active()][0]
+ self.position_x.set_value(std_scan_koords[orient][0][0])
+ self.position_y.set_value(std_scan_koords[orient][0][1])
+ self.size_x.set_value(std_scan_koords[orient][0][2])
+ self.size_y.set_value(std_scan_koords[orient][0][3])
- self.position_x.set_value(std_scan_koords[orient][0][0])
- self.position_y.set_value(std_scan_koords[orient][0][1])
- self.size_x.set_value(std_scan_koords[orient][0][2])
- self.size_y.set_value(std_scan_koords[orient][0][3])
+ self.mode = std_scan_koords[orient][1]
+
+ ## mode changed
+ def on_mode_changed(self, source=None):
+ op_mode = self.mode_combobox.get_active()
+ if (op_mode == self.MDE['invoices']):
+ self.toggle_placement_sensitive(True)
+ self.toggle_orientation_sensitive(True)
+ elif (op_mode == self.MDE['barcode']):
+ self.toggle_placement_sensitive(False)
+ self.toggle_orientation_sensitive(True)
+ elif (op_mode == self.MDE['DataMatrix']):
+ self.toggle_placement_sensitive(False)
+ self.toggle_orientation_sensitive(False)
+ elif (op_mode == self.MDE['PDF417']):
+ self.toggle_placement_sensitive(True)
+ self.toggle_orientation_sensitive(True)
- self.mode = std_scan_koords[orient][1]
-
- ## mode changed
- def on_mode_changed(self, source=None):
- op_mode = self.mode_combobox.get_active()
- if (op_mode == self.MDE['invoices']):
- self.toggle_placement_sensitive(True)
- self.toggle_orientation_sensitive(True)
- elif (op_mode == self.MDE['barcode']):
- self.toggle_placement_sensitive(False)
- self.toggle_orientation_sensitive(True)
- elif (op_mode == self.MDE['DataMatrix']):
- self.toggle_placement_sensitive(False)
- self.toggle_orientation_sensitive(False)
- elif (op_mode == self.MDE['PDF417']):
- self.toggle_placement_sensitive(True)
- self.toggle_orientation_sensitive(True)
+ ## ToggleButton: 'scan'/'stop'.
+ def on_scan_button_clicked(self, source=None, event=None, *a):
+ if self.scan_button.get_active(): # scan !
+ # test if we ask for a scanner, but there is none connected
+ if not self.run_sane.found_scanner and self.sane_input_button.get_active():
+ self.__stop = True
+ self.scan_button.set_active(False)
+ return
+
+ self.scan_button.set_label("stop")
+ self.__stop = False
- ## ToggleButton: 'scan'/'stop'.
- def on_scan_button_clicked(self, source=None, event=None, *a):
- if self.scan_button.get_active(): # scan !
- # test if we ask for a scanner, but there is none connected
- if not self.run_sane.found_scanner and self.sane_input_button.get_active():
- self.__stop = True
- self.scan_button.set_active(False)
- return
-
- self.scan_button.set_label("stop")
- self.__stop = False
+ self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color
+ self.refresh()
- self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color
- self.refresh()
+ for i in range(self.max_retry):
+ check = self.scancode()
+ if check or (check == None) or self.__stop: break
+ if self.__stop: return
- for i in range(self.max_retry):
- check = self.scancode()
- if check or (check == None) or self.__stop: break
- if self.__stop: return
+ self.output.modify_base(gtk.STATE_NORMAL, self.res_color[check]) # widget color
+ self.refresh()
- self.output.modify_base(gtk.STATE_NORMAL, self.res_color[check]) # widget color
- self.refresh()
+ self.__stop = True # other way around; to be able to decide if it was stopped or ended correctly
+ self.scan_button.set_active(False) # (since this triggers THIS function again)
+ else: # stop/abort !
+ self.scan_button.set_label("scan")
+ if self.__stop: return
+ self.__stop = True
- self.__stop = True # other way around; to be able to decide if it was stopped or ended correctly
- self.scan_button.set_active(False) # (since this triggers THIS function again)
- else: # stop/abort !
- self.scan_button.set_label("scan")
- if self.__stop: return
- self.__stop = True
+ self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color
+ self.progressbar.set_text("Stopped by user!")
+ self.refresh()
+ return
- self.output.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#FFFFFF")) # widget color
- self.progressbar.set_text("Stopped by user!")
- self.refresh()
- return
+ ## exit and restart
+ def on_retry_button_clicked(self, source=None, event=None):
+ self.device_chooser_event.clear()
+ self.run_sane.retry()
- ## exit and restart
- def on_retry_button_clicked(self, source=None, event=None):
- self.device_chooser_event.clear()
- self.run_sane.retry()
+ ## exit
+ def on_exit_button_clicked(self, source=None, event=None):
+ self.on_main_window_destroy()
- ## exit
- def on_exit_button_clicked(self, source=None, event=None):
- self.on_main_window_destroy()
+ ## press x-button on window
+ def on_main_window_destroy(self, source=None, event=None):
+ try:
+ os.remove( self.temp+"04.jpg" ) # clean-up
+ os.remove( self.image_file_small )
+ except:
+ pass
+ # exit
+ gtk.main_quit()
- ## press x-button on window
- def on_main_window_destroy(self, source=None, event=None):
- try:
- os.remove( self.temp+"04.jpg" ) # clean-up
- os.remove( self.image_file_small )
- except:
- pass
- # exit
- gtk.main_quit()
+ ## file selected
+ def on_filechooserbutton_file_set(self, source=None):
+ self.file_input_button.set_active(True)
+ self.inp_file = self.filechooserbutton.get_filename()
+ if not os.path.exists(self.inp_file):
+ self.progress(0., "File not found!")
+ return None
+ self.setimage(self.inp_file)
- ## file selected
- def on_filechooserbutton_file_set(self, source=None):
- self.file_input_button.set_active(True)
- self.inp_file = self.filechooserbutton.get_filename()
- if not os.path.exists(self.inp_file):
- self.progress(0., "File not found!")
- return None
- self.setimage(self.inp_file)
+ # helpers
+ #
+ ## Main scanning and number recognition procedure.
+ #
+ # @todo Put this function (may be as class with functions for each step) into utils::ocr
+ #
+ def scancode(self):
+ # Initialization of scanning process
+ # (0/7)
+ self.progress(0., "")
+ max_steps = 7
+ op_mode = self.mode_combobox.get_active()
+ source_mode = self.sane_input_button.get_active()
+ if (op_mode == self.MDE['invoices']): # 0: invoices (tesser)
+ self.on_placement_value_changed() # scan selected range
+ self.on_orientation_changed() # orientation mode
+ opt = { 'tmp_file': "02.tif",
+ 'recog_class': utils.RunExternal,
+ 'recog_cmd': self.cmd_tesser % (self.temp+"02", self.temp+"03"),
+ 'recog_error_msg': [ "Unable" ],
+ 'valid_code_len': self.valid_code_len,
+ 'resolution': 600, }
+ elif (op_mode == self.MDE['barcode']): # 1: barcode (gocr)
+ self.on_orientation_changed() # orientation mode
+ self.scan_koords = std_scan_koords["A4"][0]
+ #self.mode = std_scan_koords["A4"][1]
+ opt = { 'tmp_file': "02.pnm",
+ 'recog_class': utils.RunExternal,
+ 'recog_cmd': self.cmd_gocr % (self.temp+"02",),
+ 'recog_error_msg': [ "\nERROR pnm.c" ],
+ 'valid_code_len': [ 13, 10, 9 ],
+ 'resolution': 300, }
+ elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx)
+ #self.on_orientation_changed() # orientation mode
+ self.scan_koords = std_scan_koords["A4"][0]
+ self.mode = std_scan_koords["A4"][1]
+ #pydmtx recognition
+# opt = { 'tmp_file': "02.jpg", # some issues with recogition
+# 'recog_class': utils.RunLibdmtx, # .
+# 'recog_cmd': self.temp+"02.jpg", # of different file formats
+# 'recog_error_msg': [ None ], # .
+ #dmtxread recognition
+ opt = { 'tmp_file': "02.jpg", # some issues with recogition
+ 'recog_class': utils.RunExternal, # .
+ 'recog_cmd': "%s -v -D %s02.jpg"%(paths["dmtxread"],self.temp), # of different file formats
+ 'recog_error_msg': [ "error" ], # .
+ #opt = { 'tmp_file': "02.bmp", # and drawing/marking the
+ # 'recog_cmd': (self.temp+"02.bmp", [ None ], utils.ocr.RunLibdmtx), } # processed region(s)...
+ #opt = { 'tmp_file': "02.png", # (but this should work for 'tif')
+ # 'recog_cmd': (self.temp+"02.png", [ None ], utils.ocr.RunLibdmtx), } #
+ 'resolution': 150, }
+ elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine)
+ self.on_placement_value_changed() # scan selected range
+ self.on_orientation_changed() # orientation mode
+ opt = { 'tmp_file': "02.png",
+ 'recog_class': utils.RunExternal,
+ 'recog_cmd': self.cmd_pdf417dec % (self.temp+"02",),
+ 'recog_error_msg': [ "wine: cannot find", "pdf417decode.exe imagefile|string.txt|-i", "Decoding failed." ],
+ 'resolution': 300, }
- # helpers
- #
- ## Main scanning and number recognition procedure.
- #
- # @todo Put this function (may be as class with functions for each step) into utils::ocr
- #
- def scancode(self):
- # Initialization of scanning process
- # (0/7)
- self.progress(0., "")
- max_steps = 7
- op_mode = self.mode_combobox.get_active()
- source_mode = self.sane_input_button.get_active()
- if (op_mode == self.MDE['invoices']): # 0: invoices (tesser)
- self.on_placement_value_changed() # scan selected range
- self.on_orientation_changed() # orientation mode
- opt = { 'tmp_file': "02.tif",
- 'recog_class': utils.RunExternal,
- 'recog_cmd': self.cmd_tesser % (self.temp+"02", self.temp+"03"),
- 'recog_error_msg': [ "Unable" ],
- 'valid_code_len': self.valid_code_len,
- 'resolution': 600, }
- elif (op_mode == self.MDE['barcode']): # 1: barcode (gocr)
- self.on_orientation_changed() # orientation mode
- self.scan_koords = std_scan_koords["A4"][0]
- #self.mode = std_scan_koords["A4"][1]
- opt = { 'tmp_file': "02.pnm",
- 'recog_class': utils.RunExternal,
- 'recog_cmd': self.cmd_gocr % (self.temp+"02",),
- 'recog_error_msg': [ "\nERROR pnm.c" ],
- 'valid_code_len': [ 13, 10, 9 ],
- 'resolution': 300, }
- elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx)
- #self.on_orientation_changed() # orientation mode
- self.scan_koords = std_scan_koords["A4"][0]
- self.mode = std_scan_koords["A4"][1]
- #pydmtx recognition
-# opt = { 'tmp_file': "02.jpg", # some issues with recogition
-# 'recog_class': utils.RunLibdmtx, # .
-# 'recog_cmd': self.temp+"02.jpg", # of different file formats
-# 'recog_error_msg': [ None ], # .
- #dmtxread recognition
- opt = { 'tmp_file': "02.jpg", # some issues with recogition
- 'recog_class': utils.RunExternal, # .
- 'recog_cmd': "%s -v -D %s02.jpg"%(paths["dmtxread"],self.temp), # of different file formats
- 'recog_error_msg': [ "error" ], # .
-
- #opt = { 'tmp_file': "02.bmp", # and drawing/marking the
- # 'recog_cmd': (self.temp+"02.bmp", [ None ], utils.ocr.RunLibdmtx), } # processed region(s)...
- #opt = { 'tmp_file': "02.png", # (but this should work for 'tif')
- # 'recog_cmd': (self.temp+"02.png", [ None ], utils.ocr.RunLibdmtx), } #
- 'resolution': 150, }
- elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine)
- self.on_placement_value_changed() # scan selected range
- self.on_orientation_changed() # orientation mode
- opt = { 'tmp_file': "02.png",
- 'recog_class': utils.RunExternal,
- 'recog_cmd': self.cmd_pdf417dec % (self.temp+"02",),
- 'recog_error_msg': [ "wine: cannot find", "pdf417decode.exe imagefile|string.txt|-i", "Decoding failed." ],
- 'resolution': 300, }
+ #os.chdir(home_path) # (still needed?)
+ self.refresh()
+ if self.__stop: return
- #os.chdir(home_path) # (still needed?)
- self.refresh()
- if self.__stop: return
+ # Scaning and retrieving data OR reading from image file
+ # (tesseract has a direct python interface: http://code.google.com/p/pytesser/)
+ # (1/?)
+ if source_mode: # SANE scanning interface
+ self.progress(1./max_steps, "Scanning data...")
+ self.inp_file = self.temp+"01.tif"
+ #self.run_sane = utils.ocr.RunExternal(self.cmd_scan % ( self.scan_koords + (inp_file,) ), [ "no SANE devices found" ])
+ self.run_sane.post_init(self.scan_koords, self.inp_file) # utils.ocr.RunSANE().post_init(...) 2nd part of __init__(...)
+ self.run_sane.resolution = opt["resolution"]
+ if self.run_sane():
+ print self.run_sane.stderr
+ self.progress(0., self.run_sane.stderr)
+ return None
+ #del self.run_sane
+ else: # direct file input
+ self.progress(1./max_steps, "Reading image...")
+ #self.inp_file = self.filechooserbutton.get_filename()
+ #if not os.path.exists(self.inp_file):
+ # self.progress(0., "File not found!")
+ # return None
+ self.refresh()
+ if self.__stop: return
- # Scaning and retrieving data OR reading from image file
- # (tesseract has a direct python interface: http://code.google.com/p/pytesser/)
- # (1/?)
- if source_mode: # SANE scanning interface
- self.progress(1./max_steps, "Scanning data...")
- self.inp_file = self.temp+"01.tif"
- #self.run_sane = utils.ocr.RunExternal(self.cmd_scan % ( self.scan_koords + (inp_file,) ), [ "no SANE devices found" ])
- self.run_sane.post_init(self.scan_koords, self.inp_file) # utils.ocr.RunSANE().post_init(...) 2nd part of __init__(...)
- self.run_sane.resolution = opt["resolution"]
- if self.run_sane():
- print self.run_sane.stderr
- self.progress(0., self.run_sane.stderr)
- return None
- #del self.run_sane
- else: # direct file input
- self.progress(1./max_steps, "Reading image...")
- #self.inp_file = self.filechooserbutton.get_filename()
- #if not os.path.exists(self.inp_file):
- # self.progress(0., "File not found!")
- # return None
- self.refresh()
- if self.__stop: return
+ # Adjust and rotate the retrieved data
+ # (2/?)
+ self.progress(2./max_steps, "Adjusting image/picture data...")
+ mode = self.mode
+ try:
+ self.inp_file
+ except:
+ print "No input file. Please select input file or SANE Interface."
+ self.progress(0., "No input file. Please select input file or SANE Interface.")
+ return None
+ self.run_convert = utils.RunExternal(self.cmd_convert % (self.inp_file, mode, self.temp+opt['tmp_file']), error_msg=[ "convert: unable to open image" ])
+# self.run_convert = utils.RunMagickWand(inp_file, mode*90, self.temp+opt['tmp_file'])
+ # improve quality by using imagemagicks filter and conversion capabilities...
+ if self.run_convert():
+ self.progress(0., self.run_convert.stderr[:-1])
+ return None
+ #if (op_mode == self.MDE['invoices']): # 0: invoices
+ self.setimage( self.temp+opt['tmp_file'] )
+ if source_mode: # SANE scanning interface
+ os.remove(self.inp_file) # clean-up
+ del self.run_convert
+ self.refresh()
+ if self.__stop: return
- # Adjust and rotate the retrieved data
- # (2/?)
- self.progress(2./max_steps, "Adjusting image/picture data...")
- mode = self.mode
- try:
- self.inp_file
- except:
- print "No input file. Please select input file or SANE Interface."
- self.progress(0., "No input file. Please select input file or SANE Interface.")
- return None
- self.run_convert = utils.RunExternal(self.cmd_convert % (self.inp_file, mode, self.temp+opt['tmp_file']), error_msg=[ "convert: unable to open image" ])
-# self.run_convert = utils.RunMagickWand(inp_file, mode*90, self.temp+opt['tmp_file'])
- # improve quality by using imagemagicks filter and conversion capabilities...
- if self.run_convert():
- self.progress(0., self.run_convert.stderr[:-1])
- return None
- #if (op_mode == self.MDE['invoices']): # 0: invoices
- self.setimage( self.temp+opt['tmp_file'] )
- if source_mode: # SANE scanning interface
- os.remove(self.inp_file) # clean-up
- del self.run_convert
- self.refresh()
- if self.__stop: return
+ # Data character recognition / Barcode search and recognition
+ # (3/?)
+ self.progress(3./max_steps, "Recognition...")
+ self.run_recognition = opt['recog_class'](opt['recog_cmd'], error_msg=opt['recog_error_msg'])
+ if self.run_recognition():
+ # create debug info output
+ os.rename(self.temp+opt['tmp_file'], self.debug[0]+opt['tmp_file'][-4:])
+ #print "debug info output in '%s'" % self.debug[0]
- # Data character recognition / Barcode search and recognition
- # (3/?)
- self.progress(3./max_steps, "Recognition...")
- self.run_recognition = opt['recog_class'](opt['recog_cmd'], error_msg=opt['recog_error_msg'])
- if self.run_recognition():
- # create debug info output
- os.rename(self.temp+opt['tmp_file'], self.debug[0]+opt['tmp_file'][-4:])
- #print "debug info output in '%s'" % self.debug[0]
+ print self.run_recognition.stderr[:-1] + " Look at debug info!"
+ self.progress(0., self.run_recognition.stderr[:-1] + " Look at debug info!")
+ return None
- print self.run_recognition.stderr[:-1] + " Look at debug info!"
- self.progress(0., self.run_recognition.stderr[:-1] + " Look at debug info!")
- return None
+ if (op_mode == self.MDE['invoices']): # 0: invoices
+ # Simple workaround: The program simply continuous if no text is found at all
+ # and therefore no txt-file is generated.
+ if not os.path.exists(self.temp+"03.txt"):
+ origdata = "$"
+ data = "$"
+ else:
+ df = file(self.temp+"03.txt", "r")
+ data = df.read(-1)
+ df.close()
+ origdata = data
+ os.remove(self.temp+"03.txt") # clean-up
+
+ elif (op_mode == self.MDE['barcode']): # 1: barcode
+ # (cheap'n'ugly but working...)
+ raw_data = self.regex_gocr.search(self.run_recognition.stdout).groups()
+ raw_data = raw_data[0].strip()
+ raw_data = raw_data.replace("=", ":")
+ raw_data = raw_data.replace('" ', '", "')
+ raw_data = raw_data.replace(':"', '":"')
+ raw_data = '{ "' + raw_data + ' }'
+ data = eval( raw_data )
+ origdata = str(data)
+ elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx)
+ data = self.run_recognition.stdout
+ #pydmtx recognition
+# if self.run_recognition.count == 1:
+# data = self.run_recognition.message[0]
+# else:
+# data = str(self.run_recognition.message)
+# origdata = str(self.run_recognition.stats)
+ elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine)
+ data = self.run_recognition.stdout.split("\r\n")[1]
+ origdata = data
+ self.refresh()
+ if self.__stop: return
- if (op_mode == self.MDE['invoices']): # 0: invoices
- # Simple workaround: The program simply continuous if no text is found at all
- # and therefore no txt-file is generated.
- if not os.path.exists(self.temp+"03.txt"):
- origdata = "$"
- data = "$"
- else:
- df = file(self.temp+"03.txt", "r")
- data = df.read(-1)
- df.close()
- origdata = data
- os.remove(self.temp+"03.txt") # clean-up
-
- elif (op_mode == self.MDE['barcode']): # 1: barcode
- # (cheap'n'ugly but working...)
- raw_data = self.regex_gocr.search(self.run_recognition.stdout).groups()
- raw_data = raw_data[0].strip()
- raw_data = raw_data.replace("=", ":")
- raw_data = raw_data.replace('" ', '", "')
- raw_data = raw_data.replace(':"', '":"')
- raw_data = '{ "' + raw_data + ' }'
- data = eval( raw_data )
- origdata = str(data)
- elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx)
- data = self.run_recognition.stdout
- #pydmtx recognition
-# if self.run_recognition.count == 1:
-# data = self.run_recognition.message[0]
-# else:
-# data = str(self.run_recognition.message)
-# origdata = str(self.run_recognition.stats)
- elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine)
- data = self.run_recognition.stdout.split("\r\n")[1]
- origdata = data
- self.refresh()
- if self.__stop: return
+ # Data character correction
+ # (4/?)
+ if (op_mode == self.MDE['invoices']): # 0: invoices
+ self.progress(4./max_steps, "Character correction...")
+ print "*** " * 10
+ data = utils.ocr.char_correction(data)
+ self.refresh()
+ if self.__stop: return
- # Data character correction
- # (4/?)
- if (op_mode == self.MDE['invoices']): # 0: invoices
- self.progress(4./max_steps, "Character correction...")
- print "*** " * 10
- data = utils.ocr.char_correction(data)
- self.refresh()
- if self.__stop: return
+ # Data validity check
+ # (5/?)
+ self.progress(5./max_steps, "Check on validity...")
+ if (op_mode == self.MDE['invoices']): # 0: invoices
+ check = (not "?" in data) or (not "!" in data) # any unrecognized char in code?
+ check = check and ( len(data) in opt['valid_code_len'] ) # correct code len?
+ if check:
+ tmp = data[:-1].split(">")
+ amount = tmp[0]
+ tmp = tmp[1].split("+ ")
+ reference = tmp[0]
+ account = tmp[1]
+ # initialize modulo10 checksum
+ m10 = modulo10(amount, account, reference)
+ # check amount, account number and reference number
+ print "Amount: " + str(m10.amount) +" "+ str(m10.checksum_b)
+ print "Account number: " +str(m10.account) +" "+ str(m10.checksum_k)
+ print "Reference number: "+ str(m10.reference) +" "+ str(m10.checksum_r)
+
+ checksum = m10.checksum
+
+# if len(data) == 42:
+# # extract details
+# (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data)
+# print "Betrag: "+str(int(betrag[:-1])/100.)
+# print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:]
+# print "Referenznr: "+referenz
+# if check:
+# # modulo10 checksum for betrag
+# checknr = modulo10().run(betrag[:-1])
+# print "Checknr: ",checknr
+# checknr = ( checknr == int(betrag[-1]) )
+ elif (op_mode == self.MDE['barcode']): # 1: barcode
+ check = not (data['type'] == "unknown")
+ if check:
+ check = check and ( int(data['crc']) == 0 ) # CRC error check?
+ check = check and (float(data['error']) < 0.15) # recognizion errors?
+ print 'type:' +" "+ data['type']
+ print 'chars:' +" "+ data['chars']
+ print 'crc:' +" "+ data['crc']
+ print 'error:' +" "+ data['error']
+ data = data['code']
+ else:
+ data = "type: " + data['type']
+ #check = check and ( len(data) in opt['valid_code_len'] ) # correct code len?
+ elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx)
+ check = not (self.run_recognition.error == "error")
+ #pydmtx recognition
+# check = not self.run_recognition.error
+# if check:
+# print self.run_recognition.decode
+# print self.run_recognition.count
+# #print self.run_recognition.message
+# print self.run_recognition.stats
+
+ elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine)
+ check = not self.run_recognition.error
+ print data +" "+ str(len(data)) +" "+ str(check)
+ del self.run_recognition
+ self.refresh()
+ if self.__stop: return
- # Data validity check
- # (5/?)
- self.progress(5./max_steps, "Check on validity...")
- if (op_mode == self.MDE['invoices']): # 0: invoices
- check = (not "?" in data) or (not "!" in data) # any unrecognized char in code?
- check = check and ( len(data) in opt['valid_code_len'] ) # correct code len?
- if check:
- tmp = data[:-1].split(">")
- amount = tmp[0]
- tmp = tmp[1].split("+ ")
- reference = tmp[0]
- account = tmp[1]
- # initialize modulo10 checksum
- m10 = modulo10(amount, account, reference)
- # check amount, account number and reference number
- print "Amount: " + str(m10.amount) +" "+ str(m10.checksum_b)
- print "Account number: " +str(m10.account) +" "+ str(m10.checksum_k)
- print "Reference number: "+ str(m10.reference) +" "+ str(m10.checksum_r)
-
- checksum = m10.checksum
-
-# if len(data) == 42:
-# # extract details
-# (tmp, betrag, tmp, referenz, tmp, konto, tmp) = struct.unpack("2s11ss16s2s9ss",data)
-# print "Betrag: "+str(int(betrag[:-1])/100.)
-# print "Konto: "+konto[:2]+"-"+konto[3:-2]+"-"+konto[-2:]
-# print "Referenznr: "+referenz
-# if check:
-# # modulo10 checksum for betrag
-# checknr = modulo10().run(betrag[:-1])
-# print "Checknr: ",checknr
-# checknr = ( checknr == int(betrag[-1]) )
- elif (op_mode == self.MDE['barcode']): # 1: barcode
- check = not (data['type'] == "unknown")
- if check:
- check = check and ( int(data['crc']) == 0 ) # CRC error check?
- check = check and (float(data['error']) < 0.15) # recognizion errors?
- print 'type:' +" "+ data['type']
- print 'chars:' +" "+ data['chars']
- print 'crc:' +" "+ data['crc']
- print 'error:' +" "+ data['error']
- data = data['code']
- else:
- data = "type: " + data['type']
- #check = check and ( len(data) in opt['valid_code_len'] ) # correct code len?
- elif (op_mode == self.MDE['DataMatrix']): # 2: DataMatrix (libdmtx)
- check = not (self.run_recognition.error == "error")
- #pydmtx recognition
-# check = not self.run_recognition.error
-# if check:
-# print self.run_recognition.decode
-# print self.run_recognition.count
-# #print self.run_recognition.message
-# print self.run_recognition.stats
-
- elif (op_mode == self.MDE['PDF417']): # 3: PDF417 barcode (pdf417decode/wine)
- check = not self.run_recognition.error
- print data +" "+ str(len(data)) +" "+ str(check)
- del self.run_recognition
- self.refresh()
- if self.__stop: return
+ # Data final output
+ # (6/?)
+ self.progress(6./max_steps, "Final data output...")
+ if check:
+ os.remove(self.temp+opt['tmp_file']) # clean-up
- # Data final output
- # (6/?)
- self.progress(6./max_steps, "Final data output...")
- if check:
- os.remove(self.temp+opt['tmp_file']) # clean-up
+ self.output.set_text(data)
- self.output.set_text(data)
+ # get the clipboard
+ clipboard = gtk.clipboard_get()
+ # set the clipboard text data
+ clipboard.set_text(data)
+ # make our data available to other applications
+ clipboard.store()
+ #print "data sent to (gtk/gnome) clipboard"
+ if checksum:
+ self.progress(1., "Code recognized and sent to clipboard. Finished.")
+ else:
+ self.progress(1., "Code recognized and sent to clipboard, BUT checksum failed! CHECK code again! Finished.")
+ else:
+ # create debug info output
+ log = file(self.debug[1], "w")
+ for i in range(len(origdata)):
+ log.write(str( (origdata[i], ord(origdata[i])) ))
+ log.write("\n")
+ for i in range(len(data)):
+ log.write(str( (data[i], ord(data[i])) ))
+ log.close()
+ #print "debug info output in '%s'" % self.debug[1]
+ os.rename(self.temp+opt['tmp_file'], self.debug[0]+opt['tmp_file'][-4:])
+ #print "debug info output in '%s'" % self.debug[0]
- # get the clipboard
- clipboard = gtk.clipboard_get()
- # set the clipboard text data
- clipboard.set_text(data)
- # make our data available to other applications
- clipboard.store()
- #print "data sent to (gtk/gnome) clipboard"
- if checksum:
- self.progress(1., "Code recognized and sent to clipboard. Finished.")
- else:
- self.progress(1., "Code recognized and sent to clipboard, BUT checksum failed! CHECK code again! Finished.")
- else:
- # create debug info output
- log = file(self.debug[1], "w")
- for i in range(len(origdata)):
- log.write(str( (origdata[i], ord(origdata[i])) ))
- log.write("\n")
- for i in range(len(data)):
- log.write(str( (data[i], ord(data[i])) ))
- log.close()
- #print "debug info output in '%s'" % self.debug[1]
- os.rename(self.temp+opt['tmp_file'], self.debug[0]+opt['tmp_file'][-4:])
- #print "debug info output in '%s'" % self.debug[0]
+ self.progress(1., "Code could not be recognized correct. Look at debug info!")
+ self.refresh()
+ if self.__stop: return
- self.progress(1., "Code could not be recognized correct. Look at debug info!")
- self.refresh()
- if self.__stop: return
+ # Done
+ # (7/7)
+ return check
- # Done
- # (7/7)
- return check
+ ## Refresh window during running processes.
+ def refresh(self):
+ self.main_window.queue_draw()
+ time.sleep(0.1) # give also some time to the user... :)
+ while gtk.events_pending():
+ gtk.main_iteration()
- ## Refresh window during running processes.
- def refresh(self):
- self.main_window.queue_draw()
- time.sleep(0.1) # give also some time to the user... :)
- while gtk.events_pending():
- gtk.main_iteration()
+ ## Resize and set PIL image to gtk/gnome window.
+ # resize an image using the PIL image library
+ # tested with Python24 vegaseat 11oct2005
+ # open an image file (.bmp,.jpg,.png,.gif) you have in the working folder
+ # @see http://www.daniweb.com/code/snippet216637.html
+ # @see http://www.pythonware.com/products/pil/index.htm
+ def setimage(self, imageFile):
+ print imageFile[-3:]
+ if imageFile[-3:] in ["bmp","jpg","png","gif"]:
+ #already in right format
+ # original file name
+ self.imageFile = imageFile
+ # load file
+ im1 = Image.open(self.imageFile)
+ else:
+ #convert Image
+ self.run_convert = utils.RunExternal(self.cmd_convert % (imageFile, 0, self.temp+"04.jpg"), error_msg=[ "convert: unable to open image" ])
+ if self.run_convert():
+ self.progress(0., self.run_convert.stderr[:-1])
+ return None
+ # original filename
+ self.imageFile = self.temp+"04.jpg"
+ # load file
+ im1 = Image.open(self.imageFile)
+
+ # adjust width and height to your needs and keep ratio
+ (im_width, im_height) = im1.size #get image size
+ #get needed size
+ width = self.main_image.allocation.width
+ height = self.main_image.allocation.height
+ ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio
+ self.new_width = int(im_width*ratio)
+ self.new_height = int(im_height*ratio)
+
+ # use one of these filter options to resize the image
+
+ #im = im1.resize((new_width, new_height), Image.NEAREST) # use nearest neighbour
+ im = im1.resize((self.new_width, self.new_height), Image.BILINEAR) # linear interpolation in a 2x2 environment
+ #im = im1.resize((new_width, new_height), Image.BICUBIC) # cubic spline interpolation in a 4x4 environment
+ #im = im1.resize((new_width, new_height), Image.ANTIALIAS) # best down-sizing filter
+ #ext = ".jpg"
+
+ # set image preview
+ self.image_file_small = self.temp+"05.jpg"
+ im.save( self.image_file_small )
+ self.main_image.set_from_file( self.image_file_small )
- ## Resize and set PIL image to gtk/gnome window.
- # resize an image using the PIL image library
- # tested with Python24 vegaseat 11oct2005
- # open an image file (.bmp,.jpg,.png,.gif) you have in the working folder
- # @see http://www.daniweb.com/code/snippet216637.html
- # @see http://www.pythonware.com/products/pil/index.htm
- def setimage(self, imageFile):
- print imageFile[-3:]
- if imageFile[-3:] in ["bmp","jpg","png","gif"]:
- #already in right format
- # original file name
- self.imageFile = imageFile
- # load file
- im1 = Image.open(self.imageFile)
- else:
- #convert Image
- self.run_convert = utils.RunExternal(self.cmd_convert % (imageFile, 0, self.temp+"04.jpg"), error_msg=[ "convert: unable to open image" ])
- if self.run_convert():
- self.progress(0., self.run_convert.stderr[:-1])
- return None
- # original filename
- self.imageFile = self.temp+"04.jpg"
- # load file
- im1 = Image.open(self.imageFile)
-
- # adjust width and height to your needs and keep ratio
- (im_width, im_height) = im1.size #get image size
- #get needed size
- width = self.main_image.allocation.width
- height = self.main_image.allocation.height
- ratio = min(float(width)/im_width,float(height)/im_height) #calculate resizing ratio
- self.new_width = int(im_width*ratio)
- self.new_height = int(im_height*ratio)
-
- # use one of these filter options to resize the image
-
- #im = im1.resize((new_width, new_height), Image.NEAREST) # use nearest neighbour
- im = im1.resize((self.new_width, self.new_height), Image.BILINEAR) # linear interpolation in a 2x2 environment
- #im = im1.resize((new_width, new_heigh...
[truncated message content] |