Windowsスキャン機能を自動化する

Windowsスキャン機能を自動化する

私はかなり古い Canon のスキャナー Pixma MP 110 を持っています。もちろん、Canon は役に立つドライバーを提供していません (彼らのサイトは本当に必死で、イライラさせられ、あらゆる点で役に立たない)。私が見つけた唯一のソフトウェアは、疑問符が至る所にある中国語版です。

しかし、私がデバイスとプリンターWindows のマネージャーでスキャナーを右クリックすると、母国語の Windows 統合スキャン マネージャーを使用できます。機能は多少制限されていますが、疑問符でいっぱいのボタンの集まりよりはましです。

少し調べてみたところ、私が話している機能はウィア

ただし、チェコ語でのアプローチは、私にとっての疑問符のように聞こえるかもしれません。 ここに画像の説明を入力してください

選択後スキャンを開始ダイアログが表示されます。 の下で実行されるexplorer.exeため、実際にどのプログラムであるかを確認しても変わりはありません。 ここに画像の説明を入力してください

私が欲しいのはデスクトップショートカットを作ることです。自動的にスキャンを開始するスキャンを開始" そして "スキャン「」。

また、スキャナにはスキャンを開始するためのボタンがあり、コンピュータはそれが押されると認識します。それを押すと、Windowsはボタンに対してどのアプリケーションを実行するか尋ねますが、ここではスキャナソフトウェアは機能せず、Windowsが提供する選択肢にも表示されませんでした。これをハックして実行できるかどうか疑問に思っています。そのボタンのアプリケーション(主要な質問に対する答えが得られれば役立つでしょう)。

ここに画像の説明を入力してください

それで、もしあなたがその長い投稿を読むのが面倒だというのなら、もう一度質問します。

  1. バッチ スクリプトまたはファイル内の簡単なコマンドを使用して、インストールされたスキャナーからのスキャンを Windows で自動的に開始するにはどうすればよいですか.lnk?
  2. (オプション) スキャナーのボタン押下にアプリケーションを割り当てるにはどうすればよいですか?

答え1

PowerShell ソリューション

このスクリプトは、Canon、Epson など、WIA 互換でtransfer()コマンドをサポートしているほとんどのスキャナで動作します。スクリプトはすぐにスキャンを開始します。ファイル名、パス、画像形式などのすべてのオプションは、スクリプトによって既に設定されています。ショートカットを使用してスキャン処理を開始するだけです。

  1. 保存例:D:\StartScan.ps1
  2. 新しいショートカットを作成し、

    %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "D:\StartScan.ps1"
    

スキャン開始.ps1

# Create object to access the scanner
$deviceManager = new-object -ComObject WIA.DeviceManager
$device = $deviceManager.DeviceInfos.Item(1).Connect()

# Create object to access the scanned image later
$imageProcess = new-object -ComObject WIA.ImageProcess

# Store file format GUID strings
$wiaFormatBMP  = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatPNG  = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatGIF  = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"

# Scan the image from scanner as BMP
foreach ($item in $device.Items) {
    $image = $item.Transfer() 
}

# set type to JPEG and quality/compression level
$imageProcess.Filters.Add($imageProcess.FilterInfos.Item("Convert").FilterID)
$imageProcess.Filters.Item(1).Properties.Item("FormatID").Value = $wiaFormatJPEG
$imageProcess.Filters.Item(1).Properties.Item("Quality").Value = 5
$image = $imageProcess.Apply($image)

# Build filepath from desktop path and filename 'Scan 0'
$filename = "$([Environment]::GetFolderPath("Desktop"))\Scan {0}.jpg"

# If a file named 'Scan 0' already exists, increment the index as long as needed
$index = 0
while (test-path ($filename -f $index)) {[void](++$index)}
$filename = $filename -f $index

# Save image to 'C:\Users\<username>\Desktop\Scan {x}'
$image.SaveFile($filename)

# Show image 
& $filename

カスタマイズ

  • 別の画像形式が必要な場合は、(またはTIFF、BMP、GIF)Item("FormatID").Value = $wiaFormatJPEGに変更します。$wiaFormatPNG
  • 別の出力パスが必要な場合は変更してください。以前に画像形式を変更したことがある場合は$([Environment]::GetFolderPath("Desktop"))\Scan {0}.jpg"拡張子を変更してください。.jpg

使用されたリソース

答え2

