开发与定制

如何把新扫描或者加载的图片插入到特定位置

默认情况下,扫描或加载图像时会按顺序添加。换句话说,新的扫描或加载的图像会被添加到缓冲区中图像数组的最末端。但是,在某些业务场景中,用户可能希望将这些新图像插入指定的索引。遗憾的是,Dynamic Web TWAIN没有提供内置方法。以下代码片段展示了插入新图像是如何被完成的

在扫描过程中插入图片
function acquireToIndex(index) {
    DWObject.IfAppendImage = false;
    DWObject.CurrentImageIndexInBuffer = index;
    DWObject.RegisterEvent('OnBitmapChanged', function (strUpdatedIndex, operationType, sCurrentIndex) {
        if (operationType == 2) { //inserting
            DWObject.CurrentImageIndexInBuffer ++;
        }
    });
    DWObject.AcquireImage();
}
在加载过程中插入图片
var bPostLoad = false, newIndices = [];
function loadToIndex(index) {
    bPostLoad = false;
    newIndices = [];
    DWObject.IfAppendImage = false;
    DWObject.CurrentImageIndexInBuffer = index;
    DWObject.RegisterEvent('OnPostLoad', function () {
        bPostLoad = true;
        for (var j = 0; j < newIndices.length / 2; j++)
            if (newIndices[j] != newIndices[newIndices.length - j - 1])
                DWObject.SwitchImage(newIndices[j], newIndices[newIndices.length - j - 1]);
        DWObject.IfAppendImage = true;
    });
    DWObject.RegisterEvent('OnBitmapChanged', function (strUpdatedIndex, operationType, sCurrentIndex) {
        if (operationType == 2) { //inserting
            for (var i = 0; i < newIndices.length; i++)
                newIndices[i] += 1;
            newIndices.push(parseInt(strUpdatedIndex[0]));
        }
    });
    DWObject.LoadImageEx('', 5);
}

如何重用设备设置

自定义数据源数据或CDD(Custom DataSource Data)指的是设备的所有配置。许多设备支持将CDD导出成文件或base64编码的字符串以供之后使用。通过使用相同的CDD,相同的设备始终可以执行具有相同配置的扫描作业。CDD也可以在多个设备之间共享,以确保所有设备都使用相同的设置进行扫描。要使用此功能,我们有四种方法:SetCustomDSData(), SetCustomDSDataEx(), GetCustomDSData() and GetCustomDSDataEx(). 典型的步骤有

  1. 显示扫描仪的用户界面并更改所需的所有设置。
  2. 使用GetCustomDSData()GetCustomDSDataEx()执行扫描并在事件OnPostAllTransfers的回调中记住/保存CDD。
  3. 之后,当您或任何其他需要在同一型号的设备上使用相同设置进行扫描的用户时,您可以隐藏扫描仪自己的界面,只需使用方法SetCustomDSDataEx()SetCustomDSData()将CDD传递给设备即可。
代码片段
var DWObject = null;
var Base64EncodedDSData = "";
function Dynamsoft_OnReady() {
    DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
    DWObject.RegisterEvent("OnPostAllTransfers", function () {
        Base64EncodedDSData = DWObject.GetCustomDSDataEx();
    });
}
function AcquireImage() {
    DWObject.IfDisableSourceAfterAcquire = true;
    DWObject.SelectSource(function () {
        var OnAcquireImageSuccess, OnAcquireImageFailure;
        OnAcquireImageSuccess = OnAcquireImageFailure = function () {
            DWObject.CloseSource();
        };
        DWObject.OpenSource();
        if (Base64EncodedDSData != "") {
            DWObject.IfShowUI = false;
            DWObject.SetCustomDSDataEx(Base64EncodedDSData);
        } else {
            DWObject.IfShowUI = true;
        }
        DWObject.AcquireImage(OnAcquireImageSuccess, OnAcquireImageFailure);
    }, function () { console.log("Failed to Select A Source!"); });
}

TWAIN功能底层调用实例

如何分别在X和Y方向上设置分辨率?

通过底层调用,您可以使用ICAP_XRESOLUTION和ICAP_YRESOLUTION功能分别设置X和Y方向的分辨率。

代码片段

DWObject.SelectSource();
DWObject.OpenSource();
//Set X-RESOLUTION current value.
DWObject.Capability = EnumDWT_Cap.ICAP_XRE解决方案;
DWObject.CapType = EnumDWT_CapType.TWON_RANGE;
DWObject.CapValue = 300;
if (DWObject.CapSet())
    alert("Successful");
else
    alert("Source doesn't support this capability");
//Set Y-RESOLUTION current value.
DWObject.Capability = EnumDWT_Cap.ICAP_YRE解决方案;
DWObject.CapType = EnumDWT_CapType.TWON_RANGE;
DWObject.CapValue = 200;
if (DWObject.CapSet())
    alert("Successful");
else
    alert("Source doesn't support this capability");
DWObjet.AcquireImage();

更多信息请参考 TWAIN底层功能调用.

如何自动检测和丢弃空白页?

如果设备的TWAIN驱动程序支持丢弃空白页,则可以使用驱动程序的内置功能。 您可以将IfShowUI属性设置为true以显示数据源的用户界面(UI),您可以在那里检查选项(它通常显示为‘丢弃空白页’)。 如果您不想显示源的用户界面,可以将IfAutoDiscardBlankpages设置为true或在代码中调用ICAP_AUTODISCARDBLANKPAGES功能以启用自动丢弃空白页。请注意,此属性或功能仅在扫描仪本身支持该功能(在硬件级别)时才有效。

代码片段

DWObject.SelectSource();
DWObject.OpenSource;
DWObject.IfShowUI = false;
//*Use the property
DWObject.IfAutoDiscardBlankpages = true;
//*Use capability negotiation
DWObject.Capability = EnumDWT_Cap.ICAP_AUTODISCARDBLANKPAGES;
DWObject.CapType = EnumDWT_CapType.TWON_ONEVALUE;
DWObject.CapValue = -1;//Auto
if(DWObject.CapSet){
   alert("Successful!");
}
DWObject.AcquireImage();

如果扫描仪本身不支持丢弃空白页,您也可以使用IsBlankImageExpress()方法执行此操作作为解决方法。要自动检测和丢弃空白页,您可以在每次传输后触发的OnPostTransfer事件中执行此操作。

代码片段

function DWObject_OnPostTransfer() {
DWObject.BlankImageMaxStdDev = 20;
if (DWObject.IsBlankImageExpress(DWObject.CurrentImageIndexInBuffer)) {
   DWObject.RemoveImage(DWObject.CurrentImageIndexInBuffer);
   }
}

注意:在许多情况下,扫描的空白图像可能会带来一些噪音,这些噪音会影响IsBlankImageExpress()返回的结果。要改善结果,可以调整BlankImageMaxStdDev属性的值。默认值为1(0表示单色图像)。因此,通过稍微增加该值(例如,增加到20),图像上的噪声被忽略,因此可以更快地检测到空白图像。

更多信息请参考 TWAIN底层功能调用.

如何在传输之前旋转扫描得到的图像数据?

通过底层调用,您可以使用ICAP_ROTATION功能在扫描的图像数据传输之前旋转它。

注意:在使用这些方法之前,请确保设备的驱动程序支持自动旋转。

代码片段

function btnScan()
{
    DWObject.SelectSource();
    DWObject.OpenSource();
    DWObject.MaxImagesInBuffer = 4;
   /*============== rotate ==============*/
    DWObject.Capability = EnumDWT_Cap.ICAP_ROTATION;
    DWObject.CapType  =  EnumDWT_CapType.TWON_ONEVALUE;
    DWObject.CapValue = 270; //270 degree rotation
        if (DWObject.CapSet())
            alert("Successful");
        else
            alert("Source doesn't support this capability");
    DWObject.IfDisableSourceAfterAcquire = true;
    DWObject.AcquireImage();
}

更多信息请参考 TWAIN底层功能调用.

如何使用TWAIN设备的自定义功能

要使用TWAIN驱动程序的自定义功能,您需要先获取对应功能的代码。您可以按照以下步骤操作:

  • 安装TWAIN示例应用程序.

  • 使用TWAIN示例应用程序打开源,然后检查功能的代码(十六进制值)是什么。

TWAIN Sample App1 TWAIN Sample App2

  • 例如,上图中代码0x8001用于高亮显示的自定义功能。现在我们可以使用以下代码来调用该功能。

代码片段

DWObject.SelectSource();
DWObject.OpenSource();
DWObject.Capability = 0x8001;
DWObject.CapType = 5; //TWON_ONEVALUE
DWObject.CapValue = 1;
if (DWObject.CapSet())
    alert("successful");
else
    alert("Source doesn't support this capatiblity");

更多信息请参考 TWAIN底层功能调用.


HTTP上传功能详解

如何将图像直接上传到数据库?

要将图像上传到服务器并将其直接保存到数据库中,只需重写在服务器上的操作页面即可。以下是用C#编写的示例,并使用MSSQL作为数据库

try {
    int iFileLength;
    HttpFileCollection files = HttpContext.Current.Request.Files;
    HttpPostedFile uploadfile = files["RemoteFile"];
    string strImageName = uploadfile.FileName;

    iFileLength = uploadfile.ContentLength;
    Byte[] inputBuffer = new Byte[iFileLength];
    System.IO.Stream inputStream;
    inputStream = uploadfile.InputStream;
    inputStream.Read(inputBuffer, 0, iFileLength);
    inputStream.Close();
    string sql_insertData = "INSERT INTO " + tableName + " (document_name, document_data) VALUES (@document_name, @document_data)";
    using(System.Data.SqlClient.SqlCommand sqlcmd_insertData = new System.Data.SqlClient.SqlCommand(sql_insertData, Connection)) {
        sqlcmd_insertData.Parameters.Add("@document_data", System.Data.SqlDbType.Binary, iFileLength).Value = inputBuffer;
        sqlcmd_insertData.Parameters.Add("@document_name", System.Data.SqlDbType.VarChar, 255).Value = strImageName;
        sqlcmd_insertData.ExecuteScalar();
    }
    Connection.Close();
} catch (Exception) {}

如果您使用PHP,JSP等语言,您可以查看作为官方上传示例一部分的示例脚本。

如何通过AJAX等方法来取代内置方法上传图像?

基本上,工作流程将是这样的:

  1. 将图像扫描到控件。
  2. 使用ConvertToBase64()ConvertToBlob()方法将缓冲区中的图像转换为Base64编码的字符串或Blob对象。
  3. 将字符串或Blob上载到服务器

我们将在下面的代码中使用ConvertToBase64()方法作为示例。请注意,在服务器端使用C#

客户端
// Select all images
var aryIndices = [];
for (var i = 0; i < DWObject.HowManyImagesInBuffer; i++) {
    aryIndices.push(i);
}
DWObject.ConvertToBase64(aryIndices, EnumDWT_ImageType.IT_PDF, asyncSuccessFunc, asyncFailureFunc);
function asyncSuccessFunc(result) {
    var param = encodeURIComponent("ImageName") + "=" + encodeURIComponent("uploadedImages.pdf") + "&" + encodeURIComponent("RemoteFile") + "=" + encodeURIComponent(result);
    //You can upload the image data from here
    makeRequest(strActionPage, param, false);
}
function asyncFailureFunc(errorCode, errorString) {
    alert("ErrorCode: " + errorCode + "\r" + "ErrorString:" + errorString);
}
//AJAX
function makeRequest(url, parameter, flg) {
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest(); // Set up the request.
    } else {
        if (window.ActiveXObject) {
            try {
                xhr = new ActiveXObject("MSXML2.XMLHTTP.3.0");
            } catch (ex) {
                alert(ex);
            }
        }
    }
    if (xhr) {
        if (flg) {
            xhr.open("GET", url, true); // Open the connection.
            xhr.onreadystatechange = requestresultCat;
            xhr.setRequestHeader("If-Modified-Since", "0");
            xhr.send(null);
        } else {
            xhr.open("POST", url, false);
            if (parameter != null) {
                xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xhr.send(parameter); // Send the Data.
            } else {
                xhr.send(null);
            }
        }
    } else {
        AppendMessage("&lt;b&gt;Sorry, but I couldn't create an XMLHttpRequest!&lt;/b&gt; ");
    }
}
function requestresult() {
    if (xhr.readyState == 4) {
        if (xhr.status == 200) { // File(s) uploaded.
            var outMsg;
            if (xhr.responseXML & amp; & amp; xhr.responseXML.documentElement) {
                outMsg = xhr.responseXML;
                alert(xhr.responseText);
            }
        }
    }
}
服务器端
try {
    string imageName = HttpContext.Current.Request.Form["ImageName"];
    string imageData = HttpContext.Current.Request.Form["RemoteFile"];
    string Path = System.Web.HttpContext.Current.Request.MapPath(".") + "/ImageScanned/";
    if (!Directory.Exists(Path)) {
        Directory.CreateDirectory(Path);
    }
    string outputFileName = Path + imageName;
    // Convert the Base64 UUEncoded input into binary output.
    byte[] binaryData;
    try {
        binaryData = System.Convert.FromBase64String(imageData);
    } catch (System.ArgumentNullException) {
        System.Console.WriteLine("Base 64 string is null.");
        return;
    } catch (System.FormatException) {
        System.Console.WriteLine("Base 64 string length is not " +
            "4 or is not an even multiple of 4.");
        return;
    }
    // Write out the decoded data.
    System.IO.FileStream outFile;
    try {
        outFile = new System.IO.FileStream(outputFileName,
            System.IO.FileMode.Create,
            System.IO.FileAccess.Write);
        outFile.Write(binaryData, 0, binaryData.Length);
        outFile.Close();
    } catch (System.Exception exp) {}
} catch (Exception exc) {}
如何一次上传多个文件
场景介绍

扫描多个文件后,您可能希望将它们逐个上传为单个图像。在版本13.1之前,您必须多次调用上载方法。在v13.1+中,您可以一次完成此操作。

解决方案

使用ConvertToBlob()HTTPUpload()方法。

步骤:

  • 在JavaScript中,编写类似于以下内容的代码
var i = 0;
DWObject.ClearAllHTTPFormField();
DWObject.SetHTTPFormField("UploadedImagesCount", DWObject.HowManyImagesInBuffer);
function asyncFailureFunc(errorCode, errorString) {
    alert("ErrorCode: " + errorCode + "\r" + "ErrorString:" + errorString);
}
var convertImage = function (_index) {
    DWObject.ConvertToBlob([_index], EnumDWT_ImageType.IT_JPG,
        function (result) {
            DWObject.SetHTTPFormField('image_' + _index, result, 'JPG_image_' + _index);
            i++;
            if (i < DWObject.HowManyImagesInBuffer) {
                convertImage(i);
            } else {
                DWObject.HTTPUpload("http://yourserver/youractionpage.aspx", function () {
                    console.log('success')
                }, function () {
                    console.log('failure');
                });
            }
        }, asyncFailureFunc);
};
convertImage(0);
  • 在服务器上,添加后台页面以处理上传的数据
<%@ Page Language="C#" %>

<%
    try
    {
        String strImageName;
        String strInfo = HttpContext.Current.Request["UploadedImagesCount"];
        short uploadedImagesCount = Convert.ToInt16(strInfo);
        HttpFileCollection files = HttpContext.Current.Request.Files;
        for (short i = 0; i < uploadedImagesCount; i++)
        {
            HttpPostedFile uploadfile = files["image_" + i.ToString()];
            strImageName = uploadfile.FileName;
            uploadfile.SaveAs(Server.MapPath(".") + "\\UploadedImages\\" + strImageName + ".jpg");
        }
    }
    catch
    {}
%>
如何使用FileUploader进行上传

在Dynamic Web TWAIN Version 14中,我们添加了一个名为FileUploader的新上传模块来处理图像上传。以下显示如何使用此新模块进行上传。

