JavaScript实现word转png的示例代码

 更新时间:2024年02月06日 08:24:32   作者:前端_老Q  
这篇文章主要为大家详细介绍了如何使用JavaScript实现word转png的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

由于 java 后端的 itext 库是收费版,公司安全部门发出安全警告,要求整改。

所以采用前端实现 word 文档转图片功能。

一、需求

上传 docx 文件,并生成 png 图片作为缩略图

二、分析

前端无法直接把 docx 文档转成图片格式

三、解决方案

既然直接转无法实现,那就采用迂回战术

  • 先转成 html(用到库 docx-preview
  • 再将 html 转成 canvas(用到库 html2canvas
  • 最后将 canvas 转成 png

四、实现步骤

1.将 docx 文件转成 html 格式,并插入目标节点中

安装 docx-preview 依赖: pnpm add docx-preview --save

import { useEffect } from 'react';
import * as docx from 'docx-preview';

export default ({ file }) => {
  useEffect(() => {
    // file 为上传好的 docx 格式文件
    docx2Html(file);
  }, [file]);

  /**
   * @description: docx 文件转 html
   * @param {*} file: docx 格式文件
   * @return {*}
   */
  const docx2Html = file => {
    if (!file) {
      return;
    }
    // 只处理 docx 文件
    const suffix = file.name?.substr(file.name.lastIndexOf('.') + 1).toLowerCase();
    if (suffix !== 'docx') {
      return;
    }
    const htmlContentDom = document.querySelector('#htmlContent'); // 生成 html 后挂载的 dom 节点
    const docxOptions = Object.assign(docx.defaultOptions, {
      debug: true,
      experimental: true,
    });
    docx.renderAsync(file, htmlContentDom, null, docxOptions).then(() => {
      console.log('docx 转 html 完成');
    });
  };

  return <div id='htmlContent' />;
};

此时,在 idhtmlContent 的节点下,就可以看到转换后的 html 内容了

2.将 html 转成 canvas

安装 html2canvas 依赖: pnpm add html2canvas --save

import html2canvas from 'html2canvas';

/**
 * @description: dom 元素转为图片
 * @return {*}
 */
const handleDom2Img = async () => {
  const htmlContentDom = document.querySelector('#htmlContent'); // 生成 html 后挂载的 dom 节点
  // 获取刚刚生成的 dom 元素
  const htmlContent = htmlContentDom.querySelectorAll('.docx-wrapper>section')[0]; // 需要生成图片的 html 内容
  // 创建 canvas 元素
  const canvasDom = document.createElement('canvas');

  // 获取 dom 宽高
  const w = parseInt(window.getComputedStyle(htmlContent).width, 10);
  // const h = parseInt(window.getComputedStyle(htmlContent).height, 10);

  // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
  const scale = window.devicePixelRatio; // 缩放比例
  canvasDom.width = w * scale; // 取文档宽度
  canvasDom.height = w * scale; // 缩略图是正方形,所以高度跟宽度保持一致

  // 按比例增加分辨率,将绘制内容放大对应比例
  const canvas = await html2canvas(htmlContent, {
    canvas: canvasDom,
    scale,
    useCORS: true,
  });
  return canvas;
};

3.将生成好的 canvas 转成 png 文件,并下载

// 将 canvas 转为 base64 图片
const base64Str = canvas.toDataURL();

// 下载图片
const imgName = `图片_${new Date().valueOf()}`;
const aElement = document.createElement('a');
aElement.href = base64Str;
aElement.download = `${imgName}.png`;
document.body.appendChild(aElement);
aElement.click();
document.body.removeChild(aElement);
window.URL.revokeObjectURL(base64Str);

到此这篇关于JavaScript实现word转png的示例代码的文章就介绍到这了,更多相关JavaScript word转png内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript Title、alt提示(Tips)实现源码解读

    JavaScript Title、alt提示(Tips)实现源码解读

    我们知道给某些HTML标签加上title属性后,这个标签对象在浏览的时候,鼠标移上去就会有一个小提示框出来,并显示title定义的内容。
    2010-12-12
  • JS轮播图的实现方法2

    JS轮播图的实现方法2

    这篇文章主要为大家详细介绍了JS轮播图的具体实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • javascript模拟select,jselect的方法实现

    javascript模拟select,jselect的方法实现

    由于主流浏览器对select元素渲染不同,所以在每种浏览器下显示也不一样,最主要的是默认情况下UI太粗糙,即使通过css加以美化也不能达到很美观的效果
    2012-11-11
  • JavaScript双等号(==)与三等号(===)的区别举例详解

    JavaScript双等号(==)与三等号(===)的区别举例详解

    在JavaScript中判断值相等有两种操作符,即双等号(==)和三等号(===),这篇文章主要给大家介绍了关于JavaScript双等号(==)与三等号(===)区别的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • BootStrap数据表格实例代码

    BootStrap数据表格实例代码

    本文通过实例代码给大家分享了BootStrap数据表格的相关知识,感兴趣的朋友一起看看吧
    2017-09-09
  • 使用JS实现图片展示瀑布流效果(简单实例)

    使用JS实现图片展示瀑布流效果(简单实例)

    下面小编就为大家带来一篇使用JS实现图片展示瀑布流效果(简单实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • JavaScript执行效率与性能提升方案

    JavaScript执行效率与性能提升方案

    如何提升JavaScript执行效率与性能在前端开发中位于一个很重要的地方,这节来研究下如何在平时做项目过程中,提升JavaScript性能与运行效率,需要的朋友可以参考下
    2012-12-12
  • javascript charAt() arr[i]数组实例代码

    javascript charAt() arr[i]数组实例代码

    实例区别一下charAt()和arr[i].toString()的使用方法
    2008-08-08
  • JavaScript实现垂直向上无缝滚动特效代码

    JavaScript实现垂直向上无缝滚动特效代码

    下面小编就为大家带来一篇JavaScript实现垂直向上无缝滚动特效代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • JavaScript 数组遍历的五种方法

    JavaScript 数组遍历的五种方法

    这篇文章主要介绍了JavaScript 数组遍历的五种方法,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下
    2021-03-03

最新评论