構建基於 Node.js 的條形碼識別程式
在這篇文章中,我們將展示一個非常簡單的方法構建一個自定義的 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 v5.5.0
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) { } 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); }
構建擴充套件
要求:
- 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
建立 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" ] }] ] } ] }
將 DRB 安裝目錄替換成你機器上的實際目錄。
配置構建環境:
node-gyp configure
可以在 Mac 上你會碰到下面的錯誤:
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
構建專案:
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(2016, 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() { }); }); }); } }); }); });
匯入條形碼模組用來解析影像檔案:
decodeBarcode(res, license, tmpFileName, barcodeType);
執行應用:
node server.js
訪問 http://localhost:2016/index.htm:
如果你要在 Windows、Linux 和 Mac 下構建條形碼讀取應用,可以直接下載示例程式 Dynamsoft Barcode Reader, 也可以直接諮詢 support@dynamsoft.com.
相關文章
- 基於OCaml的識別程式
- 用OpenCV和Python識別二維碼和條形碼OpenCVPython
- 工信部:支援構建基於指紋識別、人臉識別等技術的網路身份認證
- 輕鬆構建基於 Serverless 架構的小程式Server架構
- 使用 PicoLisp 構建簡易文字識別程式Lisp
- 據說別人的程式碼能殺人於無形???
- 手把手教你實現pynq-z2條形碼識別
- Java 條形碼生成(一維條形碼)Java
- 基礎程式碼重構的若干建議(一)
- 如何基於 Redis 構建應用程式元件Redis元件
- 構建基於React18的電子表格程式React
- 基於matlab的車牌識別(含子程式)Matlab
- 實戰 | 基於深度學習模型VGG的影象識別(附程式碼)深度學習模型
- IOS 二維碼條形碼生成(原生程式碼)iOS
- websocketd | 基於 docker 構建WebDocker
- 基於 AnythingLLM 及 Ollama 構建本地知識庫
- 90行JS程式碼構建屬於你的ReactJSReact
- (轉)基於SQL的EAN13、ENA8條形碼校驗位生成SQL
- 基於 Kotlin Native 的基本文字識別程式Kotlin
- 基於python+深度學習構建驗證碼識別服務系列文章 第一章Python深度學習
- 程式碼簡潔的十條建議
- 匹配商品條形碼正規表示式程式碼
- 基於倒排表的電力排程知識問答系統構建 (nlp問答系統實現,有程式碼)
- 基於 ubuntu base 構建 rootfsUbuntu
- 基於Gulp構建的微信小程式開發工作流微信小程式
- 基於gitee WebHook完成程式碼提交就觸發Jenkins自動構建GiteeWebHookJenkins
- 基於深度學習的手勢識別系統(Python程式碼,UI介面版)深度學習PythonUI
- 基於Yolov3的口罩識別YOLO
- 模組化方式構建Node.js應用程式Node.js
- 重構遺留程式碼(7):識別表示層
- 基於深度學習的人臉性別識別系統(含UI介面,Python程式碼)深度學習UIPython
- 基於MATLAB公式識別Matlab公式
- 基於卷積神經網路的建築圖紙識別研究方向卷積神經網路
- 【資料結構】棧的基礎知識(無程式碼)資料結構
- 【資料結構】串的基礎知識(無程式碼)資料結構
- PHP程式碼優化的40條建議PHP優化
- JAVA程式碼編寫的30條建議 .Java
- JAVA程式碼編寫的30條建議Java