Dokumente scannen mit WIA

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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 (siehe Bild 1).

pic001.tif

Bild 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 Bild 2 aus.

pic002.tif

Bild 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 Bild 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

Bild 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 Bild 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

über die ID kann das Formular eine Verbindung zum ausgewählten Scanner herstellen – das funktioniert prinzipiell so wie in Listing 4. Nun bringt das Formular aus Bild 4 es mit sich, dass zum aktuell ausgewählten Scanner mehrere Informationen ermittelt werden müssen – die Farbeinstellung, die Auflösung sowie die Helligkeit und der Kontrast. Außerdem erfordert auch das Starten des Scanvorgangs eine Referenz auf eine aktive Verbindung zum Scanner. Um die Funktionen der WIA-Bibliothek möglichst in einem Standardmodul zu versammeln, sollen die Zugriffe auf den jeweiligen Scanner allein über die ID als Parameter erfolgen – diese können Sie ganz einfach als String übergeben.

Listing 4: Initialisieren des Formulars frmScanner

Private Sub Form_Open(Cancel As Integer)
    Dim strDevice As String
     Me!cboScanner.RowSource = ScannerErmitteln
     If Len(Me!cboScanner.RowSource) > 0 Then
         Me!cboScanner = Nz(DLookup("Wert", "tblParameter", _
"Parameter = 'AktuellerScanner'"), _
Me!cboScanner.ItemData(0)) strDevice = Me!cboScanner SteuerelementeAktualisieren strDevice Else MsgBox "Es ist kein Scanner an diesen Rechner angeschlossen." Cancel = True End If End Sub Private Sub SteuerelementeAktualisieren(strDevice As String) Me!cboAufloesung.RowSource = AufloesungenErmitteln(strDevice) Me!cboAufloesung.Value = AktuelleAufloesungErmitteln(strDevice) Me!txtHelligkeit = AktuelleHelligkeitErmitteln(strDevice) Me!txtKontrast = AktuellenKontrastErmitteln(strDevice) End Sub

pic005.tif

Bild 4: Das Formular zum Eingeben der Parameter und zum Starten des Scanvorgangs

Legen Sie also zunächst die benötigten Funktionen fest, indem Sie die Ereignisprozedur Beim öffnen des Formulars frmScannen wie in Listing 2 anlegen. Die Routine liest zunächst die Liste der vorhandenen Scanner ein und weist diese der Eigenschaft RowSource des passenden Kombinationsfeldes zu – vorausgesetzt, sie findet einen Scanner. Ist das der Fall, prüft die Routine den in der Tabelle tblParameter gespeicherten Wert des Parameters AktuellerScanner und wählt im Kombinationsfeld entweder diesen Wert oder den ersten vorhandenen Eintrag aus.

Anschließend weist sie der Variablen strDevice die ID des ausgewählten Scanners hinzu. Die Routine SteuerelementeAktualisieren füllt die vier Steuerelemente mit den passenden Eigenschaften; diese Anweisungen sind deshalb in einer eigenen Routine enthalten, weil diese auch noch nach dem Aktualisieren des Kombinationsfeldes cboScanner aufgerufen wird.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar