Acquisition d'images depuis un scanner TWAIN à l'aide d'une application console .NET sous Linux

Catégorie du blog: TWAIN.NETLinux

02.03.2023

Cet article explique comment créer une application console .NET et acquérir des images à partir d'un scanner TWAIN sous Ubuntu. Pour l'acquisition d'images à partir d'un scanner TWAIN, le VintaSoft TWAIN .NET SDK. est utilisé.

Voici les étapes à suivre:
  1. Ouvrez le bureau Ubuntu.

  2. Créez un dossier qui contiendra les fichiers de l'application .NET. Créons un dossier "Scan_Images" sur le bureau de l'utilisateur actuel et accédons-y.


  3. Ouvrez le terminal de commande. Vous pouvez le faire en choisissant l'option "Ouvrir dans le terminal" dans le menu contextuel ou en appuyant sur la combinaison de touches Ctrl+Alt+T.


  4. Exécutez la commande dans le terminal pour créer un projet d'application console .NET:
    dotnet new console --framework net7.0
    



    Le projet créé contient le fichier projet "Scan_Images.csproj" et le fichier "Program.cs", qui contient le code C# de l'application. Fermez le terminal.

  5. Ouvrez le fichier projet "Scan_Images.csproj" dans un éditeur de texte et modifiez son contenu comme suit:
    <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>
    



    Le projet modifié référence les packages NuGet pour VintaSoft TWAIN .NET SDK (Vintasoft.Shared.dll, Vintasoft.Twain.dll).

  6. Ouvrez le fichier "Program.cs" et modifiez son code pour utiliser le code C# suivant:
    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];
            }
    
        }
    }
    



    Le code de l’application affiche la liste des scanners TWAIN disponibles, permet de sélectionner un scanner TWAIN, acquiert des images en noir et blanc depuis ce scanner et enregistre les images numérisées dans un fichier TIFF multipage.

  7. Obtenez le code permettant d'utiliser la version d'évaluation sous Linux en suivant la méthode décrite dans la documentation et insérez le code obtenu dans le code C# du fichier " Program.cs ".


  8. Ouvrez le terminal et compilez le projet .NET à l’aide de la commande suivante:
    dotnet build Scan_Images.csproj
    



    Fermez le terminal.

  9. Accédez au dossier "bin/Debug/net7.0/".


  10. Ouvrez le terminal et exécutez l'application .NET à l'aide de la commande suivante:
    dotnet ./Scan_Images.dll
    



    Fermez le terminal.

  11. Ouvrez le fichier TIFF multipage créé et consultez les résultats: