Adquirir imágenes de un escáner TWAIN mediante la aplicación de consola .NET en Linux

Categoría del blog: TWAIN.NETLinux

02.05.2023

Este artículo explica cómo crear una aplicación de consola .NET y adquirir imágenes de un escáner TWAIN en Ubuntu. Para adquirir imágenes desde un escáner TWAIN, se utiliza VintaSoft TWAIN .NET SDK.

Pasos para completar esta tarea:
  1. Abrir el escritorio de Ubuntu.

  2. Crear una carpeta que almacenará los archivos de la aplicación .NET. Crearemos la carpeta "Scan_Images" en el escritorio del usuario y accederemos a ella.


  3. Abrir la terminal de comandos. Esto se puede hacer seleccionando "Abrir en la terminal" en el menú contextual o presionando la combinación de teclas Ctrl+Alt+T.


  4. Llame al comando en la terminal, que crea un proyecto de una nueva aplicación .NET de consola:
    dotnet new console --framework net7.0
    



    El proyecto creado contiene los archivos "Scan_Images.csproj" y "Program.cs", que contienen el código C# de la aplicación. Cierre la terminal.

  5. Abra el archivo de proyecto "Scan_Images.csproj" en el editor de texto y cambie el texto del archivo al siguiente texto:
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net7.0</TargetFramework>
        <RootNamespace>ConsoleApp1</RootNamespace>
        <ImplicitUsings>enable</ImplicitUsings>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Vintasoft.Shared" Version="3.4.0.1" />
        <PackageReference Include="Vintasoft.Shared" Version="14.0.1.1" />
      </ItemGroup>
    
    </Project>
    



    El proyecto modificado hace referencia a nuget-packages para VintaSoft TWAIN .NET SDK (Vintasoft.Shared.dll, Vintasoft.Twain.dll).

  6. Abra el archivo "Program.cs" y cambie su código al siguiente código C#:
    using System;
    using System.IO;
    
    using Vintasoft.Twain;
    
    namespace ConsoleApp1
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                Vintasoft.Twain.TwainGlobalSettings.Register("VintaSoft", "support@vintasoft.com", "2023-04-02", "...");
            
                try
                {
                    // create TWAIN device manager
                    using (DeviceManager deviceManager = new DeviceManager())
                    {
                        // open TWAIN device manager
                        if (!OpenDeviceManager(deviceManager))
                            return;
    
                        // select TWAIN device
                        Device device = SelectDevice(deviceManager);
                        // if device is not selected
                        if (device == null)
                            return;
    
                        // specify that device UI should not be shown
                        device.ShowUI = false;
                        // specify that image scanning progess UI should not be shown
                        device.ShowIndicators = false;
                        // specify that device must be disabled after image scan
                        device.DisableAfterAcquire = true;
    
                        // open the device
                        device.Open();
    
                        // set device parameters
                        device.TransferMode = TransferMode.Native;
                        device.PixelType = PixelType.BW;
                        device.XferCount = 1;
    
                        // create directory for TIFF file
                        string directoryForImages = Path.GetDirectoryName(Directory.GetCurrentDirectory());
                        directoryForImages = Path.Combine(directoryForImages, "Images");
                        if (!Directory.Exists(directoryForImages))
                            Directory.CreateDirectory(directoryForImages);
    
                        string multipageTiffFilename = Path.Combine(directoryForImages, "multipage.tif");
    
                        // acquire image(s) from the device
                        int imageIndex = 0;
                        AcquireModalState acquireModalState = AcquireModalState.None;
                        do
                        {
                            acquireModalState = device.AcquireModal();
                            switch (acquireModalState)
                            {
                                case AcquireModalState.ImageAcquired:
                                    // save acquired image to a file
                                    device.AcquiredImage.Save(multipageTiffFilename);
                                    // dispose an acquired image
                                    device.AcquiredImage.Dispose();
    
                                    Console.WriteLine(string.Format("Image{0} is saved.", imageIndex++));
                                    break;
    
                                case AcquireModalState.ScanCompleted:
                                    Console.WriteLine("Scan is completed.");
                                    break;
    
                                case AcquireModalState.ScanCanceled:
                                    Console.WriteLine("Scan is canceled.");
                                    break;
    
                                case AcquireModalState.ScanFailed:
                                    Console.WriteLine(string.Format("Scan is failed: {0}", device.ErrorString));
                                    break;
    
                                case AcquireModalState.UserInterfaceClosed:
                                    Console.WriteLine("User interface is closed.");
                                    break;
                            }
                        }
                        while (acquireModalState != AcquireModalState.None);
    
                        // close the device
                        device.Close();
    
                        // close the device manager
                        deviceManager.Close();
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: " + ex.Message);
                }
    
                Console.WriteLine("Press any key to continue...");
                Console.ReadKey();
            }
    
            /// <summary>
            /// Opens the TWAIN device manager.
            /// </summary>
            /// <param name="deviceManager">Device manager.</param>
            /// <returns><b>True</b> - device manager is opened successfully; otherwise, <b>false</b>.</returns>
            private static bool OpenDeviceManager(DeviceManager deviceManager)
            {
                // try to use TWAIN device manager 2.x
                deviceManager.IsTwain2Compatible = true;
                // if TWAIN device manager 2.x is not available
                if (!deviceManager.IsTwainAvailable)
                {
                    Console.WriteLine("TWAIN device manager is not available.");
                    return false;
                }
    
                // open the device manager
                deviceManager.Open();
    
                return true;
            }
    
            /// <summary>
            /// Selects the TWAIN device.
            /// </summary>
            /// <param name="deviceManager">TWAIN device manager.</param>
            /// <returns>TWAIN device if device is selected; otherwiase, <b>null</b>.</returns>
            private static Device SelectDevice(DeviceManager deviceManager)
            {
                int deviceCount = deviceManager.Devices.Count;
                // if no devices are found in the system
                if (deviceCount == 0)
                {
                    Console.WriteLine("Devices are not found.");
                    return null;
                }
    
                Console.WriteLine("Device list:");
                for (int i = 0; i < deviceCount; i++)
                {
                    Console.WriteLine(string.Format("{0}. {1}", i + 1, deviceManager.Devices[i].Info.ProductName));
                }
    
                int deviceIndex = -1;
                while (deviceIndex < 0 || deviceIndex > deviceCount)
                {
                    Console.Write(string.Format("Please select device by entering the device number from '1' to '{0}' or press '0' to cancel: ", deviceCount));
                    deviceIndex = Console.ReadKey().KeyChar - '0';
                    Console.WriteLine();
                }
                Console.WriteLine();
    
                if (deviceIndex == 0)
                    return null;
    
                return deviceManager.Devices[deviceIndex - 1];
            }
    
        }
    }
    



    El código de la aplicación genera una lista de escáneres TWAIN disponibles, permite seleccionar el escáner TWAIN, adquiere imágenes en blanco y negro del escáner TWAIN y guarda las imágenes escaneadas en un archivo TIFF de varias páginas.

  7. Obtenga el código para usar la versión de evaluación en Linux utilizando la forma descrita en la documentation e inserte el código obtenido en el código C# del archivo "Program.cs".


  8. Abra la terminal y compile el proyecto .NET usando el siguiente comando:
    dotnet build Scan_Images.csproj
    



    Cerrar la terminal.

  9. Vaya a la carpeta "bin/Debug/net7.0/".


  10. Abre la terminal y ejecuta la aplicación .NET con el siguiente comando:
    dotnet ./Scan_Images.dll
    



    Cerrar la terminal.

  11. Abre el archivo TIFF multipágina creado y observa los resultados: