none
Scanning, WIA - keine Rückmeldung neue Seite, macht aus vielen eine Seite RRS feed

  • Allgemeine Diskussion

  • Hallo,

    habe mit dem unten genanngen Code das Problem, WIA keinen Info darüber ausgibt, dass über den ADF eine neue Seite eingezogen wurde und somit macht der Code aus vielen Seiten nur eine einzige Seite...

    Es wird immer nur die zuletzt eingescannte Seite gespeichert.

    Habe vieles bereits geoggelt, aber leider bin ich zu diesem Prob. nicht fünfig geworden, so dass ich nicht darum herum komme :) euch zu fragen... Bin mit meinem Latein am Ende und bitte um Hilfe...

     

    Imports WIA
    Imports System.IO
    
    Public Class Form2
    
      Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ADFScan()
      End Sub
    
      Dim DeviceID As String
    
      Const wiaFormatBMP As String = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
      Const wiaFormatPNG As String = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
      Const wiaFormatGIF As String = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
      Const wiaFormatJPEG As String = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
      Const wiaFormatTIFF As String = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
    
      Private Class WIA_DPS_DOCUMENT_HANDLING_SELECT
        Public Const FEEDER As UInteger = &H1
        Public Const FLATBED As UInteger = &H2
      End Class
    
      Private Class WIA_DPS_DOCUMENT_HANDLING_STATUS
        Public Const FEED_READY As UInteger = &H1
      End Class
    
      Private Class WIA_PROPERTIES
        Public Const WIA_RESERVED_FOR_NEW_PROPS As UInteger = 1024
        Public Const WIA_DIP_FIRST As UInteger = 2
        Public Const WIA_DPA_FIRST As UInteger = WIA_DIP_FIRST + WIA_RESERVED_FOR_NEW_PROPS
        Public Const WIA_DPC_FIRST As UInteger = WIA_DPA_FIRST + WIA_RESERVED_FOR_NEW_PROPS
        '
        ' Scanner only device properties (DPS)
        '
        Public Const WIA_DPS_FIRST As UInteger = WIA_DPC_FIRST + WIA_RESERVED_FOR_NEW_PROPS
        Public Const WIA_DPS_DOCUMENT_HANDLING_STATUS As UInteger = WIA_DPS_FIRST + 13
        Public Const WIA_DPS_DOCUMENT_HANDLING_SELECT As UInteger = WIA_DPS_FIRST + 14
      End Class
    
      Private Class WIA_ERRORS
        Public Const BASE_VAL_WIA_ERROR As UInteger = &H80210000UI
        Public Const WIA_ERROR_PAPER_EMPTY As UInteger = BASE_VAL_WIA_ERROR + 3
      End Class
    
      Private Sub ADFScan()
    
        'Choose Scanner
        Dim class1 As New CommonDialog()
        Dim d As Device = class1.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, True, False)
        If d IsNot Nothing Then
          Me.DeviceID = d.DeviceID
        Else
          'no scanner chosen
          Return
        End If
    
        Dim WiaCommonDialog As WIA.CommonDialog = New CommonDialog()
    
        Dim hasMorePages As Boolean = True
        Dim x As Integer = 0
        Dim numPages As Integer = 0
        While hasMorePages
          'Create DeviceManager
          Dim manager As DeviceManager = New DeviceManager()
          Dim WiaDev As Device = Nothing
    
          For Each info As DeviceInfo In manager.DeviceInfos
            If info.DeviceID = Me.DeviceID Then
              Dim infoprop As WIA.Properties = Nothing
              infoprop = info.Properties
    
              'connect to scanner
              WiaDev = info.Connect()
    
              Exit For
    
            End If
    
          Next
    
          'Start Scan
    
          Dim img As WIA.ImageFile = Nothing
          Dim Item As WIA.Item = TryCast(WiaDev.Items(1), WIA.Item)
    
          Try
    
            img = DirectCast(WiaCommonDialog.ShowTransfer(Item, wiaFormatJPEG, False), ImageFile)
            'Save to file
            Dim varImageFileName As String = "E:\Pictures\TEST\" & x.ToString() & ".jpg"
            If File.Exists(varImageFileName) Then
              'file exists, delete it
              File.Delete(varImageFileName)
    
            End If
            img.SaveFile(varImageFileName)
            numPages += 1
    
            img = Nothing
    
          Catch ex As Exception
            MessageBox.Show("Error: " + ex.Message)
    
          Finally
            Item = Nothing
            'determine if there are any more pages waiting
            Dim documentHandlingSelect As [Property] = Nothing
            Dim documentHandlingStatus As [Property] = Nothing
    
            For Each prop As [Property] In WiaDev.Properties
              If prop.PropertyID = WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT Then
                documentHandlingSelect = prop
    
              End If
    
              If prop.PropertyID = WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS Then
                documentHandlingStatus = prop
    
              End If
    
            Next
    
            hasMorePages = False
    
            'assume there are no more pages
            If documentHandlingSelect IsNot Nothing Then
              'may not exist on flatbed scanner but required for feeder
              'check for document feeder
              If (Convert.ToUInt32(documentHandlingSelect.Value()) And WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) <> 0 Then
                hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) And WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) <> 0)
    
              End If
    
            End If
    
            x += 1
    
          End Try
    
        End While
    
      End Sub
    End Class
    

     

    Sonntag, 30. Januar 2011 16:50

Alle Antworten

  • Hallo,

    ich habe mich für mein Programm (Scan4Office ) mit einem (alledings kostenpflichtigen Tool) geholfen das ein Control "Scanner" besitzt. Dieses basiert auf der AxSCANNERLIB.AXScanner und bietet das EndScan-Event.
    Wenn ich hier ADF aktiviere werden alle Seiten gescannt und zum Schluss zu einer (allerdings kompletten Vorlage mit X Seiten) zusammengefasst.
    Ich weiß nicht wie du das handelst aber gundsätzlich sollte dein WIA oder TWIN nach dem Scannen eine Rückmeldung geben mit der du dann was anstellen kannst.

    Deinen Code habe ich nur mal überflogen, habe dabei aber festgestellt, dass Du

    Dim hasMorePages As Boolean = True

    gesetzt hast. Setze doch mal den Wert auf false, erzeuge für jeden Scan eine eigene ggf. temporäre Datei und füge die später wieder zusammen. Eine spontane Idee wäre dies über einen PDF-Printer als "Druckauftrag" zusammenzusetzen.

    .. nur mal so eine Idee.


    Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express
    Montag, 31. Januar 2011 19:09