在这篇文章中,我们将展示一个非常简单的方法构建一个自定义的 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#include #include "If_DBR.h"#include "BarcodeFormat.h"#include "BarcodeStructs.h"#include "ErrorCode.h"using namespace v8;void DecodeFile(const FunctionCallbackInfo & args) {} //在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力void Init(Handle
解析来自 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();Localcb = Local ::Cast(args[3]);复制代码
解析条形码图像:
int iMaxCount = 0x7FFFFFFF;ReaderOptions ro = {0};pBarcodeResultArray pResults = NULL;ro.llBarcodeFormat = llFormat;ro.iMaxBarcodesNumPerPage = iMaxCount;DBR_InitLicense(pszLicense);// Decode barcode imageint 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 对象:
LocalbarcodeResults = Array::New(isolate);for (int i = 0; i < count; i++){ tmp = ppBarcodes[i]; Local
构建扩展
要求:
- 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复制代码
可以在 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 expressnpm 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复制代码
访问 :
如果你要在 Windows、Linux 和 Mac 下构建条形码读取应用,可以直接下载示例程序 , 也可以直接咨询 support@dynamsoft.com.
本次给大家推荐一个免费的学习圈,里面概括移动应用网站开发,css,html,webpack,vue node angular以及面试资源等。??? 对web开发技术感兴趣的同学,欢迎加裙:??????,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。 最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。