UNPKG

hummus-recipe

Version:

A powerful PDF tool for NodeJS based on HummusJS

125 lines (115 loc) 4.06 kB
/** * Place images to pdf * @name image * @function * @memberof Recipe * @param {string} imgSrc - The path for the image. [JPEG, PNG, TIFF] * @param {number} x - The coordinate x * @param {number} y - The coordinate y * @param {Object} [options] - The options * @param {number} [options.width] - The new width * @param {number} [options.height] - The new height * @param {number} [options.scale] - Scale the image from the original width and height. * @param {boolean} [options.keepAspectRatio=true] - Keep the aspect ratio. * @param {number} [options.opacity] - The opacity. * @param {string} [options.align] - 'center center'... */ exports.image = function image(imgSrc, x, y, options = {}) { const { width, height, offsetX, offsetY } = this._getImgOffset(imgSrc, options); const imgOptions = { transformation: { fit: 'always', // proportional: true, width, height } }; const { nx, ny } = this._calibrateCoordinate(x, y, offsetX, offsetY); const _options = this._getPathOptions(options, nx, ny); const gsId = _options.fillGsId; const xObjectKeyName = `${imgSrc}__${gsId}`; // See if this image has been seen already, so as to not duplicate it. let xObject = this.xObjects.find((element) => { return element.get('name') == xObjectKeyName; }); if (xObject) { _options.xObject = xObject; _options.ratio = [width / xObject.get('width'), height / xObject.get('height')]; } this._drawObject(this, nx, ny, width, height, _options, (ctx, xObject) => { // Only new images visit here xObject.set('type', 'image'); xObject.set('name', xObjectKeyName); xObject.set('width', width); xObject.set('height', height); this.xObjects.push(xObject); ctx .gs(xObject.getGsName(gsId)) .drawImage(0, 0, imgSrc, imgOptions); }); return this; }; exports._getImgOffset = function _getImgOffset(imgSrc = '', options = {}) { // set default to true options.keepAspectRatio = (options.keepAspectRatio == void 0) ? true : options.keepAspectRatio; const dimensions = this.writer.getImageDimensions(imgSrc); const ratio = dimensions.width / dimensions.height; let width = dimensions.width; let height = dimensions.height; if (options.scale) { width = width * options.scale; height = height * options.scale; } else if (options.width && !options.height) { width = options.width; height = options.width / ratio; } else if (!options.width && options.height) { width = options.height * ratio; height = options.height; } else if (options.width && options.height) { if (!options.keepAspectRatio) { width = options.width; height = options.height; } else { // fit to the smaller if (options.width / ratio <= options.height) { width = options.width; height = options.width / ratio; } else { width = options.height * ratio; height = options.height; } } } let offsetX = 0; let offsetY = -height; if (options.align) { const alignments = options.align.split(' '); if (alignments[0]) { switch (alignments[0]) { case 'center': offsetX = -1 * width / 2; break; case 'right': offsetX = width / 2; break; default: } } if (alignments[1]) { switch (alignments[1]) { case 'center': offsetY = -1 * height / 2; break; case 'bottom': offsetY = height / 2; break; default: } } } return { width, height, offsetX, offsetY }; };