在這篇文章中,咱們將展現一個很是簡單的方法構建一個自定義的 Node 模塊,該模塊封裝了Dynamsoft Barcode Reader SDK ,支持 Windows、Linux 和 OS X,同時咱們將演示如何集成這塊模塊實現一個在線的條形碼讀取應用。css
愈來愈多的 Web 開發者選擇 Node 來構建網站,由於使用 JavaScript 來開發複雜的服務器端 Web 應用愈來愈便利。爲了擴展在不一樣平臺下的 Node 的功能,Node 容許開發者使用 C/C++ 來建立擴展。html
Dynamsoft Barcode Reader 爲 Windows、Linux 和 OS X 提供條形碼解析的 C/C++ 共享庫。其最大的優點是適用於多種高級編程語言,包括 JavaScript, Python, Java, Ruby, PHP 等,只要能夠封裝 C/C++ API 做爲一個擴展就可使用。無論是什麼編程語言,最終只須要簡單幾行代碼便可完成條形碼的解析。前端
Windows, Linux & Macvue
Nodenode
Node.js 擴展使用 C/C++ 編寫的動態連接的共享對象。若是你沒有接觸過這方面的技術,能夠閱讀 官方教程 。linux
建立名爲 dbr.cc 的文件,並添加方法 DecodeFile:webpack
#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 傳遞過來的參數web
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);
複製代碼
將條形碼轉成字符串:express
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 突破技術瓶頸,提高思惟能力
複製代碼
要求:
安裝 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, 也能夠直接諮詢 support@dynamsoft.com.
本次給你們推薦一個免費的學習圈,裏面歸納移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。獲取資料👈👈👈 對web開發技術感興趣的同窗,歡迎加裙:👉👉👉582735936 👈👈👈,無論你是小白仍是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時天天更新視頻資料。 最後,祝你們早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峯。