О продукте
Отзывы |
VintaSoftTwain.NET SDK - FAQОбщие вопросы:
Распространение:
Установка:
Программирование:
Web:
Базы данных:
Для каких целей могу я использовать библиотеку?Данная библиотека может использоваться для управления работой сканеров, цифровых и веб камер и любых других устройств, которые поддерживают TWAIN стандарт.
Что включает в себя библиотека?The library contains:
В каких языках программирования могу я использовать библиотеку?Лицензия разработчика и лицензия для компании позволяют использовать компонент в:
Лицензия для сервера позволяет использовать компонент в:
Какие ограничения имеет незарегистрированная версия библиотеки?Ограничения незарегистрированной версии библиотеки:
Все эти ограничения удалены в зарегистрированной версии библиотеки.
Я не нашел ответа на свой вопрос. Что мне делать?Информация по большинству вопросов может быть найдена в документации или в этом FAQ. Если Вы не нашли ответа на свой вопрос, тогда напишите письмо в службу технической поддержки.
Какие файлы мне нужно включать в дистрибутив моей программы?Вам нужно включить в дистрибутив Вашей программы только один файл: Vintasoft.Twain.dll. При установке Вашей программы этот файл должен быть помещен в каталог на который была ссылка при компиляции программы.
Могу я распространять VintaSoft.Twain компонент вместе с моим приложением без какой либо дополнительной оплаты?Да, Вы можете распространять компонент вместе со своим приложением. Вы платите только за первоначальную регистрацию. Лицензия для компании не имеет ограничений в распространении. Лицензия для разработчика имеет некоторые ограничения в распространении. Распространение с Лицензией для сервера требует оплаты для каждого сервера. Пожалуйста, читайте лицензионное соглашение.
Могу я использовать библиотеку VintaSoftTwain.NET в 64-х битной версии Windows?Да, Вы можете использовать библиотеку VintaSoftTwain.NET в 64-х битной версии Windows. Вот список шагов которые необходимо выполнить:
Как мне добавить VintaSoft.Twain компонент на форму моего .NET приложения?Чтобы добавить VintaSoft.Twain компонент на форму необходимо выполнить следующее:
Как мне получить черно-белые изображения (документы)?Вот пример кода для получения черно-белых изображений:
Private Sub StartScan()
Try
VSTwain1.StartDevice()
If VSTwain1.SelectSource() Then
VSTwain1.OpenDataSource()
VSTwain1.PixelType = PixelType.BW
VSTwain1.Acquire()
End If
Catch ex As TwainException
MsgBox(ex.Message)
End Try
End Sub
Могу ли я управлять лотком автоматической подачи документов без пользовательского интерфейса?Вот пример показывающий как можно управлять работой сканера с лотком автоматической подачи документов без пользовательского интерфейса:
Private Sub StartScanButton_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles StartScanButton.Click
Try
VSTwain1.StartDevice()
VSTwain1.SelectSource()
VSTwain1.ShowUI = false
VSTwain1.DisableAfterAcquire = true
VSTwain1.MaxImages = 1
VSTwain1.AutoCleanBuffer = true
VSTwain1.OpenDataSource()
VSTwain1.UnitOfMeasure = UnitOfMeasure.Inches
VSTwain1.PixelType = PixelType.RGB
VSTwain1.Resolution = 200
VSTwain1.TiffMultiPage = true
VSTwain1.TiffCompression = TiffCompression.Auto
If VSTwain1.Duplex <> DuplexMode.None Then
VSTwain1.DuplexEnabled = true
End If
If VSTwain1.FeederPresent Then
VSTwain1.FeederEnabled = true
VSTwain1.AutoFeed = true
VSTwain1.XferCount = -1
If VSTwain1.FeederLoaded Then
VSTwain1.Acquire()
Endif
Endif
Catch ex As TwainException
MsgBox(ex.Message)
End Try
End Sub
Private Sub VSTwain1_ImageAcquired(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles VSTwain1.ImageAcquired
Try
VStwain1.SaveImage(0,"c:\test.tiff")
Catch ex As ImagingException
MsgBox(ex.Message)
End Try
End Sub
Private Sub VSTwain1_ScanCompleted(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles VSTwain1.ScanCompleted
If VSTwain1.ErrorCode <> ErrorCode.None Then
MsgBox(VSTwain1.ErrorString)
Else
MsgBox("Scan process is completed.")
End If
End Sub
Могу ли я получать изображения со сканера в модальном цикле без использования пользовательского интерфейса?Вот пример показывающий как можно управлять работой сканера с лотком автоматической подачи документов без пользовательского интерфейса:
Private Sub StartScanButton_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles StartScanButton.Click
Try
VSTwain1.StartDevice()
VSTwain1.SelectSource()
VSTwain1.ShowUI = false
VSTwain1.DisableAfterAcquire = true
VSTwain1.MaxImages = 1
VSTwain1.AutoCleanBuffer = true
VSTwain1.OpenDataSource()
VSTwain1.UnitOfMeasure = UnitOfMeasure.Inches
VSTwain1.PixelType = PixelType.RGB
VSTwain1.Resolution = 200
VSTwain1.TiffMultiPage = true
VSTwain1.TiffCompression = TiffCompression.Auto
If VSTwain1.Duplex <> DuplexMode.None Then
VSTwain1.DuplexEnabled = true ' enable duplex
End If
If VSTwain1.FeederPresent Then
VSTwain1.FeederEnabled = true
VSTwain1.AutoFeed = true
VSTwain1.XferCount = -1
If VSTwain1.FeederLoaded Then
While VSTwain1.AcquireModal()
Try
VStwain1.SaveImage(0,"c:\test.tiff")
Catch ex As TwainException
MsgBox(ex.Message)
End Try
End While
VSTwain1.StopDevice()
MsgBox "Scan completed."
Endif
Endif
Catch ex As TwainException
MsgBox(ex.Message)
End Try
End Sub
Мне нужно отсканировать только часть изображения. Как это сделать?Используйте следующий код чтобы получить часть изображения ограниченную прямоугольником (0.5,0.5) - (6,8): VSTwain1.StartDevice() VSTwain1.ShowUI = False VSTwain1.OpenDataSource() ............. VSTwain1.UnitOfMeasure = UnitOfMeasure.Inches VSTwain1.SetImageLayout(0.5,0.5,6,8) VSTwain1.Acquire()
Могу ли я выбрать нужное мне устройство без стандартного диалога выбора устройства?Да. Можно использовать следующий код для нумерации устройств:
VSTwain1.StartDevice()
For i = 0 To VSTwain1.SourcesCount - 1
sourceInfo = VSTwain1.GetSourceInfo(i)
If sourceInfo.IsTwain2Compatible Then
MsgBox "Device " + sourceInfo.ProductName + _
" is TWAIN 2.0 compatible."
Else
MsgBox "Device " + sourceInfo.ProductName + _
" is not TWAIN 2.0 compatible."
End If
Next
А этот код для выбора первого устройства:
VSTwain1.StartDevice() VSTwain1.SourceIndex = 0 ..... VSTwain1.AcquireХотя самый лучший вариант следующий:
VSTwain1.StartDevice()
For i = 0 To VSTwain1.SourcesCount - 1
If VSTwain1.GetSourceProductName(i) = "Your device name" Then
VSTwain1.SourceIndex = i
break
End If
Next
.....
В этом случае необходимо знать правильное название устройства.
Как мне отключить окно индикатора процесса сканирования при получении изображений без пользовательского интерфейса?Стандарт TWAIN позволяет отключать окно индикатора процесса сканирования, если пользовательский интерфейс не используется (ShowUI=False). Это можно сделать следующим образом: VSTwain1.StartDevice() VSTwain1.ShowUI = false VSTwain1.DisableAfterAcquire = true VSTwain1.MaxImages = 1 VSTwain1.OpenDataSource() VSTwain1.ShowIndicators = 0 VSTwain1.Acquire()
Я хочу создать собственный индикатор процесса сканирования. Возможно ли это?Да, это возможно, если изображение передается от сканера к приложению через память (Memory transfer). Для создания своего индикатора процесса сканирования необходимо использовать событие Progress, вот пример: Private Sub VSTwain1_ImageProcessingProgress(ByVal sender As Object, _
ByVal e As Vintasoft.Twain.ProgressEventArgs) _
Handles VSTwain1.Progress
Select Case e.Action
Case Action.Deskew
txtAction.Text = "Deskewing..."
Case Action.Despecle
txtAction.Text = "Despeckling..."
Case Action.BorderDetection
txtAction.Text = "Border detecting..."
Case Action.Rotation
txtAction.Text = "Rotating..."
Case Action.ImageScan
txtAction.Text = "Image scan..."
Case Action.ImageSaving
txtAction.Text = "Saving image to PDF document..."
End Select
progressBar1.Value = e.percentComplete
e.interrupt = bFinishFlag
End Sub
Как мне установить разное разрешение для оси X и Y во время сканирования изображений?Вот пример в котором разрешение по оси X устанавливается равным 4800 dpi, а по оси Y равным 9600 dpi: VSTwain1.StartDevice() VSTwain1.ShowUI = false VSTwain1.DisableAfterAcquire = true VSTwain1.MaxImages = 1 VSTwain1.OpenDataSource() VSTwain1.UnitOfMeasure = UnitOfMeasure.Inches VSTwain1.Capability = Capability.IXResolution VSTwain1.CapType = CapType.OneValue VSTwain1.CapValue = 4800 ' 4800 dpi VSTwain1.SetCap() VSTwain1.Capability = Capability.IYResolution VSTwain1.CapType = CapType.OneValue VSTwain1.CapValue = 9600 ' 9600 dpi VSTwain1.SetCap() VSTwain1.Acquire()
Я хочу запустить процесс сканирования в отдельном потоке. Возможно ли это?Да, это возможно, если использовать метод AcquireModal, вот пример для C#:
.....
public class Form1 : System.Windows.Forms.Form
{
private VSTwain twain=null;
.....
private void buttonScanASync_Click(object sender, System.EventArgs e)
{
ThreadStart ts = new ThreadStart(this.doScanning);
Thread t = new Thread(ts);
t.Name = "Scan-Thread";
t.Start();
}
private void doScanning()
{
twain = new VSTwain();
try
{
twain.StartDevice();
twain.ShowUI = false;
if (twain.SelectSource())
{
while (twain.AcquireModal())
{
pictureBox.Image = twain.GetCurrentImage();
}
}
twain.StopDevice();
}
catch (TwainException ex)
{
MessageBox.Show(ex.Message);
}
}
.....
}
.....
Наша организация испрользует сетевой сканер с автоматической подачей листов (ADF) и мы обрабатываем множество документов каждый день. Как мы можем автоматизировать нашу работу? Хотелось бы сохранять каждый документ в отдельном файле.Вы можете использовать пустую страницу как разделитель документов и определять пустые страницы с помощью метода IsBlankPage. Вот пример: Dim documentsCounter as Integer
............
documentsCounter = 0
............
Private Sub StartScan()
Try
VSTwain1.StartDevice()
If VSTwain1.SelectSource() = 1 Then
VSTwain1.ShowUI = false
VSTwain1.DisableAfterAcquire = true
VSTwain1.MaxImages = 1
VSTwain1.AutoCleanBuffer = true
VSTwain1.TiffMultiPage = true
VSTwain1.TiffCompression = TiffCompression.Auto
VSTwain1.OpenDataSource()
VSTwain1.UnitOfMeasure = UnitOfMeasure.Inches
VSTwain1.PixelType = PixelType.GRAY
VSTwain1.Resolution = 200 ' 200 dpi
If VSTwain1.Duplex <> DuplexMode.None Then
VSTwain1.DuplexEnabled = true
End If
If VSTwain1.FeederPresent Then
VSTwain1.XferCount = -1
VSTwain1.FeederEnabled = true
VSTwain1.AutoFeed = true
If VSTwain1.FeederLoaded Then
VSTwain1.Acquire()
End If
End If
End If
Catch ex As TwainException
MsgBox(ex.Message)
End Try
End Sub
Private Sub VSTwain1_ImageAcquired(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles VSTwain1.ImageAcquired
If VSTwain1.IsBlankImage(0) Then ' check the first image (page)
documentsCounter = documentsCounter + 1
End If
Try
VStwain1.SaveImage(0,"c:\documents\doc"+Str(documentsCounter)+".pdf")
Catch ex As PdfException
MsgBox(ex.Message)
End Try
End Sub
Private Sub VSTwain1_ScanCompleted(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles VSTwain1.ScanCompleted
If VSTwain1.ErrorCode <> ErrorCode.None Then
MsgBox(VSTwain1.ErrorString)
Else
MsgBox("Scan process is completed.")
End If
End Sub
Могу я использовать patch-коды для разделения пакетных заданий? Если да, как мне определить конец пакетного задания?Вы можете разделять пакетные задания, если будете использовать возможность CAP_JOBCONTROL. Вот пример для Visual Basic .NET:
Dim jobsCounter As Integer
Private Sub Form_Load()
jobsCounter = -1
End Sub
Private Sub Scan_Click()
VSTwain1.StartDevice
VSTwain1.MaxImages = 1
VSTwain1.ShowUI = false
VSTwain1.DisableAfterAcquire = true
VSTwain1.TiffMultiPage = true
VSTwain1.OpenDataSource
' 1 - Detect and include job separator and continue scanning.
' 3 - Detect and exclude job separator and continue scanning.
VSTwain1.JobControl = 1
jobsCounter = jobsCounter + 1
VSTwain1.Acquire
End Sub
Private Sub VSTwain1_ImageAcquired(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles VSTwain1.ImageAcquired
If VSTwain1.EndOfJob Then
jobsCounter = jobsCounter + 1
Else
VSTwain1.SaveImage 0, "c:\job"+jobsCounter.ToString()+".tif"
End If
End Sub
Private Sub VSTwain1_ScanCompleted(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles VSTwain1.ScanCompleted
If VSTwain1.ErrorCode <> ErrorCode.None Then
MsgBox(VSTwain1.ErrorString)
Else
MsgBox("Scan process is completed.")
End If
End Sub
.....
Я хочу сохранить приобретенные изображения в своем буфере для последующей их обработки. Как мне это сделать?Методы GetImage/GetCurrentImage возвращают новый объект Bitmap и Вы можете использовать его в своей коллекции: ... Dim colDocumentPages As New Collection ... Dim picNewPage As Image = vnsScanner.GetCurrentImage() colDocumentPages.Add(picNewPage) ...
Могу ли я сохранить отсканированное изображение в PDF документ?Да, это возможно. Отсканированное изабражение может быть сохранено как новый или добавлено в существующий PDF документ. Вот пример для VB.NET:
VSTwain1.PdfDocumentInfo.Author = "VintaSoft Ltd."
VSTwain1.PdfDocumentInfo.Title = "Documents acquired from " + _
VSTwain1.GetSourceProductName(VSTwain1.SourceIndex)
VSTwain1.PdfDocumentInfo.Creator = "VintaSoftTwain.NET SDK"
VSTwain1.PdfDocumentInfo.ModificationDate = DateTime.Now
VSTwain1.PdfMultiPage = true
VSTwain1.SaveImage(0, "c:\test.pdf")
Как можно получить расширенную информацию об изображении от сканера?Данный пример иллюстрирует как получить информацию о штрих-кодах найденных в отсканированном изображении:
Public Sub ScanWithoutUI()
VSTwain1.AppProductName = "MyTwainApplication"
Try
VSTwain1.StartDevice()
VSTwain1.SelectSource()
VSTwain1.ShowUI = false
VSTwain1.ExtendedImageInfoCollection.Add(New _
ExtendedImageInfo(ExtendedImageInfoId.BarcodeCount))
VSTwain1.ExtendedImageInfoCollection.Add(New _
ExtendedImageInfo(ExtendedImageInfoId.BarcodeType))
VSTwain1.ExtendedImageInfoCollection.Add(New _
ExtendedImageInfo(ExtendedImageInfoId.BarcodeTextLength))
VSTwain1.ExtendedImageInfoCollection.Add(New _
ExtendedImageInfo(ExtendedImageInfoId.BarcodeText))
While VSTwain1.AcquireModal()
If Not (PictureBox1.Image Is Nothing) Then
PictureBox1.Image.Dispose()
PictureBox1.Image = Nothing
End If
PictureBox1.Image = VSTwain1.GetCurrentImage
VSTwain1.SaveImage 0, "c:\test.tiff"
' retrieve extended image info
Dim barcodeCount As ExtendedImageInfo = _
VSTwain1.ExtendedImageInfoCollection(0)
If barcodeCount.Items IsNot Nothing And barcodeCount.Items.Length > 0 Then
If barcodeCount.Items(0) > 0 Then
Dim barcodeType As ExtendedImageInfo = _
VSTwain1.ExtendedImageInfoCollection(1)
Dim barcodeTextLength As ExtendedImageInfo = _
VSTwain1.ExtendedImageInfoCollection(2)
Dim barcodeText As ExtendedImageInfo = _
VSTwain1.ExtendedImageInfoCollection(3)
Dim i As Integer, infoString As String
For i = 0 To barcodeCount.Items(0) - 1
infoString = ""
If barcodeType.IsValid Then
infoString = "BarcodeType=" + barcodeType.Items(i) + " "
Else
infoString = "BarcodeType=Undefined "
End If
If barcodeText.IsValid Then
infoString = "BarcodeText='" + barcodeText.Items(i) + "'"
Else
infoString = "BarcodeText=Undefined "
End If
MsgBox(infoString)
Next i
End If
End If
End While
Catch ex As TwainException
MsgBox ex.Message
Catch ex As ImagingException
MsgBox ex.Message
End Try
End Sub
Как мне получить 48-битное изобразение со сканера?Да. Библиотека VintaSoftTwain.NET позволяет получить 48-битные цветные изображения или 16-битные серые изображения. Изображения могут быть сохранены без потери глубины цвета только в TIFF файлы. VSTwain1.OpenDataSource() VSTwain1.PixelType = PixelType.RGB VSTwain1.Capability = DeviceCapability.IBitDepth VSTwain1.CapType = CapType.OneValue VSTwain1.CapValue = 16 ' 16 bits per color component VSTwain1.SetCap() VSTwain1.Acquire() Здесь приведен пример демонстрирующий как получить 24-битное цветное изображение со сканера без пользовательского интерфейса: VSTwain1.OpenDataSource() VSTwain1.PixelType = PixelType.RGB VSTwain1.Capability = DeviceCapability.IBitDepth VSTwain1.CapType = CapType.OneValue VSTwain1.CapValue = 8 ' 8 bits per color component VSTwain1.SetCap() VSTwain1.Acquire() Здесь приведен пример демонстрирующий как получить 16-битное серое изображение со сканера без пользовательского интерфейса: VSTwain1.OpenDataSource() VSTwain1.PixelType = PixelType.Gray VSTwain1.Capability = DeviceCapability.IBitDepth VSTwain1.CapType = CapType.OneValue VSTwain1.CapValue = 16 ' 16 bits per color component VSTwain1.SetCap() VSTwain1.Acquire()
Как мне создать профиль сканирования для высокоскоросного сканера?Да, библиотека позволяет загружать/сохранять предопределенные профили сканированя для средне- и высоко-скоросных сканеров.
VSTwain1.OpenDataSource()
Dim fs As FileStream = New FileStream("scanner-setup.xml", FileMode.Append, FileAccess.Write)
VSTwain1.SaveDeviceSettings(fs)
fs.Close()
Здесь приведен примен демонстрирующий как можно загрузить сохраненные настройки в устройство:
VSTwain1.OpenDataSource()
Dim fs As FileStream = New FileStream("scanner-setup.xml", FileMode.Open, FileAccess.Read)
VSTwain1.LoadDeviceSettings(fs)
fs.Close()
VSTwain1.Acquire()
Какие шаги мне нужно выполнить чтобы добавить библиотеку к моему интернет проекту?Вы должны выполнить следующие действия на стороне сервера:
< OBJECT ID="VSTwain1" WIDTH=1 HEIGHT=1 Правильный номер версии очень важен! Вы должны выполнить следующие действия на стороне клиента:
Я хочу создать скрипт на моем веб сервере, который будут использовать пользователи для автоматической установки необходимых параметров безопасности .NET Framework на компьютере пользователя. Могу я это сделать?Вы должны создать скрипт, который будет запускать следующую команду: caspol.exe -q -machine -addgroup All_Code -site www.my-company.com FullTrust
Я получил сообщение "Your .NET Framework Security settings must be configured to run the components in your browser" во время запуска моего веб приложения. Что я делаю не верно?Прежде всего Вы должны настроить безопасность .NET Framework как описано здесь. Далее Вам необходимо проверить версию Vintasoft.Twain.dll которую Вы используете (например, 5.0.5.3). После этого Вы должны правильно описать объект OBJECT на Вашей веб странице. Использование правильного номера версии очень важно! Вот пример: < OBJECT ID="VSTwain1" WIDTH=1 HEIGHT=1 Это все что Вы должны сделать.
Я пытаюсь выбрать устройство с помощью свойства SourceIndex в Internet Explorer, но получаю ошибку. Почему?Каждый объект на веб странице в Internet Explorer имеет предопределенное свойство SourceIndex - это свойство доступно только для чтения. Вы должны использовать следующий код чтобы работать с свойством SourceIndex объекта VSTwain в JavaScript или VBScript: VSTwain1.StartDevice() VSTwain1.object.SourceIndex = 1 ' second device VSTwain1.Acquire()
Могу ли я загрузить изображения полученные со сканера на веб сервер использующий интегрированную аутентификацию Windows (integrated windows authentication) ?Да, библиотека позволяет использовать любые методы аутентификации поддерживаемые .NET Framework. Следующий пример иллюстрирует как отослать изображения от имени текущего пользователя Windows: ... httpUpload1.Url = "http://localhost/vstwaindemo/imageupload.aspx" httpUpload1.UseDefaultCredentials = true ... А вот пример иллюстрирующий как можно одновременно использовать несколько методов авторизации:
...
Dim myCache As New CredentialCache()
myCache.Add(New Uri("http://www.my-web-server.com/"), "Basic",
New NetworkCredential(UserName, SecurelyStoredPassword))
myCache.Add(New Uri("http://www.my-web-server.com/"), "Digest",
New NetworkCredential(UserName, SecurelyStoredPassword, Domain))
httpUpload1.Credentials = myCache
...
Могу ли я загрузить изображения полученные со сканера на веб сервер использующий аутентификацию с помощью cookies (Cookieless Forms authentication) ?Да, Вы можете это сделать, пожалуйста посмотрите примеры 8 и 9 расположенные здесь.
Могу я сохранять приобретенные изображения в таблице MS SQL сервера?Да, Вы можете это сделать, пожалуйста смотрите пример 3 здесь.
Я хочу сохранять изображения полученные со сканера как PDF документы в базе данных. Могу я это делать?Да, Вы можете сохранить полученные изображения сначала в поток (память) и потом сохранить данные из потока (памяти) в базу данных. Вот пример который иллюстрирует как можно сохранить каждое полученное изображение в базе данных как отдельный PDF документ: Dim mem As MemoryStream = VSTwain1.GetImageAsStream(0, ImageFileFormat.PDF) А вот пример который илюстрирует как сохранить все полученные изображения в базе данных как один многостраничный PDF документ:
Dim mem As MemoryStream = VSTwain1.GetImageAsStream(0, ImageFileFormat.PDF)
Dim i As Integer
For i = 1 To VSTwain1.NumImages - 1
VSTwain1.SaveImageToStream(i, mem, ImageFileFormat.PDF)
Next i
|