教你用十行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 相关文章推荐
Google Dart编程语法和基本类型学习教程
Nov 27 Javascript
JavaScript如何获取数组最大值和最小值
Nov 18 Javascript
Jquery判断form表单数据是否变化
Mar 30 Javascript
js中获取键盘事件的简单实现方法
Oct 10 Javascript
jquery实现全选、全不选以及单选功能
Mar 23 jQuery
CSS3结合jQuery实现动画效果及回调函数的实例
Dec 27 jQuery
vue 循环加载数据并获取第一条记录的方法
Sep 26 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 Javascript
vue把输入框的内容添加到页面的实例讲解
Nov 11 Javascript
javascript实现时钟动画
Dec 03 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
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
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
两个php日期控制类实例
2014/12/09 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
PHP中16个高危函数整理
2019/09/19 PHP
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
使用python绘制二元函数图像的实例
2019/02/12 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
python安装和pycharm环境搭建设置方法
2020/05/27 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
了解AppleShare protocol(AppleShare协议)吗
2015/08/28 面试题
UNIX文件系统分类
2014/11/11 面试题
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
服务之星获奖感言
2014/01/21 职场文书
总经理岗位职责范本
2014/02/02 职场文书
2015年保送生自荐信
2015/03/24 职场文书
社会实践活动总结格式
2015/05/11 职场文书