pdf2pic
Version:
Node module for converting PDF to image based on pdf2img by Fitra Adity
226 lines (170 loc) • 7.51 kB
JavaScript
"use strict";
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _bluebird = require("bluebird");
var _bluebird2 = _interopRequireDefault(_bluebird);
var _gm = require("gm");
var _gm2 = _interopRequireDefault(_gm);
var _path = require("path");
var _path2 = _interopRequireDefault(_path);
var _fsExtra = require("fs-extra");
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _helper = require("./helper");
var _helper2 = _interopRequireDefault(_helper);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Private = (0, _helper2.default)();
var PDF2IMG = function () {
function PDF2IMG(options) {
var _this = this;
_classCallCheck(this, PDF2IMG);
Private(this).quality = 100;
Private(this).format = options.format || "png";
Private(this).size = options.size || 600;
Private(this).density = options.density || 200;
Private(this).savedir = options.savedir || undefined;
Private(this).savename = options.savename || undefined;
/**
* GM command - identify
* @access private
* @param {String} file_path path to valid file
* @param {Mixed} argument gm identify argument
* @return {Promise}
*/
Private(this).identify = function (file_path) {
var argument = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
var image = (0, _gm2.default)(file_path);
return new _bluebird2.default(function (resolve, reject) {
if (argument) image.identify(argument, function (error, data) {
if (error) return reject(error);
return resolve(data);
});else image.identify(function (error, data) {
if (error) return reject(error);
return resolve(data);
});
});
};
/**
* GM command - write
* @access private
* @param {Stream} stream
* @param {String} output
* @param {String} filename
* @param {Integer} page
* @return {Promise}
*/
Private(this).writeImage = function (stream, output, filename, page) {
return new _bluebird2.default(function (resolve, reject) {
(0, _gm2.default)(stream, filename).density(Private(_this).density, Private(_this).density).resize(Private(_this).size).quality(Private(_this).quality).write(output, function (error) {
if (error) return reject(error);
return resolve({
name: _path2.default.basename(output),
size: _fsExtra2.default.statSync(output)['size'] / 1000.0,
path: output,
page: page
});
});
});
};
}
_createClass(PDF2IMG, [{
key: "convert",
value: async function convert(pdf_path) {
var page = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
this.isValidPDF(pdf_path);
this.fileExists(pdf_path);
var stdout = [];
var output = _path2.default.basename(pdf_path, _path2.default.extname(_path2.default.basename(pdf_path)));
// Set output dir
if (this.get("savedir")) this.set("savedir", this.get("savedir") + _path2.default.sep);else this.set("savedir", output + _path2.default.sep);
_fsExtra2.default.mkdirsSync(this.get("savedir"));
if (!this.get("savename")) this.set("savename", output);
var pages = await this.getPageCount(pdf_path);
if (page > pages) throw { error: "InvalidPageSelection", message: "Cannot convert non-existent page" };
return await this.toImage(pdf_path, page);
}
/**
* Get how many pages are there in the pdf file
* @param {String} pdf_path path to file
* @return {Integer} number of pages
*/
}, {
key: "getPageCount",
value: async function getPageCount(pdf_path) {
var page = await Private(this).identify(pdf_path, "%p ");
page = page.split(" ");
return page.length;
}
/**
* Converts pdf to image
* @param {String} pdf_path
* @param {Integer} page
* @return {Promise}
*/
}, {
key: "toImage",
value: async function toImage(pdf_path, page) {
var iStream = _fsExtra2.default.createReadStream(pdf_path);
var file = "" + this.get("savedir") + this.get("savename") + "_" + page + "." + this.get("format");
var filename = this.getFilePath(iStream);
return await Private(this).writeImage(iStream, file, filename, page);
}
/**
* Get file path
* @param {Stream} stream
* @return {String} path
*/
}, {
key: "getFilePath",
value: function getFilePath(stream) {
if (!stream) throw { error: "InvalidPath", message: "Invalid Path" };
return stream.path;
}
/**
* Checks if the supplied file has the exact file format
* @param {String} pdf_path path to file
* @return {Mixed} file status
*/
}, {
key: "isValidPDF",
value: function isValidPDF(pdf_path) {
if (_path2.default.extname(_path2.default.basename(pdf_path)) != '.pdf') throw { error: "InvalidPDF", message: "File supplied is not a valid PDF" };
return true;
}
/**
* Checks if the supplied file has exists
* @param {String} pdf_path path to file
* @return {Mixed} file status
*/
}, {
key: "fileExists",
value: function fileExists(pdf_path) {
if (!_fsExtra2.default.existsSync(pdf_path)) throw { error: "FileNotFound", message: "File supplied cannot be found" };
return true;
}
/**
* Get value from private property
* @param {String} property
* @return {Mixed} value of the property
*/
}, {
key: "get",
value: function get(property) {
return Private(this)[property];
}
/**
* Add/set value as private property
* @param {String} property
* @param {String} value
* @return {Object} this
*/
}, {
key: "set",
value: function set(property, value) {
Private(this)[property] = value;
return this;
}
}]);
return PDF2IMG;
}();
module.exports = PDF2IMG;
//# sourceMappingURL=index.js.map