教你用十行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资料toString 方法
Mar 13 Javascript
JavaScript URL参数读取改进版
Jan 16 Javascript
Javascript 代码也可以变得优美的实现方法
Jun 22 Javascript
工作需要写的一个js拖拽组件
Jul 28 Javascript
javascript页面渲染速度测试脚本分享
Apr 15 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 Javascript
原生js和jquery实现图片轮播特效
Apr 23 Javascript
JavaScript数据类型学习笔记分享
Sep 01 Javascript
Angular单元测试之事件触发的实现
Jan 20 Javascript
Vue脚手架编写试卷页面功能
Mar 17 Javascript
angular中的post请求处理示例详解
Jun 30 Javascript
Element PageHeader页头的使用方法
Jul 26 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的开发框架的现状和展望
2007/03/16 PHP
隐藏你的.php文件的实现方法
2007/03/19 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
浅析PHP 按位与或 (^ 、&amp;)
2013/06/21 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
Vue实现手机计算器
2020/08/17 Javascript
Python实现抓取页面上链接的简单爬虫分享
2015/01/21 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
python中count函数简单用法
2020/01/05 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
信息管理员岗位职责
2013/12/01 职场文书
服务质量承诺书
2014/03/27 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
广播体操比赛口号
2014/06/10 职场文书
解除劳动合同证明书
2014/09/26 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
2015年司机工作总结
2015/04/23 职场文书
九九重阳节致辞
2015/07/31 职场文书
python字典进行运算原理及实例分享
2021/08/02 Python
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL