首页 > 其他分享 >JS将docx转为html代码--Vue3(简易版)

JS将docx转为html代码--Vue3(简易版)

时间:2025-01-09 09:54:50浏览次数:1  
标签:docx const -- 标签 JS html mammoth file 匹配

这两天突然接了一个把节气文章转成html页面的需求,本来只是需要多按几下ctrl+c,ctrl+v能解决的事,但是想想后续一年24个节气,就做个自动转换的工具吧。由于做软件还涉及到其他语言和配置环境,所以还是选择了web。
首先创建一个vue3项目,我用的vite搭建的,不会的请自行移步到vite官网
至于docx转html,自行操作的话复杂度高,所以选择了mammoth依赖库。
HTML代码:

点击查看代码
<input type="file" @change="onFileChange" accept=".doc,.docx" />
JS代码:
点击查看代码
function onFileChange(event) { // 选择文件
    const file = event.target.files[0];
    if (file) {
      readWordFile(file);
    }
}
const content = ref(''); // html内容,可在代码中使用v-html展示
function readWordFile(file) { // 读取文件
    const reader = new FileReader(); // 创建FileReader
    reader.onload = async (e) => { // 加载文件
      const arrayBuffer : ArrayBuffer = e.target?.result as ArrayBuffer;
      try {
        const result = await mammoth.convertToHtml({ arrayBuffer }); // 将文件转为html
        console.log("Word file result:", result);
        content.value = result.value // 将结果赋值给content
        // navigator.clipboard.writeText(content.value);
      } catch (error) {
        console.error("Error reading Word file:", error);
      }
    };
    reader.readAsArrayBuffer(file); // 将file用ArrayBuffer格式读取
  }
