教你用十行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 FileReader上传图片显示本地链接
May 27 Javascript
AngularJS基础 ng-mousemove 指令简单示例
Aug 02 Javascript
BootStrap中Datepicker控件带中文的js文件
Aug 10 Javascript
浅析BootStrap中Modal(模态框)使用心得
Dec 24 Javascript
VUE实现一个分页组件的示例
Sep 13 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 Javascript
node.js中express模块创建服务器和http模块客户端发请求
Mar 06 Javascript
ES6入门教程之变量的解构赋值详解
Apr 13 Javascript
JS 自执行函数原理及用法
Aug 05 Javascript
简单使用webpack打包文件的实现
Oct 29 Javascript
JS实现动态无缝轮播
Jan 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 MemCached 高级缓存应用代码
2010/08/05 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
php定时执行任务设置详解
2015/02/06 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
JS日历 推荐
2006/12/03 Javascript
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
js右键菜单效果代码
2007/07/21 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
javascript数组去重小结
2016/03/07 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
python实现自动重启本程序的方法
2015/07/09 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
python打开音乐文件的实例方法
2020/07/21 Python
python SOCKET编程基础入门
2021/02/27 Python
纯css3制作煽动翅膀的蝴蝶的示例
2018/04/23 HTML / CSS
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
zooplus波兰:在线宠物店
2019/07/21 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
大型晚会策划方案
2014/02/06 职场文书
银行求职自荐书
2014/06/25 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
合理化建议书
2015/02/04 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS