5

Microsoft Access アプリケーションを作成しており、ユーザーが複数のページを単一の PDF 形式にスキャンできるようにしたいと考えています。すべてのページをスキャンすると、PDF への変換は正常に機能します。これが私のコードです:

Option Compare Database
Option Explicit

Const WIA_FORMAT_JPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"

Public Function MyScan()
  Dim ComDialog As WIA.CommonDialog
  Dim DevMgr As WIA.DeviceManager
  Dim DevInfo As WIA.DeviceInfo
  Dim dev As WIA.Device
  Dim img As WIA.ImageFile
  Dim i As Integer
  Dim wiaScanner As WIA.Device

  Set ComDialog = New WIA.CommonDialog
  Set wiaScanner = ComDialog.ShowSelectDevice(WiaDeviceType.UnspecifiedDeviceType, False, True)

  Set DevMgr = New WIA.DeviceManager

  For i = 1 To DevMgr.DeviceInfos().Count
    If DevMgr.DeviceInfos(i).DeviceID = wiaScanner.DeviceID Then
      Set DevInfo = DevMgr.DeviceInfos(i)
    End If
  Next i

  Set dev = DevInfo.Connect

  Set img = dev.Items(1).Transfer(WIA_FORMAT_JPEG)

  img.SaveFile "C:\img.jpg"

  Set img = Nothing
  Set dev = Nothing
  Set DevInfo = Nothing
  Set DevMgr = Nothing
  Set ComDialog = Nothing


End Function

もちろん、私のスキャナーは自動ドキュメント フィーダーを備えたAvision AV121です。

私の問題は、Set img = dev.Items(1).Transfer(WIA_FORMAT_JPEG)(1 ページだけでなく) すべてのページを一度にスキャンすることですが、画像ファイルの最初のページしか表示されません。すべてのページが一度にスキャンされるため、ループで実行することはできません - 2 回目の繰り返しでエラーが発生し (実際にはフィーダーが空であるということです)、まだ最初のページしかスキャンされていません。

これは一般的な問題のように思われることを述べたいと思います。この問題に関する多くのスレッドを読みましたが、私の質問に答えるものは見つかりませんでした。

ここで助けを見つけたいと思っています。本当にイライラしています。

どうもありがとう

4

7 に答える 7

0

同様の問題があります。MS Access で書いています。スキャナー Broter 7065 から、ADF を使用して単一の PDF ファイルでスキャンするには。独自のコードを記述する時間はありません。たくさん検索しましたが、必要なものが見つかりませんでした。この問題は、プログラム「クイック スキャン コマンド ライン TWAIN スキャニング」http://www.burrotech.com/quickscan/の助けを借りて解決されました。

Private Sub Button27_Click()
Dim Nomer As Integer
Nomer = Forms!Nakladnaya!NomerLink ' invoice number from form
Shell CurrentProject.Path & "\quickscan.exe resolution 100 pdf showprogress filename " & CurrentProject.Path & "\scan\ScanN¹" & Nomer & "23.pdf " 
End Sub
于 2014-02-04T10:48:50.347 に答える
0

このコードを修正して、ADF を備えたスキャナーで動作するようにしました。最大10ページまで連続してスキャンし、一時的にjpegファイルとして保存します。次に、レポートを pdf に出力します。これは、サードパーティのアプリを使用せずに、WIA を使用して ADF スキャナーを使用して複数のドキュメントをスキャンすることを理解できる唯一の方法です。

'This code was originally designed by http://kbase.icbconsulting.com/vba/scan-documents-into-an-access-database
    'Details: This code will continually scan up to 10 documents using a scanner with an Automatic Document Feeder(ADF) and then export the jpeg
    'images to (1) pdf file.
    'Code tested using an HP OfficeJet 6600 Wireless All-in-one Printer.

'Requirements:
'Must include reference to Microsoft Windows Image Acquisition 2.0 dll
'Create a table named scantemp. Create ID column as Autonumber. Create 2nd column named Picture with Text as datatype.
'Create a continuous report named rptscan. Set scantemp table as recordsource. Add image control to report and set Picture
'as the control source. Make the image control the size of an 8.5 x 11 sheet so that the whole document appears normally when the
'report is exported to pdf.
'For use with a scanner that continually scans documents until the ADF tray is empty.

'NOTE: I previosuly coded this to scan up to 20 documents at once. It would always get to the 11th or 12th page and then Access 2010
'would crash (Not Responding). It would be interesting to see if someone can come up with a way to scan more that 10 documents
'with this code.

Public Sub ScanDocs()
'ErrorHandler traps feeder empty error after all documents are scanned, then begins jpeg-to-pdf file conversion
On Error GoTo ErrorHandler

'Initial Document Load into scanner
If MsgBox("Set documents (Max. 10) in the Automatic Document Feeder and then click OK.", vbOKCancel, "Scan Start") = vbCancel Then
MsgBox ("Scan Canceled")
GoTo ProcedureExit
Else
GoTo ScanStart
End If

ScanStart:
'Setup WIA imaging device for scanning
Dim Dialog1 As New WIA.CommonDialog, dpi As Integer, PP As Integer, l As Integer
dpi = 300
Dim Scanner As WIA.Device
Set Scanner = Dialog1.ShowSelectDevice(WIA.WiaDeviceType.ScannerDeviceType, False, False)

'Set Document Properties and Feeder Setup
Scanner.Properties("3088").Value = 1 'Automatic Document Feeder
Scanner.Items(1).Properties("6146").Value = 4 'Colour intent
Scanner.Items(1).Properties("6147").Value = dpi 'DPI horizontal
Scanner.Items(1).Properties("6148").Value = dpi 'DPI vertical
Scanner.Items(1).Properties("6149").Value = 0 'x point to start scan
Scanner.Items(1).Properties("6150").Value = 0 'y point to start scan
Scanner.Items(1).Properties("6151").Value = 8.5 * dpi  'Horizontal extent
Scanner.Items(1).Properties("6152").Value = 11# * dpi   'Vertical extent for letter
'Scanner.Items(1).Properties("6154").Value = -30 'brightness
'Scanner.Items(1).Properties("6155").Value = 30 'contrast

'Start first page scan
    Dim intPages As Integer
    Dim img As WIA.ImageFile
    Set img = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG As String
    strFileJPG = "c:\1.jpg"
    img.SaveFile (strFileJPG)
    intPages = 1
'Then every subsequent scan thereafter
    Dim img2 As WIA.ImageFile
    Set img2 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG2 As String
    strFileJPG2 = "c:\2.jpg"
    img2.SaveFile (strFileJPG2)
    intPages = intPages + 1


    Dim img3 As WIA.ImageFile
    Set img3 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG3 As String
    strFileJPG3 = "c:\3.jpg"
    img3.SaveFile (strFileJPG3)
    intPages = intPages + 1


    Dim img4 As WIA.ImageFile
    Set img4 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG4 As String
    strFileJPG4 = "c:\4.jpg"
    img4.SaveFile (strFileJPG4)
    intPages = intPages + 1

    Dim img5 As WIA.ImageFile
    Set img5 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG5 As String
    strFileJPG5 = "c:\5.jpg"
    img5.SaveFile (strFileJPG5)
    intPages = intPages + 1

    Dim img6 As WIA.ImageFile
    Set img6 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG6 As String
    strFileJPG6 = "c:\6.jpg"
    img6.SaveFile (strFileJPG6)
    intPages = intPages + 1

    Dim img7 As WIA.ImageFile
    Set img7 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG7 As String
    strFileJPG7 = "c:\7.jpg"
    img7.SaveFile (strFileJPG7)
    intPages = intPages + 1

    Dim img8 As WIA.ImageFile
    Set img8 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG8 As String
    strFileJPG8 = "c:\8.jpg"
    img8.SaveFile (strFileJPG8)
    intPages = intPages + 1

    Dim img9 As WIA.ImageFile
    Set img9 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG9 As String
    strFileJPG9 = "c:\9.jpg"
    img9.SaveFile (strFileJPG9)
    intPages = intPages + 1

    Dim img10 As WIA.ImageFile
    Set img10 = Scanner.Items(1).Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}")
    Dim strFileJPG10 As String
    strFileJPG10 = "c:\10.jpg"
    img10.SaveFile (strFileJPG10)
    intPages = intPages + 1

'Starts the jpeg-to-pdf conversion
StartPDFConversion:
Dim strFilePDF As String

'set pdf output path
strFilePDF = "c:\pdf.pdf"
DoCmd.SetWarnings False

'delete previously processed images from scantemp table
DoCmd.RunSQL "delete from scantemp"

'insert all newly scanned images into scantemp table
DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG & "')"
If intPages >= 2 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG2 & "')"
End If
If intPages >= 3 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG3 & "')"
End If
If intPages >= 4 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG4 & "')"
End If
If intPages >= 5 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG5 & "')"
End If
If intPages >= 6 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG6 & "')"
End If
If intPages >= 7 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG7 & "')"
End If
If intPages >= 8 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG8 & "')"
End If
If intPages >= 9 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG9 & "')"
End If
If intPages >= 10 Then
    DoCmd.RunSQL "insert into scantemp (picture) values ('" & strFileJPG10 & "')"
End If

'output rptscan to predefined file path
Dim RptName As String
RptName = "rptScan"
DoCmd.OpenReport RptName, acViewDesign, , , acHidden
DoCmd.Close acReport, RptName, acSaveYes
DoCmd.OutputTo acOutputReport, RptName, acFormatPDF, strFilePDF

