前端实现在线预览Word文件

article/2025/8/25 14:15:56

在这里插入图片描述

简介

在项目中遇到了个需求,大致需求这样的:用户在上传文件前需要先预览一下内容,确认内容是否正确,正确的情况下才可以上传
那么这里面会涉及到一个在上传前的文档的预览操作,下面就记录一下踩坑记录

docx-preview

这是一个 纯前端的JavaScript库,它的优点是能 纯前端,可以 不靠后端,对 .docx 的文件进行在线预览,缺点是 不支持doc,不支持doc,不支持doc,重要的事说三遍;
github地址如下:docx-preview,有兴趣的小伙伴可以仔细看一下官方介绍;

安装

npm install docx-preview -S

如果一直安装失败,可以试试使用 cnpm 进行安装

cnpm install docx-preview -S

另外,由于 解析的需要,使用时需要 额外 安装引入一个解析库jszip,由于该库并非是以module的方式,需要在html中的header标签里引入,文件地址:https://unpkg.com/jszip/dist/jszip.min.js

<!DOCTYPE html>
<html lang=""><head><meta charset="utf-8" /><script src="https://unpkg.com/jszip/dist/jszip.min.js"></script></head><body></body>
</html>

建议在项目中直接将该文件直接下载下来,然后放入项目中;

使用

先看一下官方示例

<!--optional polyfill for promise-->
<script src="https://unpkg.com/promise-polyfill/dist/polyfill.min.js"></script>
<!--lib uses jszip-->
<script src="https://unpkg.com/jszip/dist/jszip.min.js"></script>
<script src="docx-preview.min.js"></script>
<script>var docData = <document Blob>;docx.renderAsync(docData, document.getElementById("container")).then(x => console.log("docx: finished"));
</script>
<body>...<div id="container"></div>...
</body>

简单的说,它有3个参数,第一个参数是接接收的文件数据流第二个参数为容器,并且它有一个then的回调函数,执行成功会执行该函数,不过这个并非是它的全部API,具体的API可以前往github自行查找,这些个api实际应该用的非常少,这几个已经够用了;

Vue中使用docx-preview示例

本章节实现一个本地选择文件,并在线展示的示例,大致步骤如下:

  1. 选择一个docx的文件,并获取该文件;
  2. 文件转化成blob格式;
  3. 将Blob格式的数据流展示传入dox-preview中,并展示;

首先是第一步,Html部分如下,组件使用的是 IViewUpload组件,用 element 也一样,目的都是通过组件获得选择的文件

<Uploadactionname="file"id="file"multiple="multiple":auto-upload="false":before-upload="init"
><Button size="small" type="primary">点击上传</Button>
</Upload>

选择文件后读取该文件

 init(file) {var reader = new FileReader();reader.onload = (e) => {};// 传入一个参数对象即可得到基于该参数对象的文本内容reader.readAsDataURL(file);
},

第二步,读取文件数据,将其 转成Blob格式 的数据流

 let arr = e.target.result.split(",");
let data = window.atob(arr[1]);
let mime = arr[0].match(/:(.*?);/)[1];
let ia = new Uint8Array(data.length);
for (var i = 0; i < data.length; i++) {ia[i] = data.charCodeAt(i);
}
const blob = new Blob([ia], { type: mime });
console.log(blob);

第三步,塞进 docx-preview 中进行展示

docx.renderAsync(blob, this.$refs.demoDocContainer).then((x) => {console.log(x);}
); // 渲染到页面

即可完成展示,效果如下:
在这里插入图片描述

完整代码如下

<template><div id="app"><Uploadactionname="file"id="file"multiple="multiple":auto-upload="false":before-upload="init"><Button size="small" type="primary">点击上传</Button></Upload><div class="doc-preview" ref="demoDocContainer">1</div></div>
</template>
<script>
let docx = require("docx-preview");
export default {name: "docx-demo",methods: {init(file) {var reader = new FileReader();reader.onload = (e) => {let arr = e.target.result.split(",");let data = window.atob(arr[1]);let mime = arr[0].match(/:(.*?);/)[1];let ia = new Uint8Array(data.length);for (var i = 0; i < data.length; i++) {ia[i] = data.charCodeAt(i);}const blob = new Blob([ia], { type: mime });docx.renderAsync(blob, this.$refs.demoDocContainer).then((x) => {console.log(x);}); // 渲染到页面};// 传入一个参数对象即可得到基于该参数对象的文本内容reader.readAsDataURL(file);},},
};
</script>
<style lang="less">
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;
}
.doc-preview {width: 100%;height: 800px;background-color: #f5f5f5;
}
</style>

错误处理

在使用的使用遇到一个错误,如下
在这里插入图片描述

后来发现原因是选择的文件格式是 doc格式 的,因此无法被识别,特此在强调一下,该组件只能识别docx格式,不支持识别doc格式的word

doc格式识别

如果一定要识别doc格式的文件,那么 纯前端应该是不行的了(主要是个人没找到合适的办法,如果有大佬研究过着一块,麻烦留言告知,万分感谢),因此不管是下面哪种方法需要后台配合,大致方法有以下这种;

转PDF格式

如题,把doc格式的文件传递给后台,后台取到后将其转换格式,转成PDF格式,之后就方便了,前台可以通过类似于 pdfjs 等工具库进行前台展示,pdfjs官网如下:https://mozilla.github.io/pdf.js/,具体用法可以自行官网查看,
下载的话可以在官网下载,也可以在npm上进行安装
在这里插入图片描述

当然,除了pdfjs,还有一种,就是通过 iframe 进行展示,这种方法更简单,不过稍微原始了点,并且说实话,到了现在 Iframe 并不被w3c所推荐了,但是很多时候确实好用,比如现在,用法如下

<iframe :src="url"></iframe>

url为该文件在后台的地址,由于iframe的特性,可以直接在区域内显示路径显示的文件…

小结

如果不需要识别doc文件,建议使用 docx-preview 进行在线预览,如果 一定要兼容doc,建议转成PDF格式后,通过 pdfjs 或者 Iframe 等库文件进行预览;


http://chatgpt.dhexx.cn/article/LFZiuFwT.shtml

相关文章

前端实现在线预览word(docx),pdf,excel类型的文件

实现方案 找了网上的实现方案&#xff0c;效果看起来不错&#xff0c;放在下面的表格里&#xff0c;里面有一些是可以直接通过npm在vue中引入使用。 文档格式老的开源组件替代开源组件word&#xff08;docx&#xff09;mammothdocx-preview(npm)powerpoint&#xff08;pptx&a…

word文档创建及在线预览方法

工作中经常有时会遇到需要给用户创建word文档并实现word文档在线预览 的需求,我来讲一讲我所知道的解决方案。 一、word文档模板定义 因word文档中内容是根据不同用户显示不一样,所以需要使用较为灵活的模板了,本文使用的是freemarkerxml来定义模板: 1. maven依赖: <depe…

自学Java没学历可以找到工作吗?

除非技术真的diao 炸 天&#xff0c;否则大概率是找不到的 低学历能自学编程的人大有人在&#xff0c;你在搜索引擎上一查&#xff0c;低学历自学编程改变自身命运的不胜枚举。 但无一不例外的&#xff0c;每个求学者的叙述都透漏着心酸、艰难困苦&#xff0c;披荆斩棘。这些词…

自学Java真能找到好工作吗

最近跟学生沟通的时候总是能听到这样的对话 学生&#xff1a;老师&#xff0c;我觉得没必要报个班学习Java&#xff0c;我有好多师兄现在都在自学的&#xff0c;我觉得他们学的也挺不错的&#xff0c;没有想象的那么难&#xff0c;我也准备自学了&#xff01; 老师&#xff1…

自学编程到底多难?能不能找到工作?阿里技术专家这样回答……

最近逛知乎&#xff0c;看到一个问题&#xff0c;有感而发&#xff0c;原问题如下&#xff1a; 想自学编程恳请大神推荐app网站&#xff01;? 数学不好&#xff0c;再从小学数学开始重修 想学习编程&#xff0c;请问各位大神 1、编程要求哪方面数学知识&#xff1f; 2、有…

自学Java真的可以找到工作吗?

就java得市场而言&#xff0c;不管自学还是科班找到工作都不是很难。当然&#xff0c;自学的话&#xff0c;首先要解决的是自制力的问题&#xff0c;如果没有自制力&#xff0c;也就没有了恒心&#xff0c;学不了东西&#xff0c;自然也找不到工作。 其次&#xff0c;java发展…

java能自学吗_java能自学吗?

java能自学吗&#xff1f; Java是一门面向对象编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表&#xff0c;极好地实现了…

自学编程5个月找到了月薪12K的工作,我的方法值得大家借鉴

昨晚在刷知乎的时候&#xff0c;突然跳出了字节发来的录用邮件&#xff0c;期待了很久offer&#xff0c;最大的感受就是这5个月的编程自学没有白费。 高中对编程很感兴趣&#xff0c;但是一边搞主课一边自学编程导致高考没考好&#xff0c;编程也没学出什么苗头。于是选择了一个…

自学java到可以找工作要多久_自学编程需要多久才能找到工作?

自学编程需要多久才能找到工作&#xff1f; 很多编程初学者都会有这种疑问&#xff0c;自学学到什么程度或者学多久能够找到工作&#xff0c;这种问题没有统一答案&#xff0c;因为每个人的出发时候的基础以及在学习过程中掌握的程度不尽相同&#xff0c;也会导致结果不一样&am…

自学java能找到工作吗?公司会要吗?

java是一门面向对象编程语言&#xff0c;它不仅仅吸收了C语言的各种优点&#xff0c;还摒弃了C语言当中很难理解的多继承、指针等概念&#xff0c;所以&#xff0c;java语言具有着功能简单、简单易用这两个特征。 java学习起来还是非常的简单的&#xff0c;现在有很多的人都会自…

零基础自学编程的程序员如何找到工作

现在很多年轻人喜欢计算机,喜欢软件开发,想从事IT行业但又不是学这个专业的,很多人就想通过自学的途径走上这条道路,但大家肯定也和我当初一样有很多的困惑。本人学校学的是国际贸易专业,毕业之后的不顺利加上自身的兴趣爱好,走上编程的道路,下面就结合亲身经历说说自己…

自学单片机能找到工作吗?能有出路吗?

你现在的情况跟我十年前很像啊&#xff0c; 或许我当时的情况比你现在还糟一些。 我们是电气工程毕业的&#xff0c;第一年学了一些电气相关的知识&#xff0c;后面几年学校给我们安排的全是电梯的课程。 我和很多人的想法一样&#xff0c;电梯还需要开专业的课程&#xff1f…

配置Nginx端口

一、起因 昨天晚上闲来无事,上了下阿里云发现自己的域名和服务器都还没过期,所以就把自己的域名绑定到服务器地址上,做了一个DNS解析。但是我发现,每次需要访问8888端口时仍需要使用 域名:8888 这种方式访问,所以我想用Nginx做一个反向代理,将默认打开的80端口转发到808…

宝塔配置Nginx

如果出404 就是因为点击了 恢复默认配置 解决办法 &#xff1a; 重新 指向 目录位置即可

本地项目配置nginx代理请求接口

nginx安装 安装下载地址&#xff1a;http://nginx.org/en/download.htmlnginx配置 相关命令(针对小白&#xff0c;本人也是)&#xff1a; 1. start nginx // 启动ng服务器2. nginx -s reload // 服务杀死后进行重启&#xff08;每次修改配置需执行此操作&#xff09;3. nginx -…

5分钟教你快速配置nginx实现访问

文章目录 需求操作步骤一、开放端口二、在nginx配置文件中配置端口1&#xff09;server块2&#xff09;区分root和alias3&#xff09;区分server块的root和location块的root4&#xff09;proxy_pass处理跨域 三、根据配置文件往路径下丢包 总结 需求 工作中我们时常需要完成个…

Debian配置Nginx和PHP

要求&#xff1a; 安装nginx软件包&#xff1b; 配置文件名为ispweb.conf&#xff0c;放置在/etc/nginx/conf.d/目录下&#xff1b; 网站根目录为/mut/crypt&#xff08;目录不存在需创建&#xff09;&#xff1b; 启用FastCGI功能&#xff0c;让nginx能够解析php请求&#xff…

云服务器安装并配置nginx

初次购买完云服务器&#xff0c;通过 ssh 连接到远程云服务器时&#xff0c;如果在浏览器直接访问&#xff0c;会访问无效&#xff0c;情况如下&#xff1a; 所以我们需要 给云服务器安装 web 服务器。 安装nginx 用 SFTP 工具&#xff08; Final Shell / Filezilla / WinSCP …

win10安装配置nginx

准备工作 去nginx.org下载nginx&#xff0c;我下载的是 nginx/Windows-1.10.3版本 进入页面->点击download->点击 nginx/Windows-1.10.3 安装 解压&#xff0c;然后启动nginx.exe 当进程中有nginx&#xff0c;就算是启动成功了 访问测试 浏览器访问 127.0.0.1 或者…

安装配置Nginx全分布

目录 一安装准备 1.1安装c环境 1.2下载安装包 二安装配置 2.1上传安装包到相应位置 2.2解压 2.3进入解压的Nginx目录&#xff08;nginx-1.12.2&#xff09; 2.4启动/关闭Nginx&#xff08;要用执行root&#xff09; 2.5配置负载均衡 三验证 一安装准备 1.1安装c环境 s…