使用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];
}
相关推荐
徐小夕2 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
kyriewen3 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
Ivanqhz3 小时前
Rust &‘static str浅析
java·前端·javascript·rust
IT_陈寒4 小时前
SpringBoot这个分页坑,我踩了三天才爬出来
前端·人工智能·后端
颜酱4 小时前
05 | 召回前置准备:根据业务数据库生成各数据库(读取配置阶段)
前端·人工智能·后端
zandy10114 小时前
衡石 Agentic BI的ReAct 推理框架在 Agentic BI 中的工程化实践
前端·javascript·react.js
罗超驿4 小时前
JavaEE进阶之路:从Web架构原理到HTML标签全解析
前端·html·web·javaee
西安小哥4 小时前
从前端到AI工程师:一场跨越鸿沟的真实蜕变之旅
前端
Prince4184 小时前
侧边栏收起缩放适配方案
前端
用户7783366132115 小时前
serpbase + Cloudflare R2 边缘持久化实战
前端·人工智能