前端使用 preview 插件预览docx文件

目录

    • 前言
      • [一 引入插件](#一 引入插件)
      • [二 JS 处理](#二 JS 处理)

前言

前端使用 preview 插件预览docx文件

一 引入插件

建议下载至本地,静态引入,核心的文件已打包(前端使用 preview 插件预览docx文件),在文章目录处下载至本地,复制在项目静态资源处,在使用的地方直接本地静态资源引入;

javascript 复制代码
<script src="https://unpkg.com/jszip/dist/jszip.min.js"></script>
<script src="https://unpkg.com/docx-preview/dist/docx-preview.min.js"></script>
<!-- 建议下载至本地,静态引入 -->
<script  src='/js/PreViewDoc/jszip.min.js'></script>
<script  src='/js/PreViewDoc/docx-preview.min.js'></script>

二 JS 处理

javascript 复制代码
var api = {
    init: function () {
        var that = this;
        laydate.render({
            elem: $('[name=StatisDate]').get(0)
            , type: 'month'
            , value: getLastMonth()
            , done: function (value, date, endDate) {
                if (date.year < new Date().getFullYear()) {
                    console.log(new Date().getFullYear());
                    RendergetZone(date.year);
                } else {
                    GetCurrZone();
                }
            }
        });
        $('#ReportNam').text(reportNam);
        form.render();
        that.event();
    },
    event: function () {
        var that = this;
        form.on('submit(report_query)', function (input) {
            // 禁用 "生成" 按钮
            const generateButton = $('[lay-submit]'); // 通过lay-submit获取按钮
            generateButton.addClass('layui-btn-disabled').attr('disabled', true); // 禁用按钮
            generateButton.html('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop">' +
                '</i> 生成中'); // 修改按钮内容为 loading 动画
            const container = document.getElementById('doc-content'); // 渲染文档的容器
            //清空提示信息
            container.innerHTML = '';
            $.ajax({
                url: interface2021.ReportManagement.QueryWorkSimpleReport,
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                data: JSON.stringify({
                    statisDate: input.field.StatisDate,
                    zoneCode: input.field.ZoneCd,
                    issuingUnit: input.field.IssuingUnit,
                    stageNumber: input.field.StageNumber,
                }),
                // xhrFields: {
                //     responseType: 'blob', // 接收文件流
                // },
                success: function (response) {
                    if (response.code === -1) {
                        container.innerHTML = "<p style='color: red;'>文档请求失败</p>";
                        relieveDisable(false,generateButton, '生成', response.message);
                    } else {
                        var fileProxyUrl = response.data;
                        fetch(fileProxyUrl)
                            .then((response) => response.blob())
                            .then((blob) => {
                                docx.renderAsync(blob, container)
                                    .then(() => {
                                        console.log('文档渲染成功');
                                        //恢复按钮
                                        relieveDisable(true,generateButton, '生成', response.message);
                                        // 获取下载按钮并设置属性
                                        const downloadButton = document.getElementById('download-btn');
                                        downloadButton.style.display = 'inline-block'; // 显示下载按钮
                                        downloadFile(downloadButton, response.data);
                                    })
                                    .catch((err) => {
                                        console.log('文档渲染失败', err);
                                        container.innerHTML = "<p style='color: red;'>文档请求失败</p>";
                                        relieveDisable(false,generateButton, '生成', err.message);
                                    });
                            })
                            .catch((error) => {
                                console.log('文件加载失败:', error);
                                relieveDisable(false,generateButton, '生成', error.message);
                            });
                    }

                },
                error: function (xhr, type, errorThrown) {
                    console.log('文档请求失败: ', errorThrown);
                    $('#doc-content').html('<p style="color: red;">文档请求失败</p>');
                    relieveDisable(false,generateButton, '生成', '生成失败!');
                },
            });

        });
    },
}

function downloadFile(downloadButton, downloadUrl) {
    // 启用 "下载" 按钮
    downloadButton.onclick = function () {
        console.log("开始下载...");
        const link = document.createElement('a');
        link.href = downloadUrl;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        console.log("下载完成");
    };
}
相关推荐
paopaokaka_luck19 分钟前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
患得患失9491 小时前
【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
前端·vscode·json
飛_1 小时前
解决VSCode无法加载Json架构问题
java·服务器·前端
YGY Webgis糕手之路3 小时前
OpenLayers 综合案例-轨迹回放
前端·经验分享·笔记·vue·web
90后的晨仔4 小时前
🚨XSS 攻击全解:什么是跨站脚本攻击?前端如何防御?
前端·vue.js
Ares-Wang4 小时前
JavaScript》》JS》 Var、Let、Const 大总结
开发语言·前端·javascript
90后的晨仔4 小时前
Vue 模板语法完全指南:从插值表达式到动态指令,彻底搞懂 Vue 模板语言
前端·vue.js
德育处主任4 小时前
p5.js 正方形square的基础用法
前端·数据可视化·canvas
烛阴4 小时前
Mix - Bilinear Interpolation
前端·webgl
90后的晨仔4 小时前
Vue 3 应用实例详解:从 createApp 到 mount,你真正掌握了吗?
前端·vue.js