当前位置: 首页 > news >正文

【Js】导出 HTML 为 Word 文档

在 Web 开发中,有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档,以便更方便地分享和打印。

html样式

word文档

工具准备

1、 html-docx-js - npm

html-docx-js是一个 JavaScript 库,用于将 HTML 内容转换为 Word 文档的格式。它提供了简单的 API,使得在浏览器环境中可以轻松地生成并导出 Word 文档 

2、 file-saver - npm

file-saver是一个 JavaScript 库,用于在浏览器中保存文件。它简化了通过 Blob 对象保存文件的过程,并提供了一个直观的 API。

代码实现

1、先引入这两个库:可以通过 npm 安装,也可以直接使用 CDN 引入,还可以下载到本地项目引用。

<!-- 使用 npm 安装 -->
<!-- npm install html-docx-js file-saver --><!-- 或者直接使用 CDN 引入 -->
<script src="https://cdn.jsdelivr.net/npm/html-docx-js/dist/html-docx.js"></script>
<script src="https://cdn.jsdelivr.net/npm/file-saver/dist/FileSaver.min.js"></script><!-- 或者访问上面CDN链接,保存到本地,放在项目里引用 -->
<script src="./js/html-docx.js"></script>
<script src="./js/FileSaver.min.js"></script>

2、创建一个导出方法,该方法接受 HTML 内容作为参数,并将其导出为 Word 文档。 

const exportHtmlToDocx = (htmlContent, fileName = 'exported-document.docx') => {// 将HTML元素转换为字符串,并提取图片const regularImages = Array.from(htmlContent.querySelectorAll('img'));const imagePromises = regularImages.map(imgElement => {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');const imgObj = new Image();imgObj.crossOrigin = 'Anonymous'; // 如果图片需要跨域访问imgObj.src = imgElement.src;return new Promise((resolve, reject) => {imgObj.onload = () => {//canvas 图片缩小到固定大小//如果页面上img设置了style="width:50px;height:50px",已页面设置的为主,如果没有设置就是默认图片的大小canvas.width = imgElement.width || imgObj.width;// 想要的canvas固定宽度canvas.height = imgElement.height || imgObj.height;// 想要的canvas固定高度//计算缩放比例var ratio = Math.min(canvas.width / imgObj.width, canvas.height / imgObj.height);var scaledWidth = imgObj.width * ratio;var scaledHeight = imgObj.height * ratio;var offsetX = (canvas.width - scaledWidth) / 2;var offsetY = (canvas.height - scaledHeight) / 2;// 绘制缩小后的图片ctx.drawImage(imgObj, 0, 0, imgObj.width, imgObj.height, offsetX, offsetY, scaledWidth, scaledHeight);// 将缩小后的图片导出为PNGresolve(canvas.toDataURL('image/png'));};imgObj.onerror = reject;});});Promise.all(imagePromises).then(dataUris => {dataUris.forEach((dataUri, i) => {regularImages[i].src = dataUri;});// 构建包含 HTML 内容的完整 HTML 文档字符串const fullHtmlContent = `<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body>${htmlContent.outerHTML}</body></html>`;// 使用 html-docx-js 将 HTML 转换为 Word 文档的 Blob 对象const converted = htmlDocx.asBlob(fullHtmlContent);// 使用 file-saver 保存 Blob 对象为 Word 文档文件saveAs(converted, fileName);});
};

3、在应用中调用上述导出方法,并传入想导出的 HTML 内容。

注意:html结构需要包含style样式,引入css文件样式不生效的

//html页面上
<a class="fs-14 text-g" ng-click="vm.daochu()">导出</a>
<div class="row" id="resumeAllInfo"><div class="row" style="color:#205081;font-size:16px;border-bottom:1px solid #eee;margin-bottom: 15px;padding-bottom: 5px;">基本信息</div><div class="row" style="vertical-align: middle"><span style="float: left;margin-right:20px"><img style="width:50px;height:50px" ng-src="{{ vm.resume.portraitUrl }}" rw-default-img img-type="portrait" alt="头像"></span><span><span style="font-size:16px;margin-right:20px">{{ vm.resume.name }}</span><span style="margin-right:10px">{{ vm.resume.phone }}</span><span ng-if="vm.resume.wechat" style="margin-right:10px"><span style="margin-right:10px">|</span>{{ vm.resume.wechat }}</span><span ng-if="vm.resume.qq" style="margin-right:10px"><span style="margin-right:10px">|</span>{{ vm.resume.qq }}</span><span ng-if="vm.resume.email" style="margin-right:10px"><span style="margin-right:10px">|</span>{{ vm.resume.email }}</span></span></div>
</div><script>……vm.daochu=daochu;function daochu() {// 获取要导出的HTML字符串const htmlElement = document.getElementById('resumeAllInfo');//调用导出方法exportHtmlToDocx(htmlElement, 'my-exported-document.docx');}  
</script>    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【EXCELL技巧篇】使用Excel公式,获取当前 Excel的Sheet页的名字
  • FPGA笔试
  • 数据湖表格式 Hudi/Iceberg/DeltaLake/Paimon TPCDS 性能对比(Spark 引擎)
  • Ubuntu linux安装新版本go
  • 采用反相正基准电压电路的同相运算放大器(运放)
  • easyswoole/Hyperf开发的php系统 cpu超负荷定位排查
  • debian 实现离线批量安装软件包
  • Netty HTTP
  • kibana连接elasticsearch(版本8.11.3)
  • 为什么渲染农场渲染的是帧,而不是视频?
  • 小程序里面使用vant ui中的vant-field组件,如何使得输入框自动获取焦点
  • COMX-P2020、COMX-P1022 vxWorks系统开发主机
  • 1.Introduction to Spring Web MVC framework
  • 基于python的图像去水印
  • ArcGIS如何快速对齐两个图层
  • axios 和 cookie 的那些事
  • create-react-app项目添加less配置
  • Date型的使用
  • Fastjson的基本使用方法大全
  • Intervention/image 图片处理扩展包的安装和使用
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Vue2.x学习三:事件处理生命周期钩子
  • Wamp集成环境 添加PHP的新版本
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 计算机在识别图像时“看到”了什么?
  • 前端代码风格自动化系列(二)之Commitlint
  • 前嗅ForeSpider教程:创建模板
  • 算法---两个栈实现一个队列
  • 追踪解析 FutureTask 源码
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • (11)MSP430F5529 定时器B
  • (175)FPGA门控时钟技术
  • (蓝桥杯每日一题)love
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十六)视图变换 正交投影 透视投影
  • (四)linux文件内容查看
  • (四)图像的%2线性拉伸
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .CSS-hover 的解释
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net MVC4 上传大文件,并保存表单
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 事件模型教程(二)
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net中应用SQL缓存(实例使用)
  • [<死锁专题>]
  • [C#]winform部署yolov9的onnx模型
  • [C#C++]类CLASS
  • [C++]类和对象【下】
  • [cvpr 2024 目标检测 前沿研究 热点] cpvr 2024中与目标检测主题有关的论文