これは私が使用している PS スクリプトです。このスレッドの回答の 1 つからコピーし、別のフィーダーで動作するように変更しました。ガラス フィーダーを使用していない場合は、「prop value」を 0 1 2 に変更してフィーダーを変更できます。このスクリプトはスキャン後に画像を表示せず、保存するだけです。

# Create object to access the scanner
$deviceManager = new-object -ComObject WIA.DeviceManager
$device = $deviceManager.DeviceInfos.Item(1).Connect()

# Set the scanner source to the feeder
foreach ($prop in $device.Properties) {
    if ($prop.Name -eq "Document Handling Select") {
        $prop.Value = 1
    }
}

# Create object to access the scanned image later
$imageProcess = new-object -ComObject WIA.ImageProcess

# Store file format GUID strings
$wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"

# Scan the image from scanner as BMP
foreach ($item in $device.Items) {
    $image = $item.Transfer()
}

# set type to JPEG and quality/compression level
$imageProcess.Filters.Add($imageProcess.FilterInfos.Item("Convert").FilterID)
$imageProcess.Filters.Item(1).Properties.Item("FormatID").Value = $wiaFormatJPEG
$imageProcess.Filters.Item(1).Properties.Item("Quality").Value = 5
$image = $imageProcess.Apply($image)

# Build filepath from C:\scan path and filename 'Scan 0'
$filename = "C:\scan\Scan {0}.pdf"

# If a file named 'Scan 0' already exists, increment the index as long as needed
$index = 0
while (test-path ($filename -f $index)) { [void] (++$index)}
$filename = $filename -f $index

# Save image to 'C:\scan\Scan {x}'
$image.SaveFile($filename)

答え3

これは、stackoverflow でより適切に提供される可能性があります。「WIA」タグを検索すると、自動化に取り組んでいる人々が見つかります。エキスパート ユーザー レベル。

ダイアログを起動する VBScript を作成するのは非常に簡単ですが、(私の限られた知識では) (a) WIA ではスキャンされたイメージを処理するためにホストが必要なので、何をするにしてもイメージを受信して​​保存する必要があり (単にダイアログを起動するだけでなく)、(b) WIA ダイアログには「無人」モードがないようです。

あなたのためのリソース:WIA オートメーション

そして、wia を起動する vbs スクリプト (eg という名前のテキスト ファイルを作成しますlaunchWia.vbs):

set oDlg = CreateObject("WIA.CommonDialog")
oDlg.ShowAcquireImage()

バッチファイルを使用して実行できます:

cscript launchWia.vbs
pause

ショートカットで実行できます。

繰り返しますが、これは画像を処理しないので、おそらく何も得られないでしょう。画像処理を扱うサンプルについては、MSDN ドキュメントを参照してください。

答え4

スキャン.vbs

Set CommonDialog = CreateObject("WIA.CommonDialog")
Set DeviceManager = CreateObject("WIA.DeviceManager")

' List all Available Devices by Name and DeviceID
' The following example shows how to list all available Deviceices by name and DeviceID. 
Dim i, n 'As Integer
n = DeviceManager.DeviceInfos.Count
WScript.Echo "Number of Deviceice found = " & n
For i = 1 to DeviceManager.DeviceInfos.Count
  WScript.Echo " Device " & i & ":" & vbTab & DeviceManager.DeviceInfos(i).Properties("Name").Value & vbTab & "(" & DeviceManager.DeviceInfos(i).DeviceID & ")"
Next

Set DevInfo = DeviceManager.DeviceInfos(1)
Set Device = DevInfo.Connect

Device.Items(1).Properties("6146").Value = 2 'colors
Device.Items(1).Properties("6147").Value = 600 'dots per inch/horizontal
Device.Items(1).Properties("6148").Value = 600 'dots per inch/vertical
Device.Items(1).Properties("6149").Value = 0 'x point where to start scan
Device.Items(1).Properties("6150").Value = 0 'y point where to start scan
Device.Items(1).Properties("6151").Value = 5100 'horizontal exent DPI x inches wide
Device.Items(1).Properties("6152").Value = 7002 'vertical extent DPI x inches tall
Device.Items(1).Properties("4104").Value = 8 'bits per pixel

'Device.Items(1).Properties("3098").Value = 1700 'page width
'Device.Items(1).Properties("3099").Value = 2196 'page height

Set img = CommonDialog.ShowTransfer(Device.Items(1), "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}", true)

img.SaveFile "F:/image.bmp"

走る"C:/Windows/System32/cscript.exe" //X "F:/scan.vbs"

関連情報