UNPKG

@aeolun/muhammara

Version:

Create, read and modify PDF files and streams. A drop in replacement for hummusjs PDF library

126 lines (116 loc) 3.64 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 }; };