# Source: ocr.js

    const crypto = require('crypto');
    const Promise = require('bluebird');
    const fs = require('fs');
    const path = require('path');
    const net = require('net');

    Promise.promisifyAll(fs);

    /**
     * 123 -> 000123
     * @function
     * @param {Integer} num The number needed to append padding
     * @param {Integer} size The padding count
     * @return {String} after padding
     */
    function pad(num, size) {
      var s = num + "";
      while (s.length < size) s = "0" + s;
      return s;
    }

    /**
     * Socket API wrapper for TIMS OCR server
     * @class OCRSocket
     */
    function OCRSocket(ip, port) {
      this.ip = ip;
      this.port = port;
    }

    /**
     * OCR module (socket wrapper)
     * @module OCRSocket
     * @see OCR
     */

    /**
     * Create OCRSocket instance
     * @param {String} ip IP address of local socket to connect
     * @param {String} port port of local socket to connect
     */
    module.exports.create = function (ip, port) {
      return new OCRSocket(ip, port);
    };

    OCRSocket.fn = OCRSocket.prototype;

    /**
     * OCR scan a local image file
     * @param {String} filePath local file path of a image
     * @return {Promise} JSON format result of recognization result
     */
    OCRSocket.fn.scan = function scan(filePath) {
      var self = this;
      return new Promise(function (resolve, reject) {
        var body = {
          fileId: 'img123',
          mod: 0, // 0->sync, 1->async
          IP: '127.0.0.1',
          port: '8088'
        };
        var bodyStr = JSON.stringify(body);

        var imgBuf = fs.readFileSync(filePath);

        var socketLength = 15 + 7 + bodyStr.length + imgBuf.length;
        var socketLengthStr = socketLength - 15 + "";
        var socketLengthStr = pad(socketLengthStr, 15);

        var jsonlength = bodyStr.length;
        var jsonlength = pad(jsonlength, 7);

        const options = {
          port: self.port,
          host: self.ip
        };
        const socket = net.connect(options, () => {
          console.log('Connected');
          socket.write(socketLengthStr); // request head
          socket.write(jsonlength); // json head
          socket.write(bodyStr); // json body
          socket.write(imgBuf); // image file stream
        });
        socket.on('close', () => {
          resolve(self.ocrResult);
        });
        socket.on('connect', () => {
        });
        socket.on('data', (/*Buffer*/data) => {
          console.log('on data event');
          console.log(typeof data);
          //console.log(data);
          console.log('Received: ' + data);
          self.ocrResult = JSON.parse(data.toString().substr(22));
          socket.destroy(); // kill client after server's response
        });
        socket.on('error', () => {
          console.log('on error event');
        });
      });
    };