Сканирование изображений с помощью .NET приложения для Linux

Категория: TWAIN.NETLinux

2 марта 2023

В данной статье рассказывается как создать .NET консольное приложения для получения изображений от TWAIN сканера в Ubuntu. Для получения изображений от TWAIN сканера используется VintaSoft TWAIN .NET SDK.

Для выполнения задачи требуется выполнить следующие шаги:
  1. Открыть Ubuntu десктоп.

  2. Создать папку в которой будут храниться файлы .NET приложения. Давайте создадим папку "Scan_Images" на рабочем столе текущего пользователя и перейдем в папку.


  3. Открыть терминал для выполнения консольных команд. Это можно сделать вызвав контекстное меню и выбрав меню "Open in Terminal". Также можно нажать комбинацию клавиш Ctrl+Alt+T.


  4. В терминале вызвать команду, которая создаст проект нового .NET консольного приложения:
    dotnet new console --framework net7.0
    



    После выполнения команды в папке появится файл проекта "Scan_Images.csproj" и файл "Program.cs", который содержит C# код приложения. Закрыть терминал.

  5. Открыть файл проекта "Scan_Images.csproj" в текстовом редакторе и изменить текст файла на следующий текст:
    <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>
    



    Измененный проект ссылается на nuget-пакеты для VintaSoft TWAIN .NET SDK (Vintasoft.Shared.dll, Vintasoft.Twain.dll).

  6. Открыть файл "Program.cs" и заменить код в файле на следующий 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];
            }
    
        }
    }
    



    Код приложения выводит список доступных TWAIN сканеров, позволяет выбрать TWAIN сканер, получить черно-белые изображения от TWAIN сканера и сохранить отсканированные изображения в многостраничный TIFF файл.

  7. Получить код для использования оценочной лицензии в Linux как описано в документации и внедрить полученный код в C# код в файле "Program.cs".


  8. Открыть терминал и скомпилировать .NET проект с помощью следующей команды:
    dotnet build Scan_Images.csproj
    



    Закрыть терминал.

  9. Перейти в папку "bin/Debug/net7.0/".


  10. Открыть терминал и запустить созданное .NET приложение с помощью следующей команды:
    dotnet ./Scan_Images.dll
    



    Закрыть терминал.

  11. Открыть созданный многостраничный TIFF файл и посмотреть результат: