教你用十行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字符串函数扩展代码
Sep 13 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
Oct 18 Javascript
调用DOM对象的focus使文本框获得焦点
Feb 19 Javascript
javascript下拉列表中显示树形菜单的实现方法
Nov 17 Javascript
JavaScript提高性能知识点汇总
Jan 15 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
JavaScript实现的浏览器下载文件的方法
Aug 09 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
Sep 19 Javascript
Electron-vue脚手架改造vue项目的方法
Oct 22 Javascript
使用vue-router切换页面时实现设置过渡动画
Oct 31 Javascript
vue循环中点击选中再点击取消(单选)的实现
Sep 10 Javascript
js实现网页随机验证码
Oct 19 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文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
PHP的cURL库简介及使用示例
2015/02/06 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
js判断变量是否未定义的代码
2020/03/28 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
py-charm延长试用期限实例
2019/12/22 Python
在pycharm中实现删除bookmark
2020/02/14 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
类和结构的区别
2012/08/15 面试题
中软国际Java程序员机试题
2012/08/19 面试题
初一学生期末评语
2014/04/24 职场文书
信用卡工资证明范本
2014/10/17 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
中秋节随笔
2015/08/15 职场文书
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