Bilder von einem TWAIN-Scanner mit einer .NET-Konsolenanwendung unter Linux erfassen

Blogkategorie: TWAIN.NETLinux

02.03.2023

Dieser Artikel erklärt, wie Sie eine .NET-Konsolenanwendung erstellen und Bilder von einem TWAIN-Scanner unter Ubuntu erfassen. Für die Bilderfassung vom TWAIN-Scanner wird das VintaSoft TWAIN .NET SDK verwendet.

Die folgenden Schritte sind erforderlich:
  1. Öffnen Sie den Ubuntu-Desktop.

  2. Erstellen Sie einen Ordner, in dem die Dateien der .NET-Anwendung gespeichert werden. Erstellen Sie dazu den Ordner "Scan_Images" auf dem Desktop des aktuellen Benutzers und wechseln Sie in diesen Ordner.


  3. Öffnen Sie das Terminal. Dies kann über den Menüpunkt "Im Terminal öffnen" im Kontextmenü oder durch Drücken der Tastenkombination Strg+Alt+T erfolgen.


  4. Führen Sie den Befehl im Terminal aus, der ein neues Konsolenprojekt für eine .NET-Anwendung erstellt:
    dotnet new console --framework net7.0
    



    Das erstellte Projekt enthält die Projektdatei "Scan_Images.csproj" und die Datei "Program.cs", die den C#-Code der Anwendung enthält. Schließen Sie das Terminal.

  5. Öffnen Sie die Projektdatei "Scan_Images.csproj" in einem Texteditor und ändern Sie den Dateitext wie folgt:
    <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>
    



    Das geänderte Projekt referenziert die NuGet-Pakete für das VintaSoft TWAIN .NET SDK (Vintasoft.Shared.dll, Vintasoft.Twain.dll).

  6. Öffnen Sie die Datei "Program.cs" und ändern Sie deren Code in folgenden C#-Code:
    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];
            }
    
        }
    }
    



    Der Anwendungscode gibt eine Liste der verfügbaren TWAIN-Scanner aus, ermöglicht die Auswahl eines TWAIN-Scanners, erfasst Schwarzweißbilder vom TWAIN-Scanner und speichert die gescannten Bilder in einer mehrseitigen TIFF-Datei.

  7. Den Code für die Verwendung der Evaluierungsversion unter Linux gemäß der Beschreibung in Dokumentation abrufen und in den C#-Code der Datei "Program.cs" einfügen.


  8. Öffnen Sie das Terminal und kompilieren Sie das .NET-Projekt mit folgendem Befehl:
    dotnet build Scan_Images.csproj
    



    Schließen Sie das Terminal.

  9. Wechseln Sie zum Ordner "bin/Debug/net7.0/".


  10. Öffnen Sie das Terminal und führen Sie die .NET-Anwendung mit folgendem Befehl aus:
    dotnet ./Scan_Images.dll
    



    Schließen Sie das Terminal.

  11. Öffnen Sie die erstellte mehrseitige TIFF-Datei und betrachten Sie das Ergebnis: