def __init__(self, main_window, page_data, ocr_engines): super(ImageReviewer, self).__init__() self.configuration_manager = ConfigurationManager() self.main_window = main_window self.path_to_image = page_data.image_path self.text_box_fill_color = (94, 156, 235, 150) self.box_stroke_color = (94, 156, 235, 250) self.image_box_fill_color = (0, 183, 0, 150) self.selectable_boxes_area = SelectableBoxesArea(self.path_to_image) self.selectable_boxes_area.connect('selected_box', self.selectedBox) self.selectable_boxes_area.connect('removed_box', self.removedBox) self.selectable_boxes_area.connect('updated_box', self.updatedBox) self.selectable_boxes_area.connect('dragged_box', self.updatedBoxBounds) self.selectable_boxes_area.connect('deselected_box', self.deselectedBoxCb) self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.set_position(500) self.show() self.ocr_engines = ocr_engines self.editor = Editor(self.image_pixbuf, self.ocr_engines, self) self.boxes_dict = {} selectable_boxes_scrolled_window = gtk.ScrolledWindow() selectable_boxes_scrolled_window.get_accessible().set_name( _('Selectable areas')) selectable_boxes_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) selectable_boxes_scrolled_window.add(self.selectable_boxes_area) self.selectable_boxes_area.show() selectable_boxes_scrolled_window.show() self.pack1(selectable_boxes_scrolled_window, True, False) self.pack2(self.editor.box_editor, True, False) self.page = page_data self.updatePageData(self.page) selectable_boxes_scrolled_window.connect_after("size-allocate", self.zoomFitCb)
def __init__(self, path_to_image, ocr_engines): self.path_to_image = path_to_image self.text_box_fill_color = (94, 156, 235, 150) self.text_box_stroke_color = (94, 156, 235, 250) self.image_box_fill_color = (0, 183, 0, 150) self.image_box_stroke_color = (94, 156, 235, 250) self.selectable_boxes_area = SelectableBoxesArea(self.path_to_image) self.selectable_boxes_area.connect('selected_box', self.selectedBox) self.selectable_boxes_area.connect('removed_box', self.removedBox) self.selectable_boxes_area.connect('updated_box', self.updatedBox) self.selectable_boxes_area.connect('dragged_box', self.updatedBoxBounds) self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.reviewer_area = gtk.HPaned() self.reviewer_area.set_position(500) self.reviewer_area.show() self.boxeditor_notebook = gtk.Notebook() self.boxeditor_notebook.set_show_tabs(False) self.boxeditor_notebook.set_show_border(False) self.boxeditor_notebook.show() selectable_boxes_scrolled_window = gtk.ScrolledWindow() selectable_boxes_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) selectable_boxes_scrolled_window.add(self.selectable_boxes_area) self.selectable_boxes_area.show() selectable_boxes_scrolled_window.show() self.reviewer_area.pack1(selectable_boxes_scrolled_window, True, False) self.reviewer_area.pack2(self.boxeditor_notebook, True, False) self.ocr_engines = ocr_engines self.editor_list = [] self.page = PageData(self.path_to_image) selectable_boxes_scrolled_window.connect_after("size-allocate", self.zoomFitCb)
class ImageReviewer: def __init__(self, path_to_image, ocr_engines): self.path_to_image = path_to_image self.text_box_fill_color = (94, 156, 235, 150) self.text_box_stroke_color = (94, 156, 235, 250) self.image_box_fill_color = (0, 183, 0, 150) self.image_box_stroke_color = (94, 156, 235, 250) self.selectable_boxes_area = SelectableBoxesArea(self.path_to_image) self.selectable_boxes_area.connect('selected_box', self.selectedBox) self.selectable_boxes_area.connect('removed_box', self.removedBox) self.selectable_boxes_area.connect('updated_box', self.updatedBox) self.selectable_boxes_area.connect('dragged_box', self.updatedBoxBounds) self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.reviewer_area = gtk.HPaned() self.reviewer_area.set_position(500) self.reviewer_area.show() self.boxeditor_notebook = gtk.Notebook() self.boxeditor_notebook.set_show_tabs(False) self.boxeditor_notebook.set_show_border(False) self.boxeditor_notebook.show() selectable_boxes_scrolled_window = gtk.ScrolledWindow() selectable_boxes_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) selectable_boxes_scrolled_window.add(self.selectable_boxes_area) self.selectable_boxes_area.show() selectable_boxes_scrolled_window.show() self.reviewer_area.pack1(selectable_boxes_scrolled_window, True, False) self.reviewer_area.pack2(self.boxeditor_notebook, True, False) self.ocr_engines = ocr_engines self.editor_list = [] self.page = PageData(self.path_to_image) selectable_boxes_scrolled_window.connect_after("size-allocate", self.zoomFitCb) def setTextFillColor(self, color): self.text_box_fill_color = color self.selectable_boxes_area.setAreaFillRgba(self.text_box_fill_color) def setTextStrokeColor(self, color): self.text_box_stroke_color = color self.selectable_boxes_area.setAreaStrokeRgba( self.text_box_stroke_color) def setImageFillColor(self, color): self.image_box_fill_color = color def setImageStrokeColor(self, color): self.image_box_stroke_color = color def addBoxEditor(self, box): editor = Editor(box, self.image_pixbuf, self.ocr_engines, self) self.editor_list.append(editor) self.boxeditor_notebook.append_page(editor.box_editor) return editor def selectedBox(self, widget, box): page_num = self.__getPageNumFromBox(box) if page_num != -1: self.boxeditor_notebook.set_current_page(page_num) else: num_boxes = self.boxeditor_notebook.get_n_pages() self.addBoxEditor(box) self.boxeditor_notebook.set_current_page(num_boxes) def updatedBox(self, widget, box): for editor in self.editor_list: if editor.box == box: editor.update(box) def updatedBoxBounds(self, widget, box): for editor in self.editor_list: if editor.box == box: editor.updateBounds(box) def removedBox(self, widget, box): for i in xrange(len(self.editor_list)): editor = self.editor_list[i] if editor.box == box: page_num = self.boxeditor_notebook.page_num(editor.box_editor) self.boxeditor_notebook.remove_page(page_num) del self.editor_list[i] return True return False def __getPageNumFromBox(self, box): for editor in self.editor_list: if editor.box == box: return self.boxeditor_notebook.page_num(editor.box_editor) return -1 def applyTextColors(self): self.selectable_boxes_area.fill_color_rgba = self.text_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.text_box_stroke_color def applyImageColors(self): self.selectable_boxes_area.fill_color_rgba = self.image_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.image_box_stroke_color def addNewEditorsToAllBoxes(self): self.editor_list = [] boxes = self.selectable_boxes_area.getAllAreas() for box in boxes: self.addBoxEditor(box) def performOcrForAllEditors(self, engine=None): for editor in self.editor_list: editor.performOcr(engine) editor.performClassification(engine) if editor.box_editor.getType() == IMAGE_TYPE: editor.box_editor.setText('') def __getAllDataBoxes(self): boxes = [] for editor in self.editor_list: editor.setDataBox() data_box = editor.data_box boxes.append((data_box.y, data_box)) boxes.sort() boxes_sorted = [] for y, box in boxes: boxes_sorted.append(box) boxes = boxes_sorted return boxes def getPageData(self): self.page.data_boxes = self.__getAllDataBoxes() return self.page def updatePageData(self, page_data): self.page = page_data for data_box in self.page.data_boxes: self.addDataBox(data_box) def addDataBox(self, data_box): dimensions = (int(data_box.x), int(data_box.y), int(data_box.width), int(data_box.height)) box = self.selectable_boxes_area.addArea(dimensions) editor = self.addBoxEditor(box) editor.box = box editor.updateDataBox(data_box) def updateBackgroundImage(self, image_path): self.path_to_image = image_path self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.selectable_boxes_area.setBackgroundImage(self.path_to_image) def updateBoxesColors(self): for editor in self.editor_list: editor.updateBoxColor() def zoomFitCb(self, widget, data): self.zoomFit() widget.disconnect_by_func(self.zoomFitCb) def zoomFit(self): parent = self.selectable_boxes_area.get_parent() parent_height, parent_width = parent.allocation.height, parent.allocation.width image_height, image_width = self.selectable_boxes_area.getImageSize() changed = False if image_height > parent_height: image_height = parent_height / image_height changed = True if image_width > parent_width: image_width = parent_width / image_width changed = True if changed: self.selectable_boxes_area.zoom(min(image_height, image_width), False)
class ImageReviewer(gtk.HPaned): def __init__(self, main_window, page_data, ocr_engines): super(ImageReviewer, self).__init__() self.configuration_manager = ConfigurationManager() self.main_window = main_window self.path_to_image = page_data.image_path self.text_box_fill_color = (94, 156, 235, 150) self.box_stroke_color = (94, 156, 235, 250) self.image_box_fill_color = (0, 183, 0, 150) self.selectable_boxes_area = SelectableBoxesArea(self.path_to_image) self.selectable_boxes_area.connect('selected_box', self.selectedBox) self.selectable_boxes_area.connect('removed_box', self.removedBox) self.selectable_boxes_area.connect('updated_box', self.updatedBox) self.selectable_boxes_area.connect('dragged_box', self.updatedBoxBounds) self.selectable_boxes_area.connect('deselected_box', self.deselectedBoxCb) self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.set_position(500) self.show() self.ocr_engines = ocr_engines self.editor = Editor(self.image_pixbuf, self.ocr_engines, self) self.boxes_dict = {} selectable_boxes_scrolled_window = gtk.ScrolledWindow() selectable_boxes_scrolled_window.get_accessible().set_name( _('Selectable areas')) selectable_boxes_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) selectable_boxes_scrolled_window.add(self.selectable_boxes_area) self.selectable_boxes_area.show() selectable_boxes_scrolled_window.show() self.pack1(selectable_boxes_scrolled_window, True, False) self.pack2(self.editor.box_editor, True, False) self.page = page_data self.updatePageData(self.page) selectable_boxes_scrolled_window.connect_after("size-allocate", self.zoomFitCb) def setTextFillColor(self, color): self.text_box_fill_color = color self.selectable_boxes_area.setAreaFillRgba(self.text_box_fill_color) def setBoxesStrokeColor(self, color): self.box_stroke_color = color self.selectable_boxes_area.setAreaStrokeRgba(self.box_stroke_color) def setImageFillColor(self, color): self.image_box_fill_color = color def addBoxEditor(self, box, data_box=None): if not data_box: data_box = DataBox() data_box.updateBoundsFromBox(box) self.boxes_dict[box] = data_box self.editor.setBoxes(box, data_box) def selectedBox(self, widget, box): data_box = self.boxes_dict.get(box) if data_box: self.editor.setBoxes(box, data_box) else: self.addBoxEditor(box) self.updateMainWindow() def deselectedBoxCb(self, widget, box): self.updateMainWindow() def updatedBox(self, widget, box): if self.editor.box == box: self.editor.update(box) def updatedBoxBounds(self, widget, box): if self.editor.box == box: self.editor.data_box.updateBoundsFromBox(box) def removedBox(self, widget, box): self.updateMainWindow() if not self.boxes_dict.has_key(box): return False del self.boxes_dict[box] if self.editor.box == box: self.editor.updateDataBox(None) self.editor.box = None self.selectable_boxes_area.selectNextArea() return False def clear(self): self.selectable_boxes_area.clearAreas() self.editor.updateDataBox(None) self.editor.box = None self.boxes_dict.clear() def applyTextColors(self): self.selectable_boxes_area.fill_color_rgba = self.text_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.box_stroke_color def applyImageColors(self): self.selectable_boxes_area.fill_color_rgba = self.image_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.box_stroke_color def addNewEditorsToAllBoxes(self): self.editor_list = [] boxes = self.selectable_boxes_area.getAllAreas() for box in boxes: self.addBoxEditor(box) def performOcrForSelectedBoxes(self): selected_boxes = self.selectable_boxes_area.getSelectedAreas() configured_engine = None for engine, path in self.ocr_engines: if engine.name == self.configuration_manager.favorite_engine: configured_engine = engine break if not configured_engine: return for box in selected_boxes: data_box = self.boxes_dict[box] self.performOcrForDataBox(data_box, engine) self.editor.updateDataBox(self.editor.data_box) self.updateMainWindow() def performOcrForDataBox(self, data_box, engine): pixbuf_width = self.image_pixbuf.get_width() pixbuf_height = self.image_pixbuf.get_height() subpixbuf = self.image_pixbuf.subpixbuf( data_box.getX(), data_box.getY(), min(data_box.getWidth(), pixbuf_width), min(data_box.getHeight(), pixbuf_height)) image = graphics.convertPixbufToImage(subpixbuf) layout_analysis = LayoutAnalysis( engine, clean_text=self.configuration_manager.clean_text) text = layout_analysis.readImage(image) data_box.setText(text) self.main_window.copy_to_clipboard_menu.set_sensitive(True) self.main_window.spellchecker_menu.set_sensitive(True) debug('Finished reading') text_size = layout_analysis.getTextSizeFromImage( image, self.page.resolution[1]) if text_size: data_box.setFontSize(text_size) def getTextFromBoxes(self, boxes): text = '' #@todo: Implement a proper way to get the boxes # in reading order boxes.reverse() self.editor.saveDataBox() if boxes: text = self.page.getTextFromBoxes( [self.boxes_dict.get(box) for box in boxes]) else: if self.editor.box_editor.getType() == TEXT_TYPE: text = self.box_editor.getText() return text def copyTextToClipboard(self): selected_boxes = self.selectable_boxes_area.getSelectedAreas() text = self.getTextFromBoxes(selected_boxes) gtk.Clipboard().set_text(text) def getAllText(self): boxes = self.selectable_boxes_area.getAllAreas() return self.getTextFromBoxes(boxes) def __getAllDataBoxes(self): boxes = [] for data_box in self.boxes_dict.values(): boxes.append((data_box.y, data_box)) boxes.sort() boxes_sorted = [] for y, box in boxes: boxes_sorted.append(box) boxes = boxes_sorted return boxes def savePageData(self): self.editor.saveDataBox() self.page.data_boxes = self.__getAllDataBoxes() return self.page def updatePageData(self, page_data): self.page = page_data for data_box in self.page.data_boxes: self.addDataBox(data_box) def addDataBox(self, data_box): dimensions = (int(data_box.x), int(data_box.y), int(data_box.width), int(data_box.height)) box = self.selectable_boxes_area.addArea(dimensions) self.addBoxEditor(box, data_box) def updateBackgroundImage(self, image_path): self.path_to_image = self.page.image_path = image_path if not os.path.exists(self.path_to_image): return try: self.image_pixbuf = gtk.gdk.pixbuf_new_from_file( self.path_to_image) except Exception, exception: debug(exception.message) return self.selectable_boxes_area.setBackgroundImage(self.path_to_image)
class ImageReviewer(gtk.HPaned): def __init__(self, main_window, page_data, ocr_engines): super(ImageReviewer, self).__init__() self.configuration_manager = ConfigurationManager() self.main_window = main_window self.path_to_image = page_data.image_path self.text_box_fill_color = (94, 156, 235, 150) self.box_stroke_color = (94, 156, 235, 250) self.image_box_fill_color = (0, 183, 0, 150) self.selectable_boxes_area = SelectableBoxesArea(self.path_to_image) self.selectable_boxes_area.connect('selected_box', self.selectedBox) self.selectable_boxes_area.connect('removed_box', self.removedBox) self.selectable_boxes_area.connect('updated_box', self.updatedBox) self.selectable_boxes_area.connect('dragged_box', self.updatedBoxBounds) self.selectable_boxes_area.connect('deselected_box', self.deselectedBoxCb) self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.set_position(500) self.show() self.ocr_engines = ocr_engines self.editor = Editor(self.image_pixbuf, self.ocr_engines, self) self.boxes_dict = {} selectable_boxes_scrolled_window = gtk.ScrolledWindow() selectable_boxes_scrolled_window.get_accessible().set_name( _('Selectable areas')) selectable_boxes_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) selectable_boxes_scrolled_window.add(self.selectable_boxes_area) self.selectable_boxes_area.show() selectable_boxes_scrolled_window.show() self.pack1(selectable_boxes_scrolled_window, True, False) self.pack2(self.editor.box_editor, True, False) self.page = page_data self.updatePageData(self.page) selectable_boxes_scrolled_window.connect_after("size-allocate", self.zoomFitCb) def setTextFillColor(self, color): self.text_box_fill_color = color self.selectable_boxes_area.setAreaFillRgba(self.text_box_fill_color) def setBoxesStrokeColor(self, color): self.box_stroke_color = color self.selectable_boxes_area.setAreaStrokeRgba(self.box_stroke_color) def setImageFillColor(self, color): self.image_box_fill_color = color def addBoxEditor(self, box, data_box = None): if not data_box: data_box = DataBox() data_box.updateBoundsFromBox(box) self.boxes_dict[box] = data_box self.editor.setBoxes(box, data_box) def selectedBox(self, widget, box): data_box = self.boxes_dict.get(box) if data_box: self.editor.setBoxes(box, data_box) else: self.addBoxEditor(box) self.updateMainWindow() def deselectedBoxCb(self, widget, box): self.updateMainWindow() def updatedBox(self, widget, box): if self.editor.box == box: self.editor.update(box) def updatedBoxBounds(self, widget, box): if self.editor.box == box: self.editor.data_box.updateBoundsFromBox(box) def removedBox(self, widget, box): self.updateMainWindow() if not self.boxes_dict.has_key(box): return False del self.boxes_dict[box] if self.editor.box == box: self.editor.updateDataBox(None) self.editor.box = None self.selectable_boxes_area.selectNextArea() return False def clear(self): self.selectable_boxes_area.clearAreas() self.editor.updateDataBox(None) self.editor.box = None self.boxes_dict.clear() def applyTextColors(self): self.selectable_boxes_area.fill_color_rgba = self.text_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.box_stroke_color def applyImageColors(self): self.selectable_boxes_area.fill_color_rgba = self.image_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.box_stroke_color def addNewEditorsToAllBoxes(self): self.editor_list = [] boxes = self.selectable_boxes_area.getAllAreas() for box in boxes: self.addBoxEditor(box) def performOcrForSelectedBoxes(self): selected_boxes = self.selectable_boxes_area.getSelectedAreas() configured_engine = None for engine, path in self.ocr_engines: if engine.name == self.configuration_manager.favorite_engine: configured_engine = engine break if not configured_engine: return for box in selected_boxes: data_box = self.boxes_dict[box] self.performOcrForDataBox(data_box, engine) self.editor.updateDataBox(self.editor.data_box) self.updateMainWindow() def performOcrForDataBox(self, data_box, engine): pixbuf_width = self.image_pixbuf.get_width() pixbuf_height = self.image_pixbuf.get_height() subpixbuf = self.image_pixbuf.subpixbuf(data_box.getX(), data_box.getY(), min(data_box.getWidth(), pixbuf_width), min(data_box.getHeight(), pixbuf_height)) image = graphics.convertPixbufToImage(subpixbuf) layout_analysis = LayoutAnalysis(engine, clean_text = self.configuration_manager.clean_text) text = layout_analysis.readImage(image) data_box.setText(text) self.main_window.copy_to_clipboard_menu.set_sensitive(True) self.main_window.spellchecker_menu.set_sensitive(True) debug('Finished reading') text_size = layout_analysis.getTextSizeFromImage(image, self.page.resolution[1]) if text_size: data_box.setFontSize(text_size) def getTextFromBoxes(self, boxes): text = '' boxes.reverse() self.editor.saveDataBox() if boxes: text = getTextFromBoxes([self.boxes_dict.get(box) for box in boxes]) else: if self.editor.box_editor.getType() == TEXT_TYPE: text = self.box_editor.getText() return text def copyTextToClipboard(self): selected_boxes = self.selectable_boxes_area.getSelectedAreas() text = self.getTextFromBoxes(selected_boxes) gtk.Clipboard().set_text(text) def getAllText(self): boxes = self.selectable_boxes_area.getAllAreas() return self.getTextFromBoxes(boxes) def __getAllDataBoxes(self): boxes = [] for data_box in self.boxes_dict.values(): boxes.append((data_box.y, data_box)) boxes.sort() boxes_sorted = [] for y, box in boxes: boxes_sorted.append(box) boxes = boxes_sorted return boxes def savePageData(self): self.editor.saveDataBox() self.page.data_boxes = self.__getAllDataBoxes() return self.page def updatePageData(self, page_data): self.page = page_data for data_box in self.page.data_boxes: self.addDataBox(data_box) def addDataBox(self, data_box): dimensions = (int(data_box.x), int(data_box.y), int(data_box.width), int(data_box.height)) box = self.selectable_boxes_area.addArea(dimensions) self.addBoxEditor(box, data_box) def updateBackgroundImage(self, image_path): self.path_to_image = self.page.image_path = image_path if not os.path.exists(self.path_to_image): return try: self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) except Exception, exception: debug(exception.message) return self.selectable_boxes_area.setBackgroundImage(self.path_to_image)
class ImageReviewer: def __init__(self, path_to_image, ocr_engines): self.path_to_image = path_to_image self.text_box_fill_color = (94, 156, 235, 150) self.text_box_stroke_color = (94, 156, 235, 250) self.image_box_fill_color = (0, 183, 0, 150) self.image_box_stroke_color = (94, 156, 235, 250) self.selectable_boxes_area = SelectableBoxesArea(self.path_to_image) self.selectable_boxes_area.connect('selected_box', self.selectedBox) self.selectable_boxes_area.connect('removed_box', self.removedBox) self.selectable_boxes_area.connect('updated_box', self.updatedBox) self.selectable_boxes_area.connect('dragged_box', self.updatedBoxBounds) self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.reviewer_area = gtk.HPaned() self.reviewer_area.set_position(500) self.reviewer_area.show() self.boxeditor_notebook = gtk.Notebook() self.boxeditor_notebook.set_show_tabs(False) self.boxeditor_notebook.set_show_border(False) self.boxeditor_notebook.show() selectable_boxes_scrolled_window = gtk.ScrolledWindow() selectable_boxes_scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) selectable_boxes_scrolled_window.add(self.selectable_boxes_area) self.selectable_boxes_area.show() selectable_boxes_scrolled_window.show() self.reviewer_area.pack1(selectable_boxes_scrolled_window, True, False) self.reviewer_area.pack2(self.boxeditor_notebook, True, False) self.ocr_engines = ocr_engines self.editor_list = [] self.page = PageData(self.path_to_image) selectable_boxes_scrolled_window.connect_after("size-allocate", self.zoomFitCb) def setTextFillColor(self, color): self.text_box_fill_color = color self.selectable_boxes_area.setAreaFillRgba(self.text_box_fill_color) def setTextStrokeColor(self, color): self.text_box_stroke_color = color self.selectable_boxes_area.setAreaStrokeRgba(self.text_box_stroke_color) def setImageFillColor(self, color): self.image_box_fill_color = color def setImageStrokeColor(self, color): self.image_box_stroke_color = color def addBoxEditor(self, box): editor = Editor(box, self.image_pixbuf, self.ocr_engines, self) self.editor_list.append(editor) self.boxeditor_notebook.append_page(editor.box_editor) return editor def selectedBox(self, widget, box): page_num = self.__getPageNumFromBox(box) if page_num != -1: self.boxeditor_notebook.set_current_page(page_num) else: num_boxes = self.boxeditor_notebook.get_n_pages() self.addBoxEditor(box) self.boxeditor_notebook.set_current_page(num_boxes) def updatedBox(self, widget, box): for editor in self.editor_list: if editor.box == box: editor.update(box) def updatedBoxBounds(self, widget, box): for editor in self.editor_list: if editor.box == box: editor.updateBounds(box) def removedBox(self, widget, box): for i in xrange(len(self.editor_list)): editor = self.editor_list[i] if editor.box == box: page_num = self.boxeditor_notebook.page_num(editor.box_editor) self.boxeditor_notebook.remove_page(page_num) del self.editor_list[i] return True return False def __getPageNumFromBox(self, box): for editor in self.editor_list: if editor.box == box: return self.boxeditor_notebook.page_num(editor.box_editor) return -1 def applyTextColors(self): self.selectable_boxes_area.fill_color_rgba = self.text_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.text_box_stroke_color def applyImageColors(self): self.selectable_boxes_area.fill_color_rgba = self.image_box_fill_color self.selectable_boxes_area.stroke_color_rgba = self.image_box_stroke_color def addNewEditorsToAllBoxes(self): self.editor_list = [] boxes = self.selectable_boxes_area.getAllAreas() for box in boxes: self.addBoxEditor(box) def performOcrForAllEditors(self, engine = None): for editor in self.editor_list: editor.performOcr(engine) editor.performClassification(engine) if editor.box_editor.getType() == IMAGE_TYPE: editor.box_editor.setText('') def __getAllDataBoxes(self): boxes = [] for editor in self.editor_list: editor.setDataBox() data_box = editor.data_box boxes.append((data_box.y, data_box)) boxes.sort() boxes_sorted = [] for y, box in boxes: boxes_sorted.append(box) boxes = boxes_sorted return boxes def getPageData(self): self.page.data_boxes = self.__getAllDataBoxes() return self.page def updatePageData(self, page_data): self.page = page_data for data_box in self.page.data_boxes: self.addDataBox(data_box) def addDataBox(self, data_box): dimensions = (int(data_box.x), int(data_box.y), int(data_box.width), int(data_box.height)) box = self.selectable_boxes_area.addArea(dimensions) editor = self.addBoxEditor(box) editor.box = box editor.updateDataBox(data_box) def updateBackgroundImage(self, image_path): self.path_to_image = image_path self.image_pixbuf = gtk.gdk.pixbuf_new_from_file(self.path_to_image) self.selectable_boxes_area.setBackgroundImage(self.path_to_image) def updateBoxesColors(self): for editor in self.editor_list: editor.updateBoxColor() def zoomFitCb(self, widget, data): self.zoomFit() widget.disconnect_by_func(self.zoomFitCb) def zoomFit(self): parent = self.selectable_boxes_area.get_parent() parent_height, parent_width = parent.allocation.height, parent.allocation.width image_height, image_width = self.selectable_boxes_area.getImageSize() changed = False if image_height > parent_height: image_height = parent_height / image_height changed = True if image_width > parent_width: image_width = parent_width / image_width changed = True if changed: self.selectable_boxes_area.zoom(min(image_height, image_width), False)