Dokumente scannen mit WIA

Da einige Zeitgenossen immer noch an das papierlose Büro glauben, will Access im Unternehmen zumindest einen kleinen Teil zu diesem Traum beitragen. Dazu liefern wir Ihnen Know-how rund um das Scannen von Dokumenten per VBA – natürlich mit automatischer Konvertierung in den gewünschten Dateityp und Speicherung der Datei am von Ihnen vorgegebenen Ort.

Voraussetzungen

Das Scannen von Dokumenten und das Handling der so entstehenden Dateien erfolgt unter modernen Betriebssystemen (Windows XP SP1 und höher) mit der kostenlosen Windows Image Acquisition Automation Library v2.0 (WIA), die Sie unter [1] herunterladen können.

Diese Bibliothek setzt einen modernen Scanner mit WIA-Schnittstelle voraus. Informationen zu entsprechenden Techniken für ältere Betriebssysteme und Scanner finden Sie im Kasten Scannen mit älteren Betriebssystemen. Die WIA-Bibliothek offeriert noch weitere Möglichkeiten wie etwa das Einlesen von Bildern einer Digitalkamera. Dieser Beitrag beschränkt sich jedoch auf die Steuerung von Scannern.Nach dem Herunterladen müssen Sie die im Paket enthaltene DLL mit dem Befehl Regsvr32 <Dateiname> registrieren. Für den Einsatz in VBA richten Sie außerdem einen passenden Verweis auf diese Bibliothek ein (s. Abb. 1).

pic001.tif

Abb. 1: Das Steuern eines Scanners per VBA erfordert einen Verweis auf die WIA-Bibliothek.

Scannen auf die Schnelle

Wer will schon in die Tiefen einer Objektbibliothek einsteigen, wenn man auch mit einer kleinen Routine den ersten Scan von Access initiieren kann Wenn Sie obige Vorbereitungen getroffen haben und ein funktionstüchtiger Scanner an Ihrem Rechner hängt, können Sie sofort mit der Routine aus Listing 1 loslegen.

Listing 1: Dokument scannen und speichern

Public Function ScannenUndSpeichern(strDateiname As String)
     Dim objCommonDialog As WIA.CommonDialog
     Dim objImage As WIA.ImageFile
     Set objCommonDialog = New WIA.CommonDialog
     Set objImage = objCommonDialog.ShowAcquireImage
     If Not objImage Is Nothing Then
         objImage.SaveFile strDateiname
         Set objImage = Nothing
     End If
     Set objCommonDialog = Nothing
End Function

Dabei lernen Sie auch direkt das Objekt kennen, von dem aus Sie alle notwendigen (und weniger notwendigen) Dialoge öffnen können. Der Dialog, den die Routine mit der Methode ShowAcquireImage anzeigt, sieht etwa wie in Abb. 2 aus.

pic002.tif

Abb. 2: Der per VBA geöffnete Dialog zum Steuern des Scanners

Dieser Dialog erlaubt die grundsätzlichen Einstellungen wie die Auswahl des Bildtyps und des zu scannenden Bereichs, wobei der Dialog bereits eine sinnvolle Vorauswahl trifft. Weitere Details stellen Sie mit dem Dialog aus Abb. 3 ein, den Sie über den Link Qualität des gescannten Bildes verbessern öffnen. Die Routine aus Listing 1 erwartet den Dateinamen der zu speichernden Datei als Parameter. Der Aufruf könnte dann etwa folgendermaßen lauten:

ScannenUndSpeichern "c:\\Scan.bmp"

pic003.tif

Abb. 3: Feineinstellungen für das Scannen

Die wichtigste Eigenschaft dieses Dialogs ist, dass er ein Objekt des Typs ImageFile zurückgibt, das Sie anschließend per VBA weiterbearbeiten können – etwa, um es wie in diesem Fall zu speichern.

Dialoge über Dialoge

Neben diesem Dialog bietet WIA noch einige Dialoge mehr. Die Methode ShowDeviceProperties etwa öffnet den Dialog mit den Eigenschaften des ausgewählten Scanners (ist nur ein Scanner vorhanden, entfällt der Auswahldialog, den die Methode ShowAcquireImage in der gleichen Routine aufruft). Listing 2 zeigt eine Beispielroutine zum Aufrufen dieses Dialogs. Die Funktionen der übrigen Methoden des CommonDialog-Objekts sind in der Online-Hilfe dokumentiert.

Listing 2: Beispiel für die Anzeige der
Scanner-Eigenschaften

Public Function Scannereigenschaften()
     Dim objCommonDialog As WIA.CommonDialog
     Dim objDevice As WIA.Device
     Set objCommonDialog = New WIA.CommonDialog
     Set objDevice = objCommonDialog. _
ShowSelectDevice With objCommonDialog .ShowDeviceProperties objDevice End With End Function

Komfortabel scannen

Für Access-Anwendungen wie etwa Rechnungs- oder Vertragsverwaltungen kann der Aufruf des Scanvorgangs von einem Formular aus und das anschließende Speichern des Scanergebnisses und des dazugehörenden Pfades sehr viel Arbeit sparen. In diesem Beitrag lernen Sie ein Formular kennen, mit dem Sie den Scanner auswählen, einen Dateinamen festlegen und den Scanvorgang starten können. Das fertige Formular sieht wie in Abb. 4 aus.

Viel interessanter ist jedoch das Modul, das für die vom Formular aus aufgerufenen Scanvorgänge verantwortlich ist. Dieses Modul heißt mdlScannen und enthält alle für das Scannen erforderlichen Routinen – welche das im Einzelnen sind, erfahren Sie in den folgenden Abschnitten.

Scanner auswählen

Das Kombinationsfeld zum Auswählen des Scanners wird mit der Funktion ScannerErmitteln (s. Listing 3) gespeist, und zwar beim öffnen des Formulars. Die Routine erzeugt zunächst ein Objekt des Typs DeviceManager, der das Erzeugen einer Connection auf die enthaltenen Scanner ermöglicht. Die einzelnen Geräte kann man über die Auflistung DeviceInfos ansprechen, die eindeutige ID und die Bezeichnung erhält man über die passenden Properties eines Elements dieser Auflistung. Die Funktion ScannerErmitteln liefert eine Liste mit den durch Semikola getrennten IDs und den Bezeichnungen der Geräte. Damit das Kombinationsfeld cboScanner diesen Ausdruck vernünftig auswerten kann, stellen Sie die Eigenschaft Herkunftsart auf Wertliste, Spaltenanzahl auf 2 und Spaltenbreite auf 0cm ein.

Listing 3: Erstellen einer Liste der vorhandenen Scanner

Public Function ScannerErmitteln() As String
     Dim objDeviceManager As WIA.DeviceManager
     Dim i As Integer
     Dim strScannerliste As String
     Set objDeviceManager = New WIA.DeviceManager
     For i = 1 To objDeviceManager.DeviceInfos.Count
         Debug.Print objDeviceManager.DeviceInfos.Item(i).DeviceID
         strScannerliste = strScannerliste _
& objDeviceManager.DeviceInfos.Item(i).DeviceID & ";" & objDeviceManager.DeviceInfos. _
Item(i).Properties("Name") & ";" Next i ScannerErmitteln = strScannerliste End Function

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar