From 44618101d524188d55a6722e14ccbd7a69f4b496 Mon Sep 17 00:00:00 2001 From: Albert Cervera i Areny Date: Sat, 24 May 2008 01:09:54 +0200 Subject: [PATCH] Revert "Commit windows merge with twain backend working." This reverts commit 1326a5cf0237ae0fc63b6827c3af5578b20409b1. --- __init__.py | 5 -- backends/errors.py | 24 ------ backends/{sane.py => sane_backend.py} | 23 +++--- backends/twain.pyd | Bin 0 -> 90112 bytes backends/twain_backend.py | 101 ++++++++++++++++++++++++++ scanner.py | 7 +- 6 files changed, 119 insertions(+), 41 deletions(-) delete mode 100644 backends/errors.py rename backends/{sane.py => sane_backend.py} (80%) create mode 100644 backends/twain.pyd create mode 100644 backends/twain_backend.py diff --git a/__init__.py b/__init__.py index 95c1f41..2ead901 100644 --- a/__init__.py +++ b/__init__.py @@ -16,9 +16,4 @@ # Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -from ocr import * -from barcode import * -from document import * -from template import * -from recognizer import * diff --git a/backends/errors.py b/backends/errors.py deleted file mode 100644 index 299d1e8..0000000 --- a/backends/errors.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (C) 2008 by Albert Cervera i Areny -# albert@nan-tic.com -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the -# Free Software Foundation, Inc., -# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -class ScannerError: - NoDeviceFound = 1 - CouldNotOpenDevice = 2 - AcquisitionError = 3 - UnknownError = 4 - diff --git a/backends/sane.py b/backends/sane_backend.py similarity index 80% rename from backends/sane.py rename to backends/sane_backend.py index ee30554..3b8c8c4 100644 --- a/backends/sane.py +++ b/backends/sane_backend.py @@ -19,31 +19,36 @@ import sane # PIL Module to convert PIL Image Object to QImage import ImageQt -from errors import * +from common import * -class Scanner(QObject): +class SynchronousScanner(QObject): def __init__(self, parent=None): QObject.__init__(self, parent) sane.init() self.resolution = 300 + # Member of SynchronousScanner Interface def listDevices(self): # sane.get_devices() returns an structure like the following # [('epson:libusb:001:004', 'Epson', 'GT-8300', 'flatbed scanner')] [x[0] for x in sane.get_devices()] + # Member of SynchronousScanner Interface def setResolution(self, value): self.resolution = value - def startScan(self): - devices = self.listDevices() - if not devices: - self.emit( SIGNAL('error(int)'), ScannerError.NoDeviceFound ) - return + # Member of SynchronousScanner Interface + def scan(self, name=None): + if not name: + devices = self.listDevices() + if not devices: + self.emit( SIGNAL('error(int)'), ScannerError.NoDeviceFound ) + return + name = devices[0] try: - source = sane.open( devices[0] ) + source = sane.open( name ) except: self.emit( SIGNAL('error(int)'), ScannerError.CouldNotOpenDevice ) return @@ -65,4 +70,4 @@ class Scanner(QObject): self.emit( SIGNAL('error(int)'), ScannerError.AcquisitionError ) - +ScannerBackend = SynchronousScanner \ No newline at end of file diff --git a/backends/twain.pyd b/backends/twain.pyd new file mode 100644 index 0000000000000000000000000000000000000000..917e18b42a01e3f49fc667de9e323744c8a80e32 GIT binary patch literal 90112 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 CE;1zXIpH+^;svnuGKH(>YF|7 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 d^{2v_06M6su literal 0 HcmV?d00001 diff --git a/backends/twain_backend.py b/backends/twain_backend.py new file mode 100644 index 0000000..3f99f93 --- /dev/null +++ b/backends/twain_backend.py @@ -0,0 +1,101 @@ +import twain, struct, string +from PyQt4.QtCore import * +from PyQt4.QtGui import * +#from common import * +import common + +class SynchronousScanner(QObject): + + def __init__(self, parent=None): + QObject.__init__(self, parent) + self.manager = None + self.source = None + self.resolution = 300 + + def stripNull(self, s): + offset = string.find(s, '\0') + if s != -1: + s= s[:offset] + return s + + # Member of SynchronousScanner Interface + def setResolution(self, value): + self.resolution = value + + # Member of SynchronousScanner Interface + def listDevices(self): + manager = twain.SourceManager(0L) + fmtString = "L42sHH4s34s34s34s" + slen = struct.calcsize(fmtString) + self.identity = struct.pack("%ds" % slen, "") + + rv = manager.DSM_Entry(twain.DG_CONTROL, twain.DAT_IDENTITY, twain.MSG_GETFIRST, self.identity) + + l = [] + while rv == twain.TWRC_SUCCESS: + l.append( self.stripNull( self.identity[122:] ) ) + rv = manager.DSM_Entry(twain.DG_CONTROL, twain.DAT_IDENTITY, twain.MSG_GETNEXT, self.identity) + return l + + def open(self, name): + self.manager = twain.SourceManager( 0, ProductName=name ) + if not self.manager: + return + + if self.source: + self.source.destroy() + self.source=None + self.source = self.manager.OpenSource() + if self.source: + print "%s: %s" % ( name, self.source.GetSourceName() ) + + # Member of SynchronousScanner Interface + def scan(self, name=None): + if not name: + l = self.listDevices() + if not l: + print "No device found" + return common.ScannerError.NoDeviceFound + name = l[0] + + try: + self.open(name) + except: + return common.ScannerError.CouldNotOpenDevice + if not self.source: + return common.ScannerError.CouldNotOpenDevice + + try: + self.source.SetCapability( twain.ICAP_YRESOLUTION, twain.TWTY_FIX32, float(self.resolution) ) + self.source.SetCapability( twain.ICAP_XRESOLUTION, twain.TWTY_FIX32, float(self.resolution) ) + except: + print "Could not set resolution to '%s'" % self.resolution + pass + try: + self.source.RequestAcquire(0, 0) + except: + return common.ScannerError.AcquisitionError + + while self.next(): + image = self.capture() + self.emit( SIGNAL('scanned(QImage)'), image ) + self.source = None + + def next(self): + try: + self.source.GetImageInfo() + return True + except: + return False + + def capture(self): + fileName = "tmp.tmp" + (handle, more_to_come) = self.source.XferImageNatively() + twain.DIBToBMFile(handle, fileName) + twain.GlobalHandleFree(handle) + return QImage( fileName ) + + def close(self): + del self.manager + +common.ScannerBackend = SynchronousScanner \ No newline at end of file diff --git a/scanner.py b/scanner.py index 124c70f..8482cd6 100644 --- a/scanner.py +++ b/scanner.py @@ -16,9 +16,10 @@ # Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import os +from backends.common import * if os.name == 'nt': - from backends.twain import * -else. - from backends.sane import * + from backends.twain_backend import * +else: + from backends.sane_backend import *