構建基於 Node.js 的條形碼識別程序
越來越多的 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 的條形碼識別程序