1. 程式人生 > >構建基於 Node.js 的條形碼識別程序

構建基於 Node.js 的條形碼識別程序

一個 select -m err ont one binding string.h %s

在這篇文章中,我們將展示一個非常簡單的方法構建一個自定義的 Node 模塊,該模塊封裝了Dynamsoft Barcode Reader SDK ,支持 Windows、Linux 和 OS X,同時我們將演示如何集成這塊模塊實現一個在線的條形碼讀取應用。

越來越多的 Web 開發者選擇 Node 來構建網站,因為使用 JavaScript 來開發復雜的服務器端 Web 應用越來越便利。為了擴展在不同平臺下的 Node 的功能,Node 允許開發者使用 C/C++ 來創建擴展。

介紹

Dynamsoft Barcode Reader 為 Windows、Linux 和 OS X 提供條形碼解析的 C/C++ 共享庫。其最大的優勢是適用於多種高級編程語言,包括 JavaScript, Python, Java, Ruby, PHP 等,只要可以封裝 C/C++ API 作為一個擴展就可以使用。不管是什麽編程語言,最終只需要簡單幾行代碼即可完成條形碼的解析。

支持 1D/2D 條形碼類型

  • Code 39, Code 93, Code 128, Codabar, Interleaved 2 of 5, EAN-8, EAN-13, UPC-A, UPC-E,Industrial 2 of 5
  • QRCode
  • DataMatrix
  • PDF417

支持圖像類型、

  • BMP, JPEG, PNG, GIF, TIFF, PDF

運行環境

  • Windows, Linux & Mac

  • Node

Node.js 條形碼擴展

Node.js 擴展使用 C/C++ 編寫的動態鏈接的共享對象。如果你沒有接觸過這方面的技術,可以閱讀?官方教程?。

創建擴展

創建名為 dbr.cc 的文件,並添加方法 DecodeFile:

#include?<node.h>
#include?<string.h>
#include?"If_DBR.h"
#include?"BarcodeFormat.h"
#include?"BarcodeStructs.h"
#include?"ErrorCode.h"

using?namespace?v8;

void?DecodeFile(const?FunctionCallbackInfo<Value>&?args)?{

}        //在此我向大家推薦一個前端全棧開發交流圈:619586920 突破技術瓶頸,提升思維能力

void?Init(Handle<Object>?exports)?{
????NODE_SET_METHOD(exports,?"decodeFile",?DecodeFile);
}

NODE_MODULE(dbr,?Init)

解析來自 JavaScript 傳遞過來的參數

Isolate*?isolate?=?Isolate::GetCurrent();
HandleScope?scope(isolate);
String::Utf8Value?license(args[0]->ToString());
String::Utf8Value?fileName(args[1]->ToString());
char?*pFileName?=?*fileName;
char?*pszLicense?=?*license;
__int64?llFormat?=?args[2]->IntegerValue();
Local<Function>?cb?=?Local<Function>::Cast(args[3]);

解析條形碼圖像:

int?iMaxCount?=?0x7FFFFFFF;
ReaderOptions?ro?=?{0};
pBarcodeResultArray?pResults?=?NULL;
ro.llBarcodeFormat?=?llFormat;
ro.iMaxBarcodesNumPerPage?=?iMaxCount;

DBR_InitLicense(pszLicense);
//?Decode?barcode?image
int?ret?=?DBR_DecodeFile(pFileName,?&ro,?&pResults);

將條形碼轉成字符串:

const?char?*?GetFormatStr(__int64?format)
{
????if?(format?==?CODE_39)
????????return?"CODE_39";
????if?(format?==?CODE_128)
????????return?"CODE_128";
????if?(format?==?CODE_93)
????????return?"CODE_93";
????if?(format?==?CODABAR)
????????return?"CODABAR";
????if?(format?==?ITF)
????????return?"ITF";
????if?(format?==?UPC_A)
????????return?"UPC_A";
????if?(format?==?UPC_E)
????????return?"UPC_E";
????if?(format?==?EAN_13)
????????return?"EAN_13";
????if?(format?==?EAN_8)
????????return?"EAN_8";
????if?(format?==?INDUSTRIAL_25)
????????return?"INDUSTRIAL_25";
????if?(format?==?QR_CODE)
????????return?"QR_CODE";
????if?(format?==?PDF417)
????????return?"PDF417";
????if?(format?==?DATAMATRIX)
????????return?"DATAMATRIX";

????return?"UNKNOWN";
}

將結果轉成 v8 對象:

Local<Array>?barcodeResults?=?Array::New(isolate);

for?(int?i?=?0;?i?<?count;?i++)
{
????tmp?=?ppBarcodes[i];

????Local<Object>?result?=?Object::New(isolate);
????result->Set(String::NewFromUtf8(isolate,?"format"),?String::NewFromUtf8(isolate,?GetFormatStr(tmp->llFormat)));
????result->Set(String::NewFromUtf8(isolate,?"value"),?String::NewFromUtf8(isolate,?tmp->pBarcodeData));

????barcodeResults->Set(Number::New(isolate,?i),?result);
}           //在此我向大家推薦一個前端全棧開發交流圈:619586920 突破技術瓶頸,提升思維能力

構建擴展

要求:

  • Windows: 需要安裝?DBR for Windows, Visual Studio, and Python .
  • Linux: 安裝?DBR for Linux.
  • Mac: 安裝?DBR for Mac?和?Xcode.

安裝 node-gyp:

npm?install?-g?node-gyp

創建?binding.gyp?用於多平臺編譯:

{
??"targets":?[
????{
??????‘target_name‘:?"dbr",
??????‘sources‘:?[?"dbr.cc"?],
??????‘conditions‘:?[
??????????[‘OS=="linux"‘,?{
????????????‘defines‘:?[
??????????????‘LINUX_DBR‘,
????????????],
????????????‘include_dirs‘:?[
????????????????"/home/xiao/Dynamsoft/BarcodeReader4.0/Include"
????????????],
????????????‘libraries‘:?[
????????????????"-lDynamsoftBarcodeReaderx64",?"-L/home/xiao/Dynamsoft/BarcodeReader4.0/Redist"
????????????],
????????????‘copies‘:?[
????????????{
??????????????‘destination‘:?‘build/Release/‘,
??????????????‘files‘:?[
????????????????‘/home/xiao/Dynamsoft/BarcodeReader4.0/Redist/libDynamsoftBarcodeReaderx64.so‘
??????????????]
????????????}]
??????????}],
??????????[‘OS=="win"‘,?{
????????????‘defines‘:?[
??????????????‘WINDOWS_DBR‘,
????????????],
????????????‘include_dirs‘:?[
????????????????"F:/Program?Files?(x86)/Dynamsoft/Barcode?Reader?4.1/Components/C_C++/Include"
????????????],
????????????‘libraries‘:?[
????????????????"-lF:/Program?Files?(x86)/Dynamsoft/Barcode?Reader?4.1/Components/C_C++/Lib/DBRx64.lib"
????????????],
????????????‘copies‘:?[
????????????{
??????????????‘destination‘:?‘build/Release/‘,
??????????????‘files‘:?[
????????????????‘F:/Program?Files?(x86)/Dynamsoft/Barcode?Reader?4.1/Components/C_C++/Redist/DynamsoftBarcodeReaderx64.dll‘
??????????????]
????????????}]
??????????}],
??????????[‘OS=="mac"‘,?{
????????????‘defines‘:?[
??????????????‘MAC_DBR‘,
????????????],
????????????‘include_dirs‘?:?[
????????????????"/Applications/Dynamsoft/Barcode/?Reader/?4.1/Include"
????????????],
????????????‘libraries‘:?[
????????????????"-lDynamsoftBarcodeReader"
????????????]
??????????}]
??????]
????}                 //在此我向大家推薦一個前端全棧開發交流圈:619586920 突破技術瓶頸,提升思維能力
??]
}

將 DRB 安裝目錄替換成你機器上的實際目錄。

配置構建環境:

node-gyp?configure</pre>

可以在 Mac 上你會碰到下面的錯誤:

error:?xcodeselect:?error:?tool?‘xcodebuild‘?requires?Xcode,?but?active?developer?directory?‘/Library/Developer/CommandLineTools‘?is?a?command?line?tools?instance

解決辦法是:

sudo?xcode-select?--switch?/Applications/Xcode.app/Contents/Developer

構建項目:

node-gyp?build

在線條形碼解析

你已經成功的構建了 Node 的條形碼解析模塊,現在可以創建一個簡單的條形碼讀取應用。

安裝?Express?和?Formidable:

npm?install?express
npm?install?formidable

使用?Express?創建一個簡單應用:

var?formidable?=?require(‘formidable‘);
var?util?=?require(‘util‘);
var?express?=?require(‘express‘);
var?fs?=?require(‘fs‘);
var?app?=?express();
var?path?=?require(‘path‘);
var?dbr?=?require(‘./build/Release/dbr‘);
var?http?=?require(‘http‘);

fs.readFile(‘./license.txt‘,?‘utf8‘,?function(err,?data)?{

??app.use(express.static(__dirname));
??app.use(function(req,?res,?next)?{
????res.header("Access-Control-Allow-Origin",?"*");
????res.header("Access-Control-Allow-Methods",?"PUT,?POST,?GET,?DELETE,?OPTIONS");
????res.header("Access-Control-Allow-Headers",?"X-Requested-With,?content-type");
????res.header("Access-Control-Allow-Credentials",?true);
????next();
??});

??var?server?=?app.listen(2019,?function()?{
????var?host?=?server.address().address;
????var?port?=?server.address().port;
????console.log(‘listening?at?http://%s:%s‘,?host,?port);
??});
});

使用?Formidable?從表單中提取圖像數據:

app.post(‘/upload‘,?function(req,?res)?{
????var?form?=?new?formidable.IncomingForm();
????form.parse(req,?function(err,?fields,?files)?{
??????var?dir?=?‘uploads‘;

??????fs.mkdir(dir,?function(err)?{
????????var?flag?=?fields.uploadFlag;
????????var?barcodeType?=?parseInt(fields.barcodetype);

????????console.log(‘flag:?‘?+?flag);

????????if?(flag?===?‘1‘)?{?//?read?barcode?image?file
??????????fs.readFile(files.fileToUpload.path,?function(err,?data)?{
????????????//?save?file?from?temp?dir?to?new?dir
????????????var?fileName?=?path.join(__dirname,?dir,?files.fileToUpload.name);
????????????console.log(fileName);
????????????fs.writeFile(fileName,?data,?function(err)?{
??????????????if?(err)?throw?err;

????????????});
??????????});

????????}?else?{?//?read?barcode?image?url
??????????var?tmpFileName?=?path.join(__dirname,?dir,?‘tmp.jpg‘);
??????????var?tmp?=?fs.createWriteStream(tmpFileName);
??????????var?url?=?fields.fileToDownload;
??????????console.log(‘url:?‘?+?url);
??????????http.get(url,?function(response)?{
????????????response.pipe(tmp);
????????????tmp.on(‘finish‘,?function()?{
??????????????tmp.close(function()?{

??????????????});
????????????});
??????????});
????????}                 //在此我向大家推薦一個前端全棧開發交流圈:619586920 突破技術瓶頸,提升思維能力
??????});

????});
??});

導入條形碼模塊用來解析圖像文件:

decodeBarcode(res,?license,?tmpFileName,?barcodeType);

運行應用:

node?server.js

訪問?http://localhost:2019/index.htm:

技術分享圖片

如果你要在 Windows、Linux 和 Mac 下構建條形碼讀取應用,可以直接下載示例程序?Dynamsoft Barcode Reader, 也可以直接咨詢 [email protected]

本次給大家推薦一個免費的學習圈,裏面概括移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。**獲取資料

構建基於 Node.js 的條形碼識別程序