In diesem Artikel zeigen wir eine sehr einfache Methode zum Erstellen eines benutzerdefinierten Node-Moduls, das das Dynamsoft Barcode Reader SDK kapselt, Windows, Linux und OS X unterstützt, und wir zeigen, wie dieses integriert wird. Das Modul implementiert einen Online-Barcode Leseanwendung.
Immer mehr Webentwickler entscheiden sich für Node zum Erstellen von Websites, da es immer bequemer wird, JavaScript zum Entwickeln komplexer serverseitiger Webanwendungen zu verwenden. Um die Funktionalität von Node auf verschiedenen Plattformen zu erweitern, ermöglicht Node Entwicklern die Erstellung von Erweiterungen mit C/C++.
Einführung
Dynamsoft Barcode Reader bietet eine gemeinsam genutzte C/C-Bibliothek für die Barcode-Analyse für Windows, Linux und OS X. Sein größter Vorteil besteht darin, dass es für eine Vielzahl höherer Programmiersprachen geeignet ist, einschließlich JavaScript, Python, Java, Ruby, PHP usw., solange die C/C-API als Erweiterung gekapselt werden kann gebraucht. Unabhängig von der Programmiersprache sind nur wenige Codezeilen erforderlich, um den Barcode zu analysieren.
Unterstützung von 1D/2D-Barcodetypen
Code 39, Code 93, Code 128, Codabar, Interleaved 2 of 5, EAN-8, EAN-13, UPC- A, UPC-E, Industrie 2 von 5
QRCode
DataMatrix
PDF417
Unterstützte Bildtypen
BMP, JPEG, PNG, GIF , TIFF, PDF
Laufumgebung
Windows, Linux & Mac
Node v5.5.0
Node.js Barcode-Erweiterung
Node.js erweitert dynamisch verknüpfte gemeinsame Objekte, die in C/C geschrieben sind. Wenn Sie noch nicht mit dieser Technologie vertraut sind, können Sie das offizielle Tutorial lesen.
Erstellen Sie eine Erweiterung
Erstellen Sie eine Datei mit dem Namen dbr.cc und fügen Sie die Methode DecodeFile hinzu:
#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 Von JavaScript übergebene Parameter
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]);
Das Barcode-Bild analysieren:
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);
wird konvertiert Barcode in Zeichenfolge:
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"; }
Konvertieren Sie das Ergebnis in ein v8-Objekt:
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-Erweiterung
Anforderungen:
Windows: Erfordert die Installation von DBR für Windows, Visual Studio und Python v2.7.
Linux: Installieren DBR für Linux.
Mac: DBR für Mac und Xcode installieren.
Node-gyp installieren:
npm install -g node-gyp
Erstellen binding.gyp für die plattformübergreifende Kompilierung:
{ "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" ] }] ] } ] }
Ersetzen Sie das DRB-Installationsverzeichnis durch das tatsächliche Verzeichnis auf Ihrem Computer.
Konfigurieren Sie die Build-Umgebung:
node-gyp configure
Auf dem Mac wird der folgende Fehler auftreten:
Fehler: xcode-select: Fehler: Tool „xcodebuild“ erfordert Xcode, aber das aktive Entwicklerverzeichnis „/Library/Developer/CommandLineTools“ ist eine Instanz von Befehlszeilentools
Die Lösung lautet:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
Projekt erstellen:
node-gyp build
Online-Barcode-Parsing
Sie haben das Barcode-Parsing-Modul von Node erfolgreich erstellt und können nun eine einfache Barcode-Leseanwendung erstellen.
Express und Formidable installieren:
npm install express
npm install formidable
Erstellen Sie eine einfache Anwendung mit 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); }); });
Verwenden Sie Formidable, um Bilddaten aus dem Formular zu extrahieren:
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() { }); }); }); } }); }); });
Importieren Sie das Barcode-Modul, um die Bilddatei zu analysieren:
decodeBarcode(res, License, tmpFileName, barcodeType);
Führen Sie die Anwendung aus:
node server.js
Zugriff auf http: //localhost:2016/index.htm:
Das Obige ist eine detaillierte Erläuterung der vom Herausgeber vorgestellten Idee zum Aufbau des Node.js-Barcode-Erkennungsprogramms alle.
【Empfohlene verwandte Tutorials】
1. JavaScript-Video-Tutorial
2. JavaScript-Online-Handbuch
Bootstrap-Tutorial