打开源代码临时图像模块
此寄存器持有一个forked chax-at版本 docxtemter后期图像模块.
此软件包是开源的 。 还有一个 付费版本 由 docxtemplate 作者维护.
注意此版本与 docxtemplate 3.x相容.
安装
您首先需要安装 docxtimpter, 方法是跟踪它 安装指南。 。 。 .
对于Node.js安装此软件包:
npm install docxtemplater-image-module-free
对于浏览器查找构建于 build/ 目录.
或者,您可以从以下来源创建自己的建筑:
npm run compile
npm run browserify
npm run uglify
使用量
假设你 docx 文档 或者说 页:1 模板只包含文本 {%image}数字 :
//Node.js example
var ImageModule = require('open-docxtemplater-image-module');
//Below the options that will be passed to ImageModule instance
var opts = {}
opts.centered = false; //Set to true to always center images
opts.fileType = "docx"; //Or pptx
//Pass your image loader
opts.getImage = function(tagValue, tagName) {
//tagValue is 'examples/image.png'
//tagName is 'image'
return fs.readFileSync(tagValue);
}
//Pass the function that return image size
opts.getSize = function(img, tagValue, tagName) {
//img is the image returned by opts.getImage()
//tagValue is 'examples/image.png'
//tagName is 'image'
//tip: you can use node module 'image-size' here
return [150, 150];
}
var imageModule = new ImageModule(opts);
var zip = new JSZip(content);
var doc = new Docxtemplater()
.attachModule(imageModule)
.loadZip(zip)
.setData({image: 'examples/image.png'})
.render();
var buffer = doc
.getZip()
.generate({type:"nodebuffer"});
fs.writeFile("test.docx",buffer);
关于模板的一些说明:
- docx 文档 文件: 占位符
{%image}必须是专门段落. - 页:1 文件: 占位符
{%image}必须在指定的文本单元格中.
在浏览器中, 显示如何同步实现图像 :
<html>
<script src="node_modules/docxtemplater/build/docxtemplater.js"></script>
<script src="node_modules/jszip/dist/jszip.js"></script>
<script src="node_modules/jszip/vendor/FileSaver.js"></script>
<script src="node_modules/jszip-utils/dist/jszip-utils.js"></script>
<script src="build/imagemodule.js"></script>
<script>
JSZipUtils.getBinaryContent('examples/image-example.docx', function (error, content) {
if (error) {
console.error(error);
return;
}
var opts = {}
opts.centered = false;
opts.getImage = function (tagValue, tagName) {
return new Promise(function (resolve, reject) {
JSZipUtils.getBinaryContent(tagValue, function (error, content) {
if (error) {
return reject(error);
}
return resolve(content);
});
});
}
opts.getSize = function (img, tagValue, tagName) {
// FOR FIXED SIZE IMAGE :
return [150, 150];
// FOR IMAGE COMING FROM A URL (IF TAGVALUE IS AN ADRESS) :
// To use this feature, you have to be using docxtemplater async
// (if you are calling setData(), you are not using async).
return new Promise(function (resolve, reject) {
var image = new Image();
image.src = url;
image.onload = function () {
resolve([image.width, image.height]);
};
image.onerror = function (e) {
console.log('img, tagValue, tagName : ', img, tagValue, tagName);
alert("An error occured while loading " + tagValue);
reject(e);
}
});
}
var imageModule = new ImageModule(opts);
var zip = new JSZip(content);
var doc = new docxtemplater()
.loadZip(zip)
.attachModule(imageModule)
.compile();
doc.resolveData({
image: 'examples/image.png'
}).then(function () {
console.log('ready');
doc.render();
var out = doc.getZip().generate({
type: "blob",
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
});
saveAs(out, "generated.docx");
})
});
</script>
</html>
居中图像
您可以通过设置全局切换为真来居中所有图像 opts.centered = true。 。 。 .
如果您要选择哪个图像应逐一居中:
- 设置全局切换为假
opts.centered = false。 。 。 . - 使用
{%image}对于不应该被集中的图像. - 使用
{%%image}用于您想要看到的图像.
单位 页:1 生成的文档,图像相对母单元格垂直和水平地居中.
同步支持
在获取图像函数中返回一个承诺并使用 docxtimpter async api 以同步方式获取图像是可能的 : http://docxtemplater.readthedocs.io/en/latest/async.html 页面存档备份,存于互联网档案馆
如果您想要同步解决大小( 如上面的浏览器示例) , 您也可以返回在 getSize 函数中的承诺 .
以下是节点中的一个例子,它允许您从 URL 中获取值并使用固定宽度, 并保持宽度比 .
const fs = require("fs");
const DocxTemplater = require("docxtemplater");
const https = require("https");
const Stream = require("stream").Transform;
const ImageModule = require("./es6");
const JSZip = require("jszip");
const content = fs.readFileSync("demo_template.docx");
const data = {
image: "https://docxtemplater.com/xt-pro.png"
};
const opts = {};
opts.getImage = function (tagValue, tagName) {
console.log(tagValue, tagName);
// tagValue is "https://docxtemplater.com/xt-pro-white.png" and tagName is "image"
return new Promise(function (resolve, reject) {
getHttpData(tagValue, function (err, data) {
if (err) {
return reject(err);
}
resolve(data);
});
});
};
opts.getSize = function (img, tagValue, tagName) {
console.log(tagValue, tagName);
// img is the value that was returned by getImage
// This is to force the width to 600px, but keep the same aspect ration
const sizeOf = require("image-size");
const sizeObj = sizeOf(img);
console.log(sizeObj);
const forceWidth = 600;
const ratio = forceWidth / sizeObj.width;
return [
forceWidth,
// calculate height taking into account aspect ratio
Math.round(sizeObj.height * ratio),
];
};
const imageModule = new ImageModule(opts);
const zip = new JSZip(content);
const doc = new DocxTemplater()
.loadZip(zip)
.attachModule(imageModule)
.compile();
doc
.resolveData(data)
.then(function () {
console.log("data resolved");
doc.render();
const buffer = doc
.getZip()
.generate({
type: "nodebuffer",
compression: "DEFLATE"
});
fs.writeFileSync("test.docx", buffer);
console.log("rendered");
})
.catch(function (error) {
console.log("An error occured", error);
});
function getHttpData(url, callback) {
https
.request(url, function (response) {
if (response.statusCode !== 200) {
return callback(
new Error(
`Request to ${url} failed, status code: ${response.statusCode}`
)
);
}
const data = new Stream();
response.on("data", function (chunk) {
data.push(chunk);
});
response.on("end", function () {
callback(null, data.read());
});
response.on("error", function (e) {
callback(e);
});
})
.end();
}
基于占位符的大小和路径
您可以使用模板的占位符名称来拥有自定义的图像加载器 .
opts.getImage = function (tagValue, tagName) {
if(tagName === 'logo')
return fs.readFileSync(__dirname + '/logos/' + tagValue);
return fs.readFileSync(__dirname + '/images/' + tagValue);
};
同样的东西可以用来定制图像大小.
opts.getSize = function (img, tagValue, tagName) {
if(tagName === 'logo')
return [100, 100];
return [300, 300];
};
基础64包括
您可以使用以下代码的 Base64 图像 :
function base64DataURLToArrayBuffer(dataURL) {
const base64Regex = /^data:image\/(png|jpg|svg|svg\+xml);base64,/;
if (!base64Regex.test(dataURL)) {
return false;
}
const stringBase64 = dataURL.replace(base64Regex, "");
let binaryString;
if (typeof window !== "undefined") {
binaryString = window.atob(stringBase64);
} else {
binaryString = new Buffer(stringBase64, "base64").toString("binary");
}
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
const ascii = binaryString.charCodeAt(i);
bytes[i] = ascii;
}
return bytes.buffer;
}
const imageOpts = {
getImage(tag) {
return base64DataURLToArrayBuffer(tag);
},
getSize() {
return [100, 100];
},
};
doc.attachModule(new ImageModule(imageOpts));