当前位置: 首页 > news >正文

前端实现docx格式word文件预览,可以兼容原生、vue2、以及uni-app 项目,详细步骤。

上一篇记录了PDF文件预览功能。这一篇记录下docx文件预览。
核心文件
doc.html

<script src="./build/polyfill.min.js"></script>

<script src="./build/jszip.min.js"></script>

<script src="./build/docx-preview.js"></script>

上一篇记录了PDF文件预览功能。这一篇记录下docx文件预览。 核心文件为`doc.html`,在这个文件中,引入了几个关键的JavaScript文件来实现docx文件的预览功能。首先是`polyfill.min.js`,它的作用是为那些不支持某些现代JavaScript特性的浏览器提供垫片,确保在各种浏览器环境下都能正常运行相关代码,让我们的docx预览功能具备更广泛的兼容性。接着引入的`jszip.min.js`则是用于处理压缩文件的库,因为docx文件本质上是一种基于ZIP格式的压缩文件,通过这个库,我们能够对docx文件内部的结构进行解压缩和解析操作,为后续的内容提取和展示做准备。而`docx-preview.js`无疑是最为核心的部分,它封装了一系列复杂的逻辑,专门用于将解压缩后的docx文件内容转化为可在网页上直观展示的格式。 在实际应用场景中,比如企业内部的文档管理系统,员工需要在网页端快速预览各种docx格式的报告、合同等文件。通过这个基于`doc.html`构建的预览功能,用户只需在页面上点击相应的docx文件链接,后台便会将文件路径传递给前端。前端利用上述引入的JavaScript库,迅速对文件进行处理。`jszip.min.js`首先对docx文件进行解压缩,将其中包含的文本、图片、格式等信息释放出来。然后,`docx-preview.js`发挥作用,它根据文件内部的XML结构,将文本内容按照正确的格式排版,同时处理图片的加载和定位,最终在浏览器页面上呈现出与原始docx文件几乎一致的视觉效果。这不仅方便了用户快速查看文件内容,无需再单独下载和打开本地的办公软件,还提高了工作效率,让文档管理和协作变得更加流畅和便捷。
 

<!DOCTYPE html>

