Automatizar la función de escaneo de Windows

Automatizar la función de escaneo de Windows

Tengo un escáner Canon Pixma MP 110 bastante antiguo. Por supuesto, Canon no proporciona ningún controlador útil (su sitio es realmente desesperado, frustrante e inútil en todos los sentidos); el único software que encontré es una versión china con signos de interrogación por todas partes.

Sin embargo, si voy aDispositivos e impresorasadministrador en Windows y hago clic con el botón derecho en el escáner, puedo usar el administrador de escaneo integrado en Windows que está en mi idioma nativo. Tiene funciones algo limitadas, pero sigue siendo mejor que un montón de botones llenos de signos de interrogación.

Busqué un poco y descubrí que la función de la que hablo se llamaWIA.

Este es el enfoque, aunque en checo, que puede que a usted le suene como a mí me suenan estos signos de interrogación. ingrese la descripción de la imagen aquí

Después de elegirIniciar escaneoAparece un cuadro de diálogo. Se ejecuta bajo explorer.exe, por lo que no hay ningún cambio para descubrir qué programa es realmente. ingrese la descripción de la imagen aquí

Lo que quiero es hacer un acceso directo en el escritorio, eso seríacomenzar a escanear automáticamente, sin que yo haga clic en "Iniciar escaneo" y "Escanear".

Además, el escáner tiene un botón para comenzar a escanear y mi computadora reconoce cuando se presiona. Cuando lo presiono, Windows me pregunta qué aplicación debería ejecutarse para el botón; sin embargo, ningún software de escáner funcionó aquí, ni apareció ninguno en la selección que me da Windows. Me preguntaba si podría hackear esto para ejecutarlo.cualquier aplicación para ese botón. (Eso sería útil si alguna vez obtuviera la respuesta a la pregunta principal).

ingrese la descripción de la imagen aquí

Entonces las preguntas una vez más, si fuiste demasiado vago para leer esa publicación tan larga:

  1. ¿Cómo hago para que Windows comience a escanear automáticamente desde el escáner instalado mediante un script por lotes o un simple comando en .lnkel archivo?
  2. (opcional) ¿Cómo asigno cualquier aplicación al presionar un botón de mi escáner?

Respuesta1

solución PowerShell

El script debería funcionar con la mayoría de los escáneres, independientemente de si es Canon, Epson o cualquier otro, siempre que sean compatibles con WIA y admitan el transfer()comando. El script comenzará a escanear inmediatamente. Todas las opciones como nombre de archivo, ruta o formato de imagen ya están configuradas mediante script. Sólo tienes que iniciar el proceso de escaneo con un acceso directo

  1. Guárdalo como por ejemploD:\StartScan.ps1
  2. Cree un nuevo acceso directo y apúntelo

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

IniciarScan.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

Personalizaciones

  • Cambie Item("FormatID").Value = $wiaFormatJPEGa $wiaFormatPNG(o TIFF, BMP, GIF) si necesita otro formato de imagen
  • Cambie $([Environment]::GetFolderPath("Desktop"))\Scan {0}.jpg"si necesita otra ruta de salida. Cambia la extensión .jpgsi anteriormente habías cambiado el formato de la imagen

Recursos usados

Respuesta2

Este es el script ps que estoy usando. Lo copié de una de las respuestas de este hilo y lo modifiqué para que funcione con otro alimentador. En caso de que no esté usando el alimentador de vidrio, puede modificar el alimentador cambiando el 'valor de propiedad' a 0. 1 2. Este script no mostrará la imagen después del escaneo, solo la guardará.

# 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)

Respuesta3

Esto podría funcionar mejor en stackoverflow. busque la etiqueta "WIA" y habrá personas que han abordado la automatización. Nivel de usuario experto.

Es trivialmente fácil crear un vbscript para iniciar el cuadro de diálogo, pero (hasta donde yo sé con mi conocimiento limitado) (a) WIA requiere un host para manejar la imagen escaneada, por lo que cualquier cosa que haga deberá recibir y almacenar la imagen. (no simplemente iniciar el diálogo) y; (b) El cuadro de diálogo WIA no parece tener un modo "desatendido".

Un recurso para ti:Automatización WIA

Y un script vbs para iniciar wia (cree un archivo de texto llamado, por ejemplo launchWia.vbs):

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

Se puede ejecutar usando un archivo por lotes:

cscript launchWia.vbs
pause

Que se puede ejecutar a través de un atajo.

Nuevamente, esto probablemente no le brindará nada porque no maneja la imagen. Consulte los documentos de MSDN para ver ejemplos relacionados con el manejo de imágenes.

Respuesta4

escanear.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"

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

información relacionada