本来到这就差不多结束了,但是,样式呢?通过显示的结果内容可以看出,mammoth会将段落写在p标签,将标题用h1,h2来包裹,加粗会用strong标签,但是是没有css样式的,这样我们的UI没法通过呀~。在查看内容时也发现图片是用base64渲染的,因为我需要复制此代码放在另外的html页面并渲染在移动端,当有多个图片或图片过大时,会导致编辑器卡顿等问题。于是需要对结果做一些处理,mammoth官方文档也有提供方法和思路,比如mammoth.images.imgElement(),transformElement等,详情可以看mammoth的[npm文档](https://www.npmjs.com/package/mammoth)。但是我还是想自己做处理,于是,魔鬼般的写正则开始了………… 首先,图片和图片介绍小字要改,不过我拿的文章图片和介绍格式比较统一,所以稍微好操作一些,不过图片名称和介绍肯定不一样,对于经常使用replace和replaceAll进行初级转换的我来说确实小小的难住了一下哈哈,在翻看了MDN后,决定采用replace的正则加function返回替换值的方式,至于怎么判定是哪个图片,就定义一个i来累加好了。思路有了,开始敲代码~
点击查看代码
function replaceImagesToTxt (html) { // 替换图片路径和图片介绍
    const regex = /<p\s*>\s*<img\s+[^>]+?\s*>\s*<\/p>\s*<p\s*>(.*?)\s*<\/p>/gi;
    const today = getToday();
    let i = 0;
    return html.replace(regex, function (match, capture) {
      console.log(match);
      i++;
      return `<img style="width: 100%; height: auto;" src="/html/articleImg/${today}/${i}.jpg" alt="图片${i}"><div style="width:100%;text-align:center;font-size:0.8rem;">${capture}</div>`;
    })
}
function  getToday () { // 获取今天日期yyyy/MM/dd
    return new Date().toISOString().split('T')[0].replace(/-/g, '-');
}
替换部分是很好写的,问题在于正则,为了避免匹配超过的情况,所以需要非贪婪模式,大概调试了十来遍之后才写对。 详细解释一下正则表达式的组成部分 1.<p\s*>:

标签后可能有任意数量的空白字符。 2.\s* (在

和<img之间): 这部分匹配<p="">标签关闭的大于号>和<img标签开始的小于号<之间的任意数量的空白字符。这意味着在这两者之间可以有任意数量的空格或没有空格。 3.<img\s+:="" <img="" 匹配字符串<img。="" \s+="" 匹配至少一个空白字符。这确保了<img="">标签后面必须跟着至少一个空白字符,通常用来分隔标签名和属性。 4.([^>]+?): ( 和 ) 定义了一个捕获组,意味着这部分内容会被捕获并可以在替换中使用。 [^>]+? 是一个非贪婪匹配,它会匹配除了大于号>以外的所有字符,直到遇到第一个>为止。这里的+?表示匹配一个或多个字符,但尽可能少地匹配(即非贪婪模式),以确保不会跨过实际的>标签结束符去匹配更多内容。 5.\s*>: \s* 再次匹配任意数量的空白字符。 > 匹配>符号,它是标签的结束。 6.\s*<\/p>: \s* 匹配标签结束后的任意空白字符。 <\/p> 匹配字符串

,注意斜杠被反斜杠转义了,因为斜杠是正则表达式中的特殊字符。 后面如出一辙,就懒得写了,各位自行观看吧。 至于替换其他段落的样式,和以上正则方法类似,就不赘述了,还是要好好学正则呀~。 如果有建议或者意见可以提出来呀,本人第一篇博客,还请多多包涵。

标签:docx,const,--,标签,JS,html,mammoth,file,匹配
From: https://www.cnblogs.com/itcattle/p/18661124

相关文章

  • .NET 隐藏/显示、自定义windows系统光标
    本文介绍如何操作windows系统光标。正常我们设置/隐藏光标,只能改变当前窗体或者控件范围,无法全局操作windows光标。接到一个需求,想隐藏windows全局的鼠标光标显示,下面讲下如何操作 先了解下系统鼠标光标,在鼠标属性-自定义列表中可以看到一共有13种类型,对应13种工作状态:操作系......
  • [THUWC2017] 在美妙的数学王国中畅游 题解(内附求导小技巧)
    事实证明物竞笔记是个好东西,可惜没带,不然还能谎称自己会一点求导和微积分。顺便在这里把比较经典的一些关于求导的东西记录一下:常用函数求导:\(C'=0,(x^n)'=nx^{n-1},(\log_ax)'=\frac1{x\lna}\)\((\lnx)'=\frac1x,(a^x)'=a^x\lna,(e^x)'=e^x\)\((\sinx)'=\cosx=\sin(......
  • 人工智能的未来:2025年值得关注的7大趋势
    图片由DALL-E3生成可以说,2024年是我们最期待新AI发布和公告的一年。尽管过程中有一些失望和意外,但总体来看,AI的发展给我们留下了积极的印象。我之所以这样说,是因为我们中的许多人已经越来越多地将各种模型融入日常生活中。当......
  • 探索环境监测与保护技术:未来的关键技术趋势
    **--- 探索环境监测与保护技术:尚待发展的前沿领域与机遇环境监测与保护技术:随着全球变暖和生态系统破坏的问题日益严峻,人类正寻求创新的方式来预测、应对以及解决这些问题。这些需求促使科学家和工程师研发一系列先进的监测系统与环境保护解决方案。在本文中,我们将探......
  • 160. 相交链表
    [题目连接](160.相交链表-力扣(LeetCode))解题思路:短链表长度为x,长链表长度为y,想让长链表走y-x,然后两个链表同时走,如果相遇直接返回,否则返回空即可。注意,题目明确了,两个链表无环代码classSolution:defgetIntersectionNode(self,headA:ListNode,headB:Li......
  • 使用API方式远程调用ollama模型
    在有GPU的环境启动一个ollama大模型,非常简单:注意,ollama启动时默认监听在127.0.0.1:11434上,可以通过配置OLLAMA_HOST环境变量修改点击查看代码exportOLLAMA_HOST="0.0.0.0:11434"ollamaserve&ollamarunqwen2.5:7b-instruct然后就可以在远端访问:点击查看代......
  • wx.getDeviceVoIPList
    wx.getDeviceVoIPList(Objectobject)基础库2.30.3开始支持,低版本需做兼容处理。以Promise风格调用:不支持小程序插件:不支持微信鸿蒙OS版:支持相关文档:小程序音视频通话(for硬件)功能描述查询当前用户授权的音视频通话设备(组)信息参数Objectobject属性......
  • redis安装
    一、Redis安装(Windows环境)https://download.csdn.net/blog/column/10939729/115372992下载地址:https://github.com/microsoftarchive/redis选择Release将zip解压使用redis-serverredis.windows.conf命令启行启动Redis服务,如下图所示为启动成功,默认端口6379关闭cmd窗口,Red......
  • 1539. Kth Missing Positive Number
    Givenanarray arr ofpositiveintegerssortedina strictlyincreasingorder,andaninteger k.Return the kth positive integerthatis missing fromthisarray.Example1:Input:arr=[2,3,4,7,11],k=5Output:9Explanation:Themissingpositive......
  • wx.getGroupEnterInfo
    wx.getGroupEnterInfo(Objectobject)基础库2.10.4开始支持,低版本需做兼容处理。以Promise风格调用:不支持小程序插件:不支持微信Windows版:支持微信Mac版:支持微信鸿蒙OS版:支持功能描述获取微信群聊场景下的小程序启动信息。群聊场景包括群聊小程序消息卡片......