Node.js 條形碼識(shí)別程序構(gòu)建思路詳解
在這篇文章中,我們將展示一個(gè)非常簡(jiǎn)單的方法構(gòu)建一個(gè)自定義的 Node 模塊,該模塊封裝了Dynamsoft Barcode Reader SDK ,支持 Windows、Linux 和 OS X,同時(shí)我們將演示如何集成這塊模塊實(shí)現(xiàn)一個(gè)在線的條形碼讀取應(yīng)用。
越來(lái)越多的 Web 開(kāi)發(fā)者選擇 Node 來(lái)構(gòu)建網(wǎng)站,因?yàn)槭褂?JavaScript 來(lái)開(kāi)發(fā)復(fù)雜的服務(wù)器端 Web 應(yīng)用越來(lái)越便利。為了擴(kuò)展在不同平臺(tái)下的 Node 的功能,Node 允許開(kāi)發(fā)者使用 C/C++ 來(lái)創(chuàng)建擴(kuò)展。
介紹
Dynamsoft Barcode Reader 為 Windows、Linux 和 OS X 提供條形碼解析的 C/C++ 共享庫(kù)。其最大的優(yōu)勢(shì)是適用于多種高級(jí)編程語(yǔ)言,包括 JavaScript, Python, Java, Ruby, PHP 等,只要可以封裝 C/C++ API 作為一個(gè)擴(kuò)展就可以使用。不管是什么編程語(yǔ)言,最終只需要簡(jiǎn)單幾行代碼即可完成條形碼的解析。
支持 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
運(yùn)行環(huán)境
Windows, Linux & Mac
Node v5.5.0
Node.js 條形碼擴(kuò)展
Node.js 擴(kuò)展使用 C/C++ 編寫(xiě)的動(dòng)態(tài)鏈接的共享對(duì)象。如果你沒(méi)有接觸過(guò)這方面的技術(shù),可以閱讀 官方教程 。
創(chuàng)建擴(kuò)展
創(chuàng)建名為 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) { } void Init(Handle<Object> exports) { NODE_SET_METHOD(exports, "decodeFile", DecodeFile); } NODE_MODULE(dbr, Init)
解析來(lái)自 JavaScript 傳遞過(guò)來(lái)的參數(shù)
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);
將條形碼轉(zhuǎn)成字符串:
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"; }
將結(jié)果轉(zhuǎn)成 v8 對(duì)象:
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); }
構(gòu)建擴(kuò)展
要求:
Windows: 需要安裝 DBR for Windows, visual Studio, and Python v2.7.
Linux: 安裝 DBR for Linux.
Mac: 安裝 DBR for Mac 和 Xcode.
安裝 node-gyp:
npm install -g node-gyp
創(chuàng)建 binding.gyp 用于多平臺(tái)編譯:
{ "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" ] }] ] } ] }
將 DRB 安裝目錄替換成你機(jī)器上的實(shí)際目錄。
配置構(gòu)建環(huán)境:
node-gyp configure
可以在 Mac 上你會(huì)碰到下面的錯(cuò)誤:
error: xcode-select: 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
構(gòu)建項(xiàng)目:
node-gyp build
在線條形碼解析
你已經(jīng)成功的構(gòu)建了 Node 的條形碼解析模塊,現(xiàn)在可以創(chuàng)建一個(gè)簡(jiǎn)單的條形碼讀取應(yīng)用。
安裝 Express 和 Formidable:
npm install express
npm install formidable
使用 Express 創(chuàng)建一個(gè)簡(jiǎn)單應(yīng)用:
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(2016, function() { var host = server.address().address; var port = server.address().port; console.log('listening at http://%s:%s', host, port); }); });
使用 Formidable 從表單中提取圖像數(shù)據(jù):
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() { }); }); }); } }); }); });
導(dǎo)入條形碼模塊用來(lái)解析圖像文件:
decodeBarcode(res, license, tmpFileName, barcodeType);
運(yùn)行應(yīng)用:
node server.js
訪問(wèn) http://localhost:2016/index.htm:
以上所述是小編給大家介紹的Node.js 條形碼識(shí)別程序構(gòu)建思路詳解,希望對(duì)大家有所幫助。
相關(guān)文章
node.js中的fs.appendFile方法使用說(shuō)明
這篇文章主要介紹了node.js中的fs.appendFile方法使用說(shuō)明,本文介紹了fs.appendFile方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12Node.js讀寫(xiě)文件之批量替換圖片的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Node.js讀寫(xiě)文件之批量替換圖片的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09node異步使用await和不用await的區(qū)別實(shí)例分析
這篇文章主要介紹了node異步使用await和不用await的區(qū)別,結(jié)合實(shí)例形式分析了node.js異步使用await和不用await的實(shí)例中,同步與異步執(zhí)行的區(qū)別,需要的朋友可以參考下2023-06-06獨(dú)立部署小程序基于nodejs的服務(wù)器過(guò)程詳解
這篇文章主要介紹了獨(dú)立部署小程序基于nodejs的服務(wù)器過(guò)程詳解,完全自定義的部署小程序服務(wù)器, 不依托于騰訊云服務(wù)器體系. 以阿里云服務(wù)器為基礎(chǔ)建立.服務(wù)器語(yǔ)言選用nodejs.,需要的朋友可以參考下2019-06-06Node.js實(shí)現(xiàn)分片上傳斷點(diǎn)續(xù)傳示例詳解
這篇文章主要為大家介紹了Node.js實(shí)現(xiàn)分片上傳斷點(diǎn)續(xù)傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07node實(shí)現(xiàn)shell命令管理工具及commander.js學(xué)習(xí)
這篇文章主要為大家介紹了node實(shí)現(xiàn)shell命令管理工具及commander.js學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Nodejs實(shí)戰(zhàn)心得之eventproxy模塊控制并發(fā)
本篇文章給大家分享我的nodejs實(shí)戰(zhàn)心得,如何使用eventproxy模塊控制并發(fā),感興趣的朋友可以參考下2015-10-10node.js中的buffer.fill方法使用說(shuō)明
這篇文章主要介紹了node.js中的buffer.fill方法使用說(shuō)明,本文介紹了buffer.fill的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12express中創(chuàng)建 websocket 接口及問(wèn)題解答
本文主要介紹了express中創(chuàng)建 websocket 接口及問(wèn)題解答,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05