import JSZipUtils from 'jszip-utils'; import JSZip from 'jszip'; import docxtemplater from 'docxtemplater'; import ImageModule from 'docxtemplater-image-module-free'; import Pizzip from 'pizzip'; import FileSaver from 'file-saver'; /** * 等比例缩放图片 * 根据图片的长宽比进行不同方式的缩放 * 如果宽度大于高度(横拍图片),则按照设定高度等比缩放; * 如果宽度小于高度(竖拍图片),则按照设定宽度等比缩放; * @param {Number} horizontalHeight 设定高度 * @param {Number} verticalWidth 设定宽度 * @param {*} img * @param {*} tagValue * @param {*} tagName * @returns */ function getSizeProportional( horizontalHeight, verticalWidth, img, tagValue, tagName ) { return new Promise(function (resolve, reject) { const image = new Image(); image.src = tagValue; image.onload = function () { let width = image.width; let height = image.height; // console.log('width height', width, height); if (width > height && horizontalHeight && height > horizontalHeight) { const scale = image.height / horizontalHeight; height = horizontalHeight; width = image.width / scale; } else if (width <= height && verticalWidth && width > verticalWidth) { const scale = image.width / verticalWidth; width = verticalWidth; height = image.height / scale; } // console.log('scale', width, height); resolve([width, height]); }; image.onerror = function (e) { console.log('img, tagValue, tagName : ', img, tagValue, tagName); alert('An error occured while loading ' + tagValue); reject(e); }; }); } /** * 固定大小缩放图片 * 根据图片的长宽比进行不同方式的缩放 * 如果宽度大于高度(横拍图片),则按照设定高度和宽高比缩放; * 如果宽度小于高度(竖拍图片),则按照设定宽度和宽高比缩放; * @param {*} horizontalHeight 设定高度 * @param {*} verticalWidth 设定宽度 * @param {*} scale 缩放比例,长边除短边的比例系数 * @param {*} img * @param {*} tagValue * @param {*} tagName * @returns */ function getSizeFixed( horizontalHeight, verticalWidth, scale, img, tagValue, tagName ) { return new Promise(function (resolve, reject) { const image = new Image(); image.src = tagValue; image.onload = function () { let width = image.width; let height = image.height; if (width > height && horizontalHeight && height > horizontalHeight && scale) { height = horizontalHeight; width = horizontalHeight * scale; } else if (width <= height && verticalWidth && width > verticalWidth && scale) { width = verticalWidth; height = verticalWidth * scale; } resolve([width, height]); }; image.onerror = function (e) { console.log('img, tagValue, tagName : ', img, tagValue, tagName); alert('An error occured while loading ' + tagValue); reject(e); }; }); } /** * 获取图片配置信息 * @param {Number} horizontalHeight 图片宽度大于高度时,限制其高度 * @param {Number} verticalWidth 图片宽度小于高度时,限制其宽度 * @returns */ function getImageOptions(options) { const horizontalHeight = options ? options.horizontalHeight : undefined; const verticalWidth = options ? options.verticalWidth : undefined; return { centered: false, fileType: 'docx', getImage(tagValue) { // In this case tagValue will be a URL tagValue = "https://docxtemplater.com/puffin.png" return new Promise(function (resolve, reject) { JSZipUtils.getBinaryContent(tagValue, function (error, content) { if (error) { return reject(error); } return resolve(content); }); }); }, getSize(img, tagValue, tagName) { // return getSizeProportional(horizontalHeight, verticalWidth, img, tagValue, tagName) return getSizeFixed( horizontalHeight, verticalWidth, options.scale, img, tagValue, tagName ); } }; } export const exportDocx = (tempDocpath, data, zipName, imageSize) => { return new Promise((resolve, reject) => { JSZipUtils.getBinaryContent(tempDocpath, (error, content) => { if (error) { reject(error); throw error; } const zip = new Pizzip(content); const imageOptions = getImageOptions(imageSize); let doc = new docxtemplater() .setOptions({ paragraphLoop: true }) .loadZip(zip) .attachModule(new ImageModule(imageOptions)) .compile(); doc.resolveData(data).then(() => { try { doc.render(); } catch (error) { console.log(error); throw error; } const out = doc.getZip().generate({ type: 'blob', mimeType: 'application/vnd.openxmlformats-officedocumnet.wordprocessingml.document' }); FileSaver.saveAs(out, zipName); resolve(); }); }); }); };