import docxtemplater from 'docxtemplater'
import PizZip from 'pizzip'
import JSZipUtils from 'jszip-utils'
import { saveAs } from 'file-saver'
import ImageModule from 'docxtemplater-image-module-free'
const exportDoc = async () => {
let docxsrc = '../../src/assets/template.docx' //模板文件的位置
let docxname = '报告导出' //导出文件的名字
let imgs = await dowImgs('http://xxx.com/1.png')
let imgsBase64 = ''
blobToDataURI(imgs, (e) => {
imgsBase64 = e
})
JSZipUtils.getBinaryContent(docxsrc, async function (error: any, content: any) {
const imageModule = new ImageModule(imageOpts)
let zip = new PizZip(content)
let doc = new docxtemplater()
doc.loadZip(zip)
doc.attachModule(imageModule)
doc.setData({
imgs: imgsBase64
})
doc.render()
let out = doc.getZip().generate({
type: 'blob',
mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
})
// 将目标文件对象保存为目标类型的文件,并命名
saveAs(out, docxname)
})
}
// 下载图片 转换成 blob
const dowImgs = async (str: string) => {
return await fetch(str).then((res) => res.blob())
}
const imageOpts = {
getImage: function (tagValue) {
return tagValue
},
getSize: function () {}
}
// blob 转换成 base64
const blobToDataURI = (blob, callback) => {
var reader = new FileReader()
reader.onload = function (e) {
callback(e.target.result)
}
reader.readAsDataURL(blob)
}
上面是导出word的方法。
我的word 只有一个imgs 占位符。{imgs}
如果我使用{%imgs} 会直接报错
index.js:180 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading '0')
at ImageModule2.getRenderedPart (index.js:180)
at ImageModule2.render (index.js:141)
at moduleRender (render.js:9)
at render.js:26
at Array.map (<anonymous>)
at render (render.js:24)
at XmlTemplater.render (xml-templater.js:199)
而上面导出的word 出现直接将base64 的编码直接输出到word 文件里面去。
base64 编码是正确的,可以反义成正确的图片。
现在我不知道哪里的问题,导致我的word 无法正常显示图片。请指教