教你用十行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 相关文章推荐
SlideView 图片滑动(扩展/收缩)展示效果
Aug 01 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
Dec 07 Javascript
react.js 获取真实的DOM节点实例(必看)
Apr 17 Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 Javascript
BootStrap selectpicker后台动态绑定数据
Jun 01 Javascript
详解开源的JavaScript插件化框架MinimaJS
Oct 26 Javascript
基于JS实现简单滑块拼图游戏
Oct 12 Javascript
node读写Excel操作实例分析
Nov 06 Javascript
js实现淘宝首页的banner栏效果
Nov 26 Javascript
jQuery 动画与停止动画效果实例详解
May 19 jQuery
JS实现炫酷雪花飘落效果
Aug 19 Javascript
Node.JS如何实现JWT原理
Sep 18 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 批量替换程序的具体实现代码
2013/10/04 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
重载toString实现JS HashMap分析
2011/03/13 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
python BeautifulSoup使用方法详解
2013/11/21 Python
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
Python的randrange()方法使用教程
2015/05/15 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
python之super的使用小结
2018/08/13 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
django框架auth模块用法实例详解
2019/12/10 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
设计师个人求职信范文
2014/02/02 职场文书
升职演讲稿范文
2014/05/23 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
整改报告格式
2014/11/06 职场文书
英语复习计划
2015/01/19 职场文书
教师自荐信范文
2015/03/06 职场文书
母亲去世追悼词
2015/06/23 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技