教你用十行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 相关文章推荐
Prototype使用指南之range.js
Jan 10 Javascript
11款新鲜的jQuery插件[附所有demo下载]
Jan 24 Javascript
js将long日期格式转换为标准日期格式实现思路
Apr 07 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
javascript使用call调用微信API
Dec 15 Javascript
Javascript中Array用法实例分析
Jun 13 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
Sep 02 Javascript
关于js二维数组和多维数组的定义声明(详解)
Oct 02 Javascript
jQuery滑动效果实现方法分析
Sep 05 jQuery
其实你可以少写点if else与switch(推荐)
Jan 10 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
Feb 11 Javascript
使用Mock.js生成前端测试数据
Dec 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
织梦模板标记简介
2007/03/11 PHP
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
javascript中HTMLDOM操作详解
2014/12/11 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
JS实现div模块的截图并下载功能
2017/10/17 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
python版本五子棋的实现代码
2018/12/11 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
保时捷设计:Porsche Design
2019/03/30 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
Linux常见面试题
2013/03/18 面试题
军训的自我鉴定
2013/12/10 职场文书
高三学习决心书
2014/03/11 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
Python中第三方库Faker的使用详解
2022/04/02 Python
Pandas 数据编码的十种方法
2022/04/20 Python
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL