教你用十行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 相关文章推荐
利用jQuery的$.event.fix函数统一浏览器event事件处理
Dec 21 Javascript
JavaScript 原型学习总结
Oct 29 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
Oct 09 Javascript
浅谈js中变量初始化
Feb 03 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
Jan 04 Javascript
JavaScript实现邮箱地址自动匹配功能代码
Nov 28 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
Jan 21 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
打通前后端构建一个Vue+Express的开发环境
Jul 17 Javascript
vue用递归组件写树形控件的实例代码
Jul 19 Javascript
JS中验证整数和小数的正则表达式
Oct 08 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
php 获取百度的热词数据的代码
2012/02/18 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
用php简单实现加减乘除计算器
2014/01/06 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
vue组件的写法汇总
2018/04/12 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
Python文件和流(实例讲解)
2017/09/12 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
如何提高python 中for循环的效率
2020/04/15 Python
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
应届生学校辅导员求职信
2013/11/07 职场文书
《白鹅》教学反思
2014/04/13 职场文书
项目投资建议书
2014/05/16 职场文书
大学生优秀班干部事迹材料
2014/05/26 职场文书
2014年后勤工作总结
2014/11/18 职场文书
2015年煤矿工作总结
2015/04/28 职场文书
原告离婚代理词
2015/05/23 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书