构建基于 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

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以及面试资源等。**获取资料

原文地址:https://blog.51cto.com/14145734/2394625

时间: 2024-11-03 21:03:52

构建基于 Node.js 的条形码识别程序的相关文章

基于node.js人脸识别之人脸对比

基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型. Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP.Python.Perl.Ruby 等服务端语言平起平坐的脚本语言. 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装. Node对一些特殊用

基于 Node.js + Express + mongoDB + Bootstrap 搭建的电影网站

电影网站 ?? GitHub: https://github.com/bxm0927/movie-website 此项目是基于 Node.js + Express + mongoDB + Bootstrap 搭建的电影网站. 主要功能模块: 一期:前台电影展示页.电影详情页.后台电影管理中心(电影录入.电影修改) 二期:用户登录注册注销功能.用户识别和持久化.后台用户管理中心(用户录入.用户修改).电影评论 <!-- more --> 图片预览 技术栈 [前端] HTML/CSS/JS:亘古不

基于Node.js的自动化工具Gulp

基于Node.js的自动化工具Gulp What is gulp? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,不仅可以很愉快的编写代码,而且大大提高我们的工作效率. gulp是基于Nodejs的自动任务运行器, 她能自动化地完成 javascript.coffee.sass.less.html/image.css 等文件的测试.检查.合并.压缩.格式化.浏览器自动刷新.部

基于Node.js + jade + Mongoose 模仿gokk.tv

原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 关于gokk 大学的娱乐活动基本就是在寝室看电影了→_→,一般都会选择去goxiazai.cc上看,里面的资源多,质量高 .站长会推荐评分很高广受好评的电影给大家免费下载,整体来说真是不错,但前两月由于版权问题被迫转型 这也是没办法的事,程序员更应该尊重版权问题,我们也能理解,后来站长又开了gokk个不是给地址让你 下载,而是将网络一些优秀视频站点资源提供出来观看,质量变低了,好怀念以前的goxiazai啊.. 最近

基于Node.js + socket.io实现WebSocket的聊天DEMO

原文摘自我的前端博客,欢迎大家来访问 http://hacke2.github.io 简介 最近看Node.js和HTML5,练手了一个简易版的聊天DEMO,娱乐一下 为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一, 为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程体验, 于是socket.io诞生. 简答来说socket.io具体以下特点: 1.socket.io设计的目标是支持任何的浏览器

基于Node.js的强大爬虫 能直接发布抓取的文章哦

基于Node.js的强大爬虫 能直接发布抓取的文章哦 基于Node.js的强大爬虫能直接发布抓取的文章哦!本爬虫源码基于WTFPL协议,感兴趣的小伙伴们可以参考一下 一.环境配置 1)搞一台服务器,什么linux都行,我用的是CentOS 6.5: 2)装个mysql数据库,5.5或5.6均可,图省事可以直接用lnmp或lamp来装,回头还能直接在浏览器看日志: 3)先安个node.js环境,我用的是0.12.7,更靠后的版本没试过: 4)执行npm -g install forever,安装f

基于Node.js和express的日志服务器

首先,这篇文章学习的意义大于实际价值.如果按我的本意,直接在游戏中加入友盟,信息更全,而且非常简单.不过总是有很多人会凭着自己过时或者错误的经验去说别的东西多么不好,自己的东西多么好.好在,我自认为学习能力非常强,解决问题的能力也非常强.真让我做一个服务器+前端,也是在兴趣之中和能力之内. 一.Node.js简介 原本javascript纯粹是一个前端语言,干的基本上是让网页更丰富更炫的事情.不过Node.js出现后,javacript成为了前后端通吃的语言.比如网易的pomelo就是基于Nod

node.js高级编程|node.js 视频教程_基于node.js+Express.js+Jade+MongoDB实战开发

基于node.js+Express.js+Jade+MongoDB开发Web即时聊天系统课程讲师:幻星课程分类:前端开发适合人群:初级课时数量:36课时更新程度:完成用到技术:Node.js NPM. Express.NoSQL,MongoDB涉及项目:匿名聊天网站系统node.js视频教程:http://www.ibeifeng.com/goods-462.htmlnode.js 教程适合人群:node.js视频教程要求学员了解JavaScript,node.js入门教程适合希望更深入的学习N

基于Node.js的文件下载服务器

首先表示,并不是我客户端玩腻歪了要玩跨界:另外,代码不是我写的,而是我找的. 直接上代码地址,不想看唠叨的就直接下载代码就ok了. https://github.com/andygrn/Node.js-File-Server 下载代码后,直接把server.js拖到node.exe图标上就可以运行了,在浏览器中访问http://127.0.0.1:80/可以直接连接下载服务器了. 1.为什么要关注下载服务器(文件服务器)? 因为我要写个多线程断点续传的下载库,当然要有一个服务器进行测试.用Apa