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'; import { renderAsync } from 'docx-preview'; import printJS from 'print-js'; import pdfMake from 'pdfmake'; /** * 等比例缩放图片 * 根据图片的长宽比进行不同方式的缩放 * 如果宽度大于高度(横拍图片),则按照设定高度等比缩放; * 如果宽度小于高度(竖拍图片),则按照设定宽度等比缩放; * @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 ); } }; } function prepareDocxtemplater(tempDocpath, data, imageSize) { return new Promise((resolve, reject) => { JSZipUtils.getBinaryContent(tempDocpath, (error, content) => { if (error) { reject(error); throw error; } const zip = new Pizzip(content); let doc = new docxtemplater() .setOptions({ paragraphLoop: true }) .loadZip(zip); if (imageSize) { const imageOptions = getImageOptions(imageSize); doc.attachModule(new ImageModule(imageOptions)); } doc.compile(); doc.resolveData(data).then(() => { resolve(doc); }); }); }); } /** * 准备docx文档,返回blob对象 * @param {*} tempDocpath 模板docx文件路径 * @param {*} data 数据对象 * @param {*} zipName 压缩包名称 * @param {*} imageSize 图片大小配置对象 * @returns */ function prepareDocxBlob(tempDocpath, data, imageSize) { return prepareDocxtemplater(tempDocpath, data, imageSize).then((doc) => { try { doc.render(); } catch (error) { console.log(error); throw error; } const out = doc.getZip().generate({ type: 'blob', mimeType: 'application/vnd.openxmlformats-officedocumnet.wordprocessingml.document' }); return out; }); } function prepareDocxStr(tempDocpath, data, imageSize) { return prepareDocxtemplater(tempDocpath, data, imageSize).then((doc) => { try { return doc.render(); } catch (error) { console.log(error); throw error; } }); } function preparePdf(tempDocpath, data, imageSize) { return prepareDocxStr(tempDocpath, data, imageSize).then( (res) => { // 将 Word 文档转换为 PDF 格式并保存到文件 console.log(pdfMake); // const printer = new pdfMake.PdfPrinter(); const docDefinition = { content: [ { text: res.toString('utf8') } ] }; const pdfDoc = pdfMake.createPdf(docDefinition); // const pdfBuffer = await pdfDoc.getBuffer(); // return new Blob([pdfBuffer], { type: 'application/pdf' }); return pdfDoc; }); } function exportDocx(tempDocpath, data, zipName, imageSize) { return prepareDocxBlob(tempDocpath, data, zipName, imageSize).then((blob) => { FileSaver.saveAs(blob, zipName); }); } function previewDocx(blob, ref) { return renderAsync(blob, ref); } function downloadDocx(blob, zipName) { FileSaver.saveAs(blob, zipName); } function print( ref, title, style, type, jsonData, borderHeadStyle, gridStyle, css ) { printJS({ printable: ref, header: title || null, type: type || 'html', headerStyle: 'font-size:6px;font-weight:600;text-align:center;padding:15px 0 10px 0;', //标题设置 properties: jsonData || [], //json数据元 gridHeaderStyle: borderHeadStyle || 'font-size:6px;font-weight:400;height:40px;line-height:40px;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //json格式表头样式 gridStyle: gridStyle || 'font-size:1px;font-weight:200;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //json各式表哥央视 scanStyles: false, //不适用默认样式 repeatTableHeader: false, //打印json表头只显示在第一页 style: style || '@page{size:auto;margin: 0cm 1cm 0cm 1cm;}', //去除页眉页脚 css: css || null //css url }); } export { exportDocx, prepareDocxBlob, preparePdf, previewDocx, downloadDocx, print };