<html dir="ltr" mozdisallowselectionprint>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">

		<title>DOCX viewer</title>

		<!-- This snippet is used in production (included from viewer.html) -->
		<link rel="resource" type="application/l10n" href="locale/locale.properties">
		
		<script src="./build/polyfill.min.js"></script>
		<script src="./build/jszip.min.js"></script>
		<script src="./build/docx-preview.js"></script>
		<style>
			.doc-wrapper{
				padding:0px !important;
				overflow: auto;
				width: 100%;
			}
		
			/* 移动端文档样式 */
			.docx-mobile {
			  max-width: 100vw;          /* 设置最大宽度为视口宽度 */
			  padding: 12px 0 !important;             /* 添加内边距 */
			  font-size: 14px;           /* 缩小字体适应小屏幕 */
			  line-height: 1.5em;        /* 提高行间距以便阅读 */
			  box-sizing: border-box;    /* 确保宽度和边距适配 */
			  overflow-wrap: break-word; /* 自动换行以避免溢出 */
			}
			.docx-mobile img {
				max-width: 100%  !important; /* 图片宽度自动适应屏幕 */
				height: auto;              /* 高度自动调整,保持比例 */
				display: block;
				margin: 10px auto;            /* 给图片上下留空 */
			}
			
			.docx-mobile p, .docx-mobile div {
				padding:0px !important;
				max-width: 98%  !important; /* 图片宽度自动适应屏幕 */
				margin: 0 auto 10px;          /* 段落底部留空,避免内容拥挤 */
			}
			
			.docx-mobile h1, .docx-mobile h2, .docx-mobile h3 {
			  font-size: 1.2em;          /* 缩小标题字体 */
			  font-weight: bold;
			  margin: 0 0 8px;
			}
			
			/* 为底部注释和脚注提供较小的字体 */
			.docx-mobile .footnote, .docx-mobile .endnote {
			  font-size: 12px;
			  color: gray;
			}

			
		</style>

	</head>
	<body>
		<div class="doc-wrapper">
			<div id="document-container" ref="filebox"></div>
		</div>

		<script>
			// 获取 URL 参数中的 'file' 参数值
			const urlParams = new URLSearchParams(window.location.search);
			const filePath = urlParams.get('file');
			
			if (filePath) {

				// 如果文件路径存在,尝试加载文件
				var xhr = new XMLHttpRequest();

				// 设置请求成功后的回调
				xhr.onload = function() {
					if (xhr.status === 200) {
						// 获取文件的二进制数据
						var arrayBuffer = xhr.response;
						
						console.log('arrayBuffer', arrayBuffer);
						
						 const container = document.querySelector("#document-container");
						 
						 const docxOptions = Object.assign(docx.defaultOptions, {
							 debug: false,
							 experimental: true,
							 inWrapper:false
						 });
						 
						 const options = {
						   ignoreHeight: true,         // 忽略高度,自动适应容器大小
						   ignoreWidth: true,          // 忽略宽度,防止内容超出屏幕
						   ignoreFonts: true,          // 忽略字体,使用默认网页字体以优化显示效果
						   breakPages: false,          // 不分页,在移动端上不强制分页
						   debug: false,               // 关闭调试模式
						   experimental: false,        // 不使用实验性功能
						  // className: "docx-mobile",   // 设置为特定类名以便移动端样式定制
						   className: "docx-pc",   // 设置为特定类名以便移动端样式定制
						   inWrapper: false,            // 包裹在一个容器中,便于设置样式
						   trimXmlDeclaration: true,    // 去掉 XML 声明
						   ignoreLastRenderedPageBreak: true,  // 忽略最后一个分页符
						   renderHeaders: false,       // 不渲染页眉,节省空间
						   renderFooters: false,       // 不渲染页脚,节省空间
						   renderFootnotes: true,      // 渲染脚注,根据内容决定是否保留
						   renderEndnotes: true,       // 渲染尾注,根据内容决定是否保留
						   useBase64URL: true,         // 使用 Base64 URL 以便图片在移动端加载
						   renderChanges: false,       // 不渲染修订内容,减少页面元素
						   renderComments: false       // 不渲染评论,减少页面元素
						 };
						 
						 
						 console.log('docxOptions is', JSON.stringify(docxOptions))


						// const docxPreviewInstance = new DocxPreview(arrayBuffer);
						// docxPreviewInstance.render(document.getElementById('docx-preview-box'));
					
						setTimeout( async() => {
							 let res = await docx.renderAsync(arrayBuffer, container, null, options)
						}, 200)

					} else {
						alert('无法加载文件,状态码: ' + xhr.status);
					}
				};

				// 设置请求失败时的回调
				xhr.onerror = function() {
					alert('无法加载文件');
				};

				// 发起 GET 请求
				xhr.open('GET', filePath);
				xhr.responseType = 'blob'; // 指定返回的响应类型为 ArrayBuffer
				xhr.send();

			} else {
				alert('没有提供文件路径');
			}
		</script>
			
	</body>
</html>

特别提醒下只能够预览docx文件。
下面是资源地址,欢迎下载。https://download.csdn.net/download/weixin_37742709/90580946?spm=1001.2014.3001.5503

相关文章:

  • 3月AI论文精选十篇
  • 遍历集合list工具
  • C++学习day8
  • AI-人工智能-基于LC-MS/MS分子网络深度分析的天然产物成分解析的新策略
  • LeetCode541反转字符串②
  • 最简CNN based RNN源码
  • Vue.js 中 v-model 的使用及其原理
  • 注意力机制 Attention
  • 第九章:前沿 RAG 技术探索
  • 数字内容体验驱动用户参与增效
  • 图像模糊(蓝桥杯真题)
  • 习题与正则表达式
  • 以下是针对该 Ansible 任务的格式检查和优化建议
  • 项目中如何防止超卖
  • Redis高频面试题及深度解析(20大核心问题+场景化答案)
  • Python 序列构成的数组(list.sort方法和内置函数sorted)
  • PostgreSQL数据库重放攻击测试
  • 【大模型理论篇】SWIFT: 可扩展轻量级的大模型微调基础设施
  • [ctfshow web入门] web26
  • 通过发票四要素信息核验增值税发票真伪-iOS发票查验接口
  • 正荣地产:董事会主席、行政总裁辞任,拟投入更多精力推动境内债重组等工作
  • 谜语的强制力:弗洛伊德与俄狄浦斯
  • 复旦设立新文科发展基金,校友曹国伟、王长田联合捐赠1亿助力人文学科与社会科学创新
  • 加力、攻坚、借力、问效,上海为优化营商环境推出增量举措
  • 西安碑林博物馆票价将调至85元,工作人员:10元属于改扩建期间惠民票
  • A股三大股指集体高开大涨超1%,券商、房地产涨幅居前