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 PizZipUtils from 'pizzip/utils/dist/pizzip-utils';
|
import FileSaver from 'file-saver';
|
import fs from 'fs';
|
|
/**
|
* 获取图片配置信息
|
* @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 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);
|
};
|
});
|
}
|
};
|
}
|
|
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();
|
});
|
});
|
});
|
};
|