教你用十行node.js代码读取docx的文本


Posted in Javascript onMarch 08, 2017

前言

最近有一个case。需要去解析word文档。有两个需求,一个是将word文档转成PDF,一个是将word文档中的内容按照一定的规范读取到数据库中,去npm仓库找了大概有十几个包,发现主要是通过以下的方式来转换代码。

  1. 通过调用系统底层程序(比如说office)的API来转换;
  2. 通过模板,替换数据来实现生成PDF;
  3. 通过有些免费将word转成PDF的网站来实现将word转成PDF,比如docx-to-pdf;

后来退而求其次,想通过先将docx转成文字,发现了个textract的包。

当然也有缺点,不支持docx中的标题号,不支持图片等文件。

不怕死的我决定自己干这件事情。

介绍

其实docx就是一个zip包,然后封装了一些xml文件。可以直接将docx的包改后缀为.zip来打开观看。

教你用十行node.js代码读取docx的文本

进入word文件夹

教你用十行node.js代码读取docx的文本

里面有几个主要的文件。

  1. document.xml 这个就是文档的主要内容
  2. numbering.xml 这个就是标题号,以及标题号的一些属性
  3. styles.xml 这个就是样式列表

打开document.xml 你就会发现,所有的文本都是用 <w:t>标签包着的。这个就是本文的关键

代码

首先,需要通过npm安装一个能查看zip文件的包:adm-zip;

然后,写下下列代码即可

const fs = require("fs");
const AdmZip = require('adm-zip'); //引入查看zip文件的包
const zip = new AdmZip(filePath); //filePath为文件路径
let contentXml = zip.readAsText("word/document.xml");//将document.xml读取为text内容;
let str = "";
contentXml .match(/<w:t>[\s\S]*?<\/w:t>/ig).forEach((item)=>{
str += item.slice(5,-6)});
fs.writeFile("./2.txt",str,(err)=>{//将./2.txt替换为你要输出的文件路径
if(err)throw err;
});

最近正在用node.js去解析docx的工作。先将最简单的写在上面。回头有空再继续分享

最新更新

之前随手写的代码,今天测试发现用更新后的代码比源代码的效率提升十倍以上。

//原代码
//str += item.replace("<w:t>","").replace("</w:t>","");
//更新代码
str += item.slice(5,-6)

附上测试代码

var str = "<w:t>sdfjpasif aefnmasd;lf asdfsdf</w:t>";
var arr = [];
for(var i=0;i<50000;i++){
 arr.push(str);
}
console.time("replactest");
arr.forEach((item)=>{
 item.replace(/<w:t>/,"").replace(/<\/w:t>/,"");
});
console.timeEnd("replactest");
//replactest: 20.560ms

console.time("replactest2");
arr.forEach((item)=>{
 item.replace(/<\/*w:t>/g,"");
});
console.timeEnd("replactest2");
//replactest2: 14.926ms

console.time("replactest3");
arr.forEach((item)=>{
 item.replace(/(^<w:t>)|(<\/w:t>$)/g,"");
});
console.timeEnd("replactest3");
//replactest3: 14.402ms

console.time("slice");
arr.forEach((item)=>{
 item.slice(5,-6);
});
console.timeEnd("slice");
//slice: 1.718ms

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用node.js能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
js jquery做的图片连续滚动代码
Jan 06 Javascript
JS setCapture 区域外事件捕捉
Mar 18 Javascript
IE6下js通过css隐藏select的一个bug
Aug 16 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
Dec 18 Javascript
jquery获取img的src值的简单实例
May 17 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
Jan 04 Javascript
微信小程序 用户数据解密详细介绍
Jan 09 Javascript
Vue学习笔记进阶篇之过渡状态详解
Jul 14 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
javascript实现blob加密视频源地址的方法
Aug 08 Javascript
JS遍历树层级关系实现原理解析
Aug 31 Javascript
一行JavaScript代码如何实现瀑布流布局
Dec 11 Javascript
jQuery插件zTree实现获取一级节点数据的方法
Mar 08 #Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
Mar 08 #Javascript
原生js实现放大镜特效
Mar 08 #Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
Mar 08 #Javascript
正则 js分转元带千分符号详解
Mar 08 #Javascript
@ResponseBody 和 @RequestBody 注解的区别
Mar 08 #Javascript
js/jq仿window文件夹框选操作插件
Mar 08 #Javascript
You might like
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
javascript 运算数的求值顺序
2011/08/23 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
浅谈JS正则表达式的RegExp对象和括号的使用
2016/07/28 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
详解JS函数防抖
2020/06/05 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
12步教你理解Python装饰器
2016/02/25 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
Python数据处理numpy.median的实例讲解
2018/04/02 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
简单了解Python生成器是什么
2019/07/02 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
python如何实现DES加密
2020/09/21 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
加工操作管理制度
2014/01/19 职场文书
小学教师国培感言
2014/02/08 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
小学大队长竞选稿
2015/11/20 职场文书
《迟到》教学反思
2016/02/24 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js
ipad隐藏软件app图标方法
2022/04/19 数码科技