教你用十行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 相关文章推荐
关闭ie窗口清除Session的解决方法
Jan 10 Javascript
jquery动态改变form属性提交表单
Jun 03 Javascript
JavaScript设计模式之外观模式介绍
Dec 28 Javascript
jQuery实现高亮显示的方法
Mar 10 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 Javascript
深入理解ECMAScript的几个关键语句
Jun 01 Javascript
微信小程序之购物车功能
Sep 23 Javascript
JS设计模式之数据访问对象模式的实例讲解
Sep 30 Javascript
什么是Vue.js框架 为什么选择它?
Oct 17 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
Mar 10 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
VUE+node(express)实现前后端分离
Oct 13 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生成EXCEL的东东
2006/10/09 PHP
php下载文件的代码示例
2012/06/29 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
jqPlot Option配置对象详解
2009/07/25 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
基于Python实现文件大小输出
2016/01/11 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
Python3运算符常见用法分析
2020/02/14 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
九年级家长会邀请函
2014/01/15 职场文书
运动会通讯稿400字
2014/01/28 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
异地恋情人节寄语
2015/02/28 职场文书
投标单位介绍信
2015/05/05 职场文书
2016中秋节广告语
2016/01/28 职场文书
Python pandas读取CSV文件的注意事项(适合新手)
2021/06/20 Python