使用docxtemplater-image-module-free时支持动态获取图片大小

使用docxtemplater-image-module-free时支持动态获取图片大小

1、问题背景

在使用docxtemplater-image-module-free生成模板图片时,写死了其中一个函数

javascript 复制代码
getSize() {
    return [150, 150];
},

导致图片都是一个大小,且被拉扯的变形了

2、报错信息

在去掉这个函数时报错:

shell 复制代码
Error: You should pass getSize

因此该函数必须规定图片的大小

3、电脑环境

  • 操作系统: Windows 11
  • docxtemplater-image-module-free:1.1.1
  • docxtemplater:3.40.3
  • node.js:18.18.2

4、解决问题

4.1、问题思路

查找docxtemplater-image-module-free的官方文档:https://docxtemplater.com/modules/image/#usage-browser

发现完全可以自定义图片的大小

4.2、解决方法

在浏览器环境中,使用Image对象动态获取图片的大小

js 复制代码
getSize(img, url, tagName) {
    return new Promise(function (resolve, reject) {
        const image = new Image();
        image.src = url;
        image.onload = function () {
            resolve([image.width, image.height]);
        };
        image.onerror = function (e) {
            console.log(
                "img, url, tagName : ",
                img,
                url,
                tagName
            );
            alert(
                "An error occured while loading " +
                    url
            );
            reject(e);
        };
    });
},

node.js环境中,使用image-size获取图片的大小

javascript 复制代码
const sizeOf = require("image-size");

getSize(img) {
    const sizeObj = sizeOf(img);
    return [sizeObj.width, sizeObj.height];
}

4.3、优化

一般原图都会比较大,甚至撑满整个docx文档,因此需要设置最大高度和宽度,来响应式计算宽高

javascript 复制代码
getSize(img) {
    const sizeObj = sizeOf(img);
    const maxWidth = 300
    const maxHeight = 300
    let width = Number(sizeObj.width) || 0
    let height = Number(sizeObj.height) || 0
    // 根据需要进行尺寸调整
    if (width > maxWidth) {
    	height *= maxWidth / width;
    	width = maxWidth;
    }
    if (height > maxHeight) {
    	width *= maxHeight / height;
    	height = maxHeight;
    }
    return [width, height];
}
相关推荐
帧栈1 小时前
开发避坑指南(27):Vue3中高效安全修改列表元素属性的方法
前端·vue.js
max5006001 小时前
基于桥梁三维模型的无人机检测路径规划系统设计与实现
前端·javascript·python·算法·无人机·easyui
excel1 小时前
使用函数式封装绘制科赫雪花(Koch Snowflake)
前端
萌萌哒草头将军2 小时前
Node.js v24.6.0 新功能速览 🚀🚀🚀
前端·javascript·node.js
持久的棒棒君4 小时前
启动electron桌面项目控制台输出中文时乱码解决
前端·javascript·electron
小离a_a4 小时前
使用原生css实现word目录样式,标题后面的...动态长度并始终在标题后方(生成点线)
前端·css
郭优秀的笔记5 小时前
抽奖程序web程序
前端·css·css3
布兰妮甜5 小时前
CSS Houdini 与 React 19 调度器:打造极致流畅的网页体验
前端·css·react.js·houdini
小小愿望5 小时前
ECharts 实战技巧:揭秘 X 轴末项标签 “莫名加粗” 之谜及破解之道
前端·echarts
小小愿望6 小时前
移动端浏览器中设置 100vh 却出现滚动条?
前端·javascript·css