In this article, we will show a very simple method to build a custom Node module, which encapsulates Dynamsoft Barcode Reader SDK, supports Windows, Linux and OS X, and we will demonstrate how to integrate this The module implements an online barcode reading application.
More and more web developers are choosing Node to build websites because it is becoming more and more convenient to use JavaScript to develop complex server-side web applications. In order to extend the functionality of Node on different platforms, Node allows developers to create extensions using C/C++.
Introduction
Dynamsoft Barcode Reader provides a C/C++ shared library for barcode parsing for Windows, Linux and OS X. Its biggest advantage is that it is suitable for a variety of high-level programming languages, including JavaScript, Python, Java, Ruby, PHP, etc., as long as the C/C++ API can be encapsulated as an extension, it can be used. Regardless of the programming language, it only takes a few lines of code to parse the barcode.
Support 1D/2D barcode types
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
Supported image types
BMP, JPEG, PNG, GIF , TIFF, PDF
Runtime environment
Windows, Linux & Mac
Node v5.5.0
Node.js barcode extension
Node.js extends dynamically linked shared objects written in C/C++. If you have not been exposed to this technology, you can read the official tutorial.
Create an extension
Create a file named dbr.cc and add the method DecodeFile:
#include#include#include "If_DBR.h" #include "BarcodeFormat.h" #include "BarcodeStructs.h" #include "ErrorCode.h" using namespace v8; void DecodeFile(const FunctionCallbackInfo& args) { } void Init(Handleexports) { NODE_SET_METHOD(exports, "decodeFile", DecodeFile); } NODE_MODULE(dbr, Init)
Parse Parameters passed from 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]);
Parse the barcode image:
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);
will Convert barcode to string:
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"; }
Convert the result to v8 object:
LocalbarcodeResults = Array::New(isolate); for (int i = 0; i < count; i++) { tmp = ppBarcodes[i]; Localresult = 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); }
Build Extension
Requirements:
Windows: Requires DBR for Windows, visual Studio, and Python v2.7 to be installed.
Linux: Install DBR for Linux.
Mac: Install DBR for Mac and Xcode.
Install node-gyp:
npm install -g node-gyp
Create binding.gyp for multi-platform compilation:
{ "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" ] }] ] } ] }
Replace the DRB installation directory with the actual directory on your machine.
Configure the build environment:
node-gyp configure
On Mac you will encounter the following error:
error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance
The solution is:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
Build project:
node-gyp build
Online barcode parsing
You have successfully built Node’s barcode parsing module and can now create a simple barcode reading application.
Install Express and Formidable:
npm install express
npm install formidable
Create a simple application using 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); }); });
Use Formidable to extract image data from the form:
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() { }); }); }); } }); }); });
Import the barcode module to parse the image file:
decodeBarcode(res, license, tmpFileName, barcodeType);
Run the application:
node server.js
Access http: //localhost:2016/index.htm:
The above is a detailed explanation of the Node.js barcode recognition program construction idea introduced by the editor. I hope it will be helpful to everyone.
【Recommended related tutorials】
1. JavaScript video tutorial
2. JavaScript online manual
3. bootstrap tutorial