步骤:

  • 引用dynamsoft.upload.js文件
<script type="text/javascript" src="Resources/addon/dynamsoft.upload.js">
  • 初始化FileUploader模块
var dsUploadManager;
Dynamsoft.FileUploader.Init('', function(obj) { dsUploadManager = obj;}, function(errorcode, errorstring){alert(errorstring);});
  • 创建一个job并执行它
var job = dsUploadManager.CreateJob();
dsUploadManager.Run(job);

完整代码

var fileUploaderManager;

Dynamsoft.FileUploader.Init("", onInitSuccess, onInitFailure);

function onInitSuccess(objFileUploader) {
    fileUploaderManager = objFileUploader;
}

function onInitFailure(errorCode, errorString) {
    alert('Init failed: ' + errorString);
}

function UploadFile() {
    var job = fileUploaderManager.CreateJob();
    job.ServerUrl = 'http://yourserver/youractionpage.aspx';
    DWObject.GenerateURLForUploadData([0], EnumDWT_ImageType.IT_JPG, function(res) {
        job.SourceValue.Add(res, "sample.jpg");
        job.SourceValue.Add("D:\\test1.jpg", "test.jpg");
        job.OnUploadTransferPercentage = FileUpload_OnUploadTransferPercentage;
        job.OnRunSuccess = FileUpload_OnRunSuccess;
        job.OnRunFailure = FileUpload_OnRunFailure;
        fileUploaderManager.Run(job);
    }, function(errorCode, errorString) {console.log(errorString);});
}

function FileUpload_OnUploadTransferPercentage(job, sPercentage) {
    console.log(sPercentage);
}

function FileUpload_OnRunFailure(job, errorCode, errorString) {
    alert(errorString);
}

function FileUpload_OnRunSuccess(job) {
    alert(' upload completed! ');
}

HTTP下载功能详解

如何直接从数据库下载图像?
场景介绍

有时您可能需要从服务器下载图像文件,但该文件仅存在于数据库中。

解决方案

通过写一个后台页面DownloadFromDB.aspx并调用方法HTTPDownloadEx()可以满足要求。

步骤

  • 在服务器上,添加操作页面以从数据库中获取图像数据并将其发回。

这里我们以C#MSSQL为例,假设要下载的图像是JPEG图像,可以通过其ID(iImageID)获取。

string strConnString = "Server=***\\SQLEXPRESS;Database=" + "DemoWebTwain" + ";Integrated Security=sspi;Persist Security Info=False";
string strExc = "";
string strImageExtName = "jpg";
try {
    String strImageID = request["iImageIndex"];
    //Get the image data from the database
    HttpRequest request = HttpContext.Current.Request;
    byte[] byFileData = null;
    if (strImageID != null && strImageID != "") {
        int iImageID = 0;
        try {
            iImageID = Convert.ToInt32(strImageID);
        } catch {
            return;
        }
        System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(strConnString);
        System.Data.SqlClient.SqlCommand sqlCmdObj = new System.Data.SqlClient.SqlCommand("SELECT imgImageData FROM " + "tblWebTwain" + " WHERE ID = " + iImageID.ToString(), sqlConnection);
        sqlConnection.Open();
        System.Data.SqlClient.SqlDataReader sdrRecordset = sqlCmdObj.ExecuteReader();
        if (sdrRecordset.Read()) {
            long iByteLength;
            iByteLength = sdrRecordset.GetBytes(0, 0, null, 0, int.MaxValue);
            byFileData = new byte[iByteLength];
            sdrRecordset.GetBytes(0, 0, byFileData, 0, Convert.ToInt32(iByteLength));
        }
        sdrRecordset.Close();
        sqlConnection.Close();
        sdrRecordset = null;
        sqlConnection = null;
    }
    Response.Clear();
    Response.Buffer = true;
    if (byFileData != null) {
        string fileNameEncode;
        fileNameEncode = HttpUtility.UrlEncode("downloadImg.jpg", System.Text.Encoding.UTF8);
        fileNameEncode = fileNameEncode.Replace("+", "%20");
        string appendedheader = "attachment;filename=" + fileNameEncode;
        Response.AppendHeader("Content-Disposition", appendedheader);
        Response.ContentType = "image/jpg";
        Response.OutputStream.Write(byFileData, 0, byFileData.Length);
    }
} catch (Exception ex) {}
  • 在客户端,使用方法HTTPDownloadEx()下载图像。将操作页面DownloadFromDB.aspx作为图像源(作为第二个参数String HTTPRemoteFile):
