教你用十行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 相关文章推荐
javascript 模式设计之工厂模式学习心得
Apr 27 Javascript
jquery isType() 类型判断代码
Feb 14 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
Jul 08 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
Sep 15 Javascript
jQuery动态生成Bootstrap表格
Nov 01 Javascript
vue2.0 自定义日期时间过滤器
Jun 07 Javascript
关于Stream和Buffer的相互转换详解
Jul 26 Javascript
使用Vue-Router 2实现路由功能实例详解
Nov 14 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
Nov 17 Javascript
深入探讨JavaScript的最基本部分之执行上下文
Feb 12 Javascript
Vue路由守卫之路由独享守卫
Sep 25 Javascript
JavaScript 实现下雪特效的示例代码
Sep 09 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
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
php变量范围介绍
2012/10/15 PHP
php缓存技术详细总结
2013/08/07 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
[05:04]完美世界携手游戏风云打造 卡尔工作室地图界面篇
2013/04/23 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python读写Excel文件的实例
2013/11/01 Python
python中的sort方法使用详解
2014/07/25 Python
Python程序中的观察者模式结构编写示例
2016/05/27 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
几款好用的python工具库(小结)
2020/10/20 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
服务中心夜班服务员岗位职责
2013/11/27 职场文书
如何撰写岗位职责
2014/02/01 职场文书
化验室岗位职责
2015/02/14 职场文书
2015年助残日活动总结
2015/03/27 职场文书
房屋维修申请报告
2015/05/18 职场文书
仓库管理制度范本
2015/08/04 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书