65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在Windows、Linux和Mac上构建Node.js条码阅读器

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2016 年 2 月 11 日

CPOL

2分钟阅读

viewsIcon

36498

downloadIcon

433

在这篇文章中,让我们简单了解一下如何在Windows、Linux和Mac上通过封装Dynamsoft条码阅读器SDK来轻松构建自定义Node模块,以及如何集成该模块以快速实现在线条码阅读器。

越来越多的Web开发者倾向于选择Node.js来构建他们的网站,因为使用JavaScript就可以方便地构建复杂的服务器端Web应用程序。为了扩展和增强Node.js应用程序在不同平台上的功能,Node.js允许开发者使用C/C++创建插件。在这篇文章中,让我们简单了解一下如何在Windows、Linux和Mac上通过封装Dynamsoft条码阅读器SDK来轻松构建自定义Node模块,以及如何集成该模块以快速实现在线条码阅读器。

引言

Dynamsoft条码阅读器为Windows、Linux和Mac提供C/C++共享库。最终好处是任何高级编程语言,如JavaScript、Python、Java、Ruby、PHP等等,都可以使用扩展或插件来封装C/C++ API。无论您熟悉哪种编程语言,SDK都可以通过几行代码来加快条码阅读器应用程序的编码工作。

支持的 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);
}

构建插件

必备组件

安装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"
            ]
          }]
      ]
    }
  ]
}

将DBR安装目录替换为您自己的目录。

配置构建环境

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条码阅读器模块。现在是时候创建一个简单的条码阅读器应用程序了。

安装ExpressFormidable

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

访问https://:2016/index.htm

您想在Windows、Linux或Mac上构建条码阅读器应用程序吗?立即下载示例代码并动手操作。有关Dynamsoft条码阅读器的更多信息,请联系support@dynamsoft.com

© . All rights reserved.