教你用十行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 相关文章推荐
关于图片验证码设计的思考
Jan 29 Javascript
javascript Zifa FormValid 0.1表单验证 代码打包下载
Jun 08 Javascript
更换select下拉菜单背景样式的实现代码
Dec 20 Javascript
jQuery:节点(插入,复制,替换,删除)操作
Mar 04 Javascript
html超链接打开窗口大小的方法
Mar 05 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
Jan 09 Javascript
JavaSacript中charCodeAt()方法的使用详解
Jun 05 Javascript
js删除局部变量的实现方法
Jun 25 Javascript
jquery做个日期选择适用于手机端示例
Jan 10 Javascript
vue.js实现单选框、复选框和下拉框示例
Jul 18 Javascript
vue项目中应用ueditor自定义上传按钮功能
Apr 27 Javascript
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
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
基于mysql的论坛(1)
2006/10/09 PHP
PHP 在线翻译函数代码
2009/05/07 PHP
php生成excel文件的简单方法
2014/02/08 PHP
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
Vue使用axios出现options请求方法
2019/05/30 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
用JS实现选项卡
2020/03/23 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
python遍历序列enumerate函数浅析
2017/10/17 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
Python os库常用操作代码汇总
2020/11/03 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
查环查孕证明
2014/01/10 职场文书
工作决心书范文
2014/03/11 职场文书
工程项目建议书范文
2014/03/12 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
国庆宣传标语
2014/06/30 职场文书