'delete all jpeg files after report output
Dim fso46 As New FileSystemObject
fso46.DeleteFile strFileJPG
If intPages = 2 Then
        fso46.DeleteFile strFileJPG2
ElseIf intPages = 3 Then
        fso46.DeleteFile strFileJPG2
        fso46.DeleteFile strFileJPG3
ElseIf intPages = 4 Then
        fso46.DeleteFile strFileJPG2
        fso46.DeleteFile strFileJPG3
        fso46.DeleteFile strFileJPG4
ElseIf intPages = 5 Then
        fso46.DeleteFile strFileJPG2
        fso46.DeleteFile strFileJPG3
        fso46.DeleteFile strFileJPG4
        fso46.DeleteFile strFileJPG5
ElseIf intPages = 6 Then
        fso46.DeleteFile strFileJPG2
        fso46.DeleteFile strFileJPG3
        fso46.DeleteFile strFileJPG4
        fso46.DeleteFile strFileJPG5
        fso46.DeleteFile strFileJPG6
ElseIf intPages = 7 Then
        fso46.DeleteFile strFileJPG2
        fso46.DeleteFile strFileJPG3
        fso46.DeleteFile strFileJPG4
        fso46.DeleteFile strFileJPG5
        fso46.DeleteFile strFileJPG6
        fso46.DeleteFile strFileJPG7
ElseIf intPages = 8 Then
        fso46.DeleteFile strFileJPG2
        fso46.DeleteFile strFileJPG3
        fso46.DeleteFile strFileJPG4
        fso46.DeleteFile strFileJPG5
        fso46.DeleteFile strFileJPG6
        fso46.DeleteFile strFileJPG7
        fso46.DeleteFile strFileJPG8
ElseIf intPages = 9 Then
        fso46.DeleteFile strFileJPG2
        fso46.DeleteFile strFileJPG3
        fso46.DeleteFile strFileJPG4
        fso46.DeleteFile strFileJPG5
        fso46.DeleteFile strFileJPG6
        fso46.DeleteFile strFileJPG7
        fso46.DeleteFile strFileJPG8
        fso46.DeleteFile strFileJPG9
ElseIf intPages = 10 Then
        fso46.DeleteFile strFileJPG2
        fso46.DeleteFile strFileJPG3
        fso46.DeleteFile strFileJPG4
        fso46.DeleteFile strFileJPG5
        fso46.DeleteFile strFileJPG6
        fso46.DeleteFile strFileJPG7
        fso46.DeleteFile strFileJPG8
        fso46.DeleteFile strFileJPG9
        fso46.DeleteFile strFileJPG10
End If
Set fso46 = Nothing
DoCmd.SetWarnings True

MsgBox ("Done!")

ProcedureExit:
Exit Sub

ErrorHandler:
'Traps 'out of paper error.' Asks user if all documents were scanned properly, if yes is chosen, start PDF conversion, if no, restarts
'scan subroutine.
    Select Case Err.Number
        Case -2145320957
            If MsgBox("Were all documents successfully scanned?", vbYesNo, "Confirm Scan") = vbYes Then
                GoTo StartPDFConversion
            Else
                Call scan
            End If
    End Select

'Handles any other errors in subroutine
    MsgBox "Error" & ":  " & Err.Number & vbCrLf & "Description: " _
        & Err.Description, vbExclamation, Me.Name & ".ScanDocs"
    Resume ProcedureExit

End Sub
于 2014-01-03T10:59:51.297 に答える
0

サポートされていないドライブです。Brother DCP-8157用のオリジナルのTwain Driveをインストールすることで解決します

于 2017-01-11T16:31:38.680 に答える
0

まだ問題に取り組んでいる人のために、次の解決策を見つけました。

Scanner.Items(1).Transfer("formatID") に使用する formatID に応じて、スキャナは 1 枚の紙をスキャンした後に停止するか、スキャンを続行します (私にとっては BMP でのみ機能し、HP Officejet J4680 を使用しています)。 )。

次に、フィーダーにまだ用紙があるかどうかを読み取る ADFstatus という変数を使用し、これを使用して while ループを作成しました (wiaScanner.Properties.Item("3087"))。次に、スキャンした各画像を個別に保存すると、一度にすべての用紙をスキャンするのではなく、スキャンごとに ADF スキャナーが停止します。

例えば:

Dim wiaImg As WIA.ImageFile
ADFStatus = wiaScanner.Properties.Item("3087").Value
counter = 0

While ADFStatus
    counter = counter + 1
    Set wiaImg = wiaScanner.Items(1).Transfer(WIA.FormatID.wiaFormatBMP)
    wiaImg.SaveFile ("C:\Test\" & counter & ".bmp")
    Set wiaImg = Nothing
    ADFStatus = wiaScanner.Properties.Item("3087").Value
Wend

お役に立てれば

于 2014-08-07T10:41:31.580 に答える