| | |
| | | import Docxtemplater from 'docxtemplater'; |
| | | import JSZipUtils from 'jszip-utils'; |
| | | import { saveAs } from 'file-saver'; |
| | | import ImageModule from 'docxtemplater-image-module-free'; // 新增:图片处理模 |
| | | |
| | | // 加载 .docx 模板文件 |
| | | function loadFile(url, callback) { |
| | |
| | | export function download(file, name) { |
| | | |
| | | } |
| | | // 辅助函数:将 base64 图片转为 Uint8Array(图片模块需要此格式) |
| | | function base64ToUint8Array(base64) { |
| | | // 去掉 base64 前缀(如 "data:image/png;base64,") |
| | | const base64WithoutPrefix = base64.replace(/^data:image\/\w+;base64,/, ''); |
| | | const binaryString = atob(base64WithoutPrefix); |
| | | const length = binaryString.length; |
| | | const uint8Array = new Uint8Array(length); |
| | | for (let i = 0; i < length; i++) { |
| | | uint8Array[i] = binaryString.charCodeAt(i); |
| | | } |
| | | return uint8Array; |
| | | } |
| | | |
| | | |
| | | // 生成并下载 Word 文档(templatePath是word文档模版地址,data是对应的数据) |
| | | export function generateWordDocument(templatePath, data, name) { |
| | |
| | | } |
| | | }; |
| | | }; |
| | | // 1. 配置图片处理规则(核心) |
| | | const imageModule = new ImageModule({ |
| | | // 获取图片:根据传入的图片数据(base64)转为模块需要的格式 |
| | | getImage: function (tagValue, tagName) { |
| | | // tagValue:data 中对应图片键的值(必须是 base64 字符串) |
| | | // tagName:图片占位符的键名(如 "avatar") |
| | | return base64ToUint8Array(tagValue); |
| | | }, |
| | | // 设置图片尺寸:返回 [宽度, 高度](单位:px),可动态调整 |
| | | getSize: function (tagValue, tagName) { |
| | | |
| | | // 示例:根据不同的图片键,返回不同尺寸 |
| | | switch (tagName) { |
| | | case 'avatar': // 头像:200x200 |
| | | return [200, 200]; |
| | | case 'coverImg': // 封面图:600x300 |
| | | return [600, 300]; |
| | | default: // 默认尺寸:400x300 |
| | | return [80, 130]; |
| | | } |
| | | } |
| | | }); |
| | | // 加载模板文件内容到 PizZip |
| | | const zip = new PizZip(content); |
| | | const doc = new Docxtemplater(zip, { |
| | | paragraphLoop: true, |
| | | linebreaks: true, |
| | | modules: [imageModule] // 关键:注入图片模块 |
| | | }); |
| | | |
| | | // const parser = new AngularParser(); |