//downloadsource should be the correct path for
//the page DownloadFromDB.aspx plus any necessary
//parameters needed for fetching the image(s)
var downloadsource = DownloadFromDB.aspx + "?iImageIndex=0";
//You should know the type of the image you are
//downloading because it is downloading as a stream
//and Dynamic Web TWAIN needs the correct type
//in order to process the stream
DWObject.HTTPDownloadEx(strHTTPServer, downloadsource, EnumDWT_ImageType.IT_JPG);

如何隐藏或修改进度条

要在上传/下载等耗时的操作中隐藏进度条,请将IfShowProgressBarIfShowCancelDialogWhenImageTransfer设置为“false”。

对于上传和下载,您可以使用事件OnInternetTransferPercentage来自定义您自己的进度条。此事件将返回上载/下载过程的百分比

DWObject.RegisterEvent('OnInternetTransferPercentage', function(sPercentage){
    console.log(sPercentage); //Your code goes here.
});

如何定制弹框内容

为了使SDK易于使用,内置了UI元素,如提示下载DynamsoftService。默认情况下,提示为英文。想要改变它,步骤是

  1. 找到并打开可在Resources文件夹下找到的文件dynamsoft.webtwain.install.js
  2. 在此文件中,您可以根据需要更改函数_show_install_dialogOnWebTWAINModuleDownloadManually中定义提示的措辞和格式。

如何改变显示语言

Dynamic Web TWAIN的默认显示语言是英语。从版本14.0开始,可以轻松配置语言。步骤是

  1. 找到并打开文件dynamsoft.webtwain.config.js
  2. 搜索Dynamsoft.WebTwainEnv.CustomizableDisplayInfo,您可以找到使用SDK时可能出现的信息。然后,您可以将单词/句子更改为您自己的本机/目标语言,然后将替换默认信息。

如何定制内置的图片编辑器

Dynamic Web TWAIN有一个内置的图像编辑器,可以通过调用方法ShowImageEditor来使用它。默认情况下,编辑器会在其工具栏中显示其所有按钮,并且还会占据整个屏幕。从版本14.0开始,可以配置工具栏以及编辑器显示的位置。

要配置工具栏,步骤如下

  1. 找到并打开文件dynamsoft.webtwain.config.js
  2. 搜索buttons:{,您可以找到可以更改按钮标题以及是否隐藏某些按钮的位置。

注意:为了确保按钮在编辑器窗口中更好的展示,当编辑器窗口不够宽时,编辑器本身将按组隐藏按钮。因此,如果窗口不够宽,即使您将某些按钮设置为可见,它们也可能会被隐藏。

要配置编辑器在网页上显示的位置,请使用方法ShowImageEditor并指定DIV的ID以显示编辑器及其大小。


如何减小保存图片的大小

要在保存或上传时减小扫描/导入图像的大小,可以尝试以下操作

  1. 通过设置属性PixelType,使用“Grey”或“B&W”模式来扫描图像。
  2. 通过设置属性Resolution来使用较低分辨率。对于导入的现有图像,如果它太大,您也可以使用方法SetDPI来更改其DPI。
  3. 为TIFF / PDF选择合适的压缩类型。属性为TIFFCompressionTypePDFCompressionType
  4. 如果要将图像上载为JPEG或JPEG编码的PDF,还可以将属性JPEGQuality设置为较低的值。以下是示例代码
DWObject.TIFFCompressionType = EnumDWT_TIFFCompressionType.TIFF_JPEG;
DWObject.JPEGQuality = 60;  // default value is 80

results matching ""

    No results matching ""