vue项目中的word、pdf文件预览

本文介绍如何在Vue.js项目中实现Word和PDF文件的预览功能,包括安装必要的组件,设置HTML和TypeScript代码,以及展示最终的预览效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、安装组件

npm install --save docx-preview vue-pdf

2、html部分

<div class="police-records">
   <template v-for="(item, idx) in docUrl">
        <div :key="idx" style="padding: 24px; border: 1px solid #ccc">
            <div>
                <el-button>下载</el-button>
                <el-button>重命名</el-button>
                <el-button>删除</el-button>
            </div>
            <!-- Start word文件预览 -->
            <div
                v-if="item.indexOf('.docx') > -1"
                :id="'docPreview' + idx"
                style="width: 100%; height: 600px; overflow-y: auto"
            ></div>
            <!-- End word文件预览 -->

            <!-- Start pdf文件预览 -->
            <div
                v-if="item.indexOf('.pdf') > -1"
                style="width: 100%; height: 600px; overflow-y: auto"
            >
                <pdf
                    ref="pdf"
                    v-for="items in pdfList[idx]"
                    :key="items"
                    :src="item"
                    :page="items"
                ></pdf>
            </div>
            <!-- End pdf文件预览 -->

            <!-- Start 图片预览 -->
            <div
                v-if="
                    item.indexOf('.png') > -1 || item.indexOf('.jpg') > -1
                "
                style="
                    width: 100%;
                    height: 400px;
                    text-align: center;
                    overflow-y: auto;
                "
            >
                <el-image :src="item" fit="contain"></el-image>
            </div>
            <!-- End 图片预览 -->
        </div>
    </template>
</div>

3、ts部分

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import { renderAsync } from 'docx-preview';
import pdf from 'vue-pdf';
@Component({
    name: 'records',
    components: {
        pdf
    }
})
export default class extends Vue {
    private docUrl = [
        '/img/favicon.png',
        '/files/1.docx',
        '/files/2.pdf',
        '/files/3.docx',
        '/files/4.pdf'
    ]; // 附件地址集合
    private pdfList: any = []; // pdf文件数据

    /**
     * @description: 初始化
     */
    private beforeMount() {
        this.previewFiles();
    }

    /**
     * @description: 循环设置文件预览
     */
    private previewFiles() {
        for (let i = 0; i < this.docUrl.length; i++) {
            if (this.docUrl[i].indexOf('.docx') > -1) {
                this.docPreview(this.docUrl[i], 'docPreview' + i);
            }
            if (this.docUrl[i].indexOf('.pdf') > -1) {
                this.pdfPreview(this.docUrl[i], i);
            }
        }
    }

    /**
     * @description: word文件渲染
     * @param {string} url word文件url
     * @param {string} name dom的id
     */
    private docPreview(url: string, name: string) {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'blob';
        xhr.onload = function () {
            if (xhr.status == 200) {
                const arrayBuffer = xhr.response;
                renderAsync(
                    arrayBuffer,
                    (document as any).getElementById(name),
                    undefined,
                    {
                        className: 'docx', // 默认和文档样式类的类名/前缀
                        inWrapper: true, // 启用围绕文档内容渲染包装器
                        ignoreWidth: false, // 禁止页面渲染宽度
                        ignoreHeight: false, // 禁止页面渲染高度
                        ignoreFonts: false, // 禁止字体渲染
                        breakPages: true, // 在分页符上启用分页
                        ignoreLastRenderedPageBreak: true, // 禁用lastRenderedPageBreak元素的分页
                        experimental: false, // 启用实验性功能(制表符停止计算)
                        trimXmlDeclaration: true, // 如果为真,xml声明将在解析之前从xml文档中删除
                        debug: false // 启用额外的日志记录
                    }
                );
            }
        };
        xhr.send();
    }

    /**
     * @description: pdf文件渲染
     * @param {string} url pdf文件url
     * @param {number} idx pdf文件索引
     */
    private pdfPreview(url: string, idx: number) {
        const pdfUrl = pdf.createLoadingTask(url);
        // 获取页码
        pdfUrl.promise.then((res: any) => {
            this.$set(this.pdfList, idx, res.numPages);
        });
    }
}
</script>

4、最终效果

在这里插入图片描述

### 实现 Vue.jsPDF Word 文件的在线预览 #### 使用第三方库实现 PDF 预览 对于 PDF 文件,在线预览可以通过 `pdfjs-dist` 库来完成。这个库提供了渲染 PDF 文档所需的功能。 安装依赖: ```bash npm install pdfjs-dist ``` 创建一个名为 PdfViewer.vue 的组件用于展示 PDF 文件的内容: ```vue <template> <div class="pdf-viewer"> <canvas ref="pdfCanvas"></canvas> </div> </template> <script> import * as pdfjsLib from 'pdfjs-dist'; import pdfWorker from 'pdfjs-dist/build/pdf.worker.entry'; export default { props: ['src'], data() { return { loadingTask: null, numPages: undefined, scale: 1.5, // 放大比例 }; }, mounted() { pdfjsLib.GlobalWorkerOptions.workerSrc = pdfWorker; this.loadingTask = pdfjsLib.getDocument(this.src); this.loadingTask.promise.then(pdf => { this.numPages = pdf.numPages; for (let pageNumber = 1; pageNumber <= pdf.numPages; pageNumber++) { this.renderPage(pdf, pageNumber); } }); }, methods: { renderPage(pdf, number) { const canvas = this.$refs.pdfCanvas; const ctx = canvas.getContext('2d'); pdf.getPage(number).then(page => { const viewport = page.getViewport({ scale: this.scale }); canvas.height = viewport.height; canvas.width = viewport.width; const renderContext = { canvasContext: ctx, viewport }; page.render(renderContext); }); } } }; </script> ``` 此代码片段展示了如何加载并显示单页或多页 PDF 文件[^1]。 #### 对于 Office 文档(Word) Office Online 提供了一种嵌入方式,可以利用 Microsoft 提供的服务来进行文档查看。另一种方法是通过开源工具如 `mammoth` 将 .docx 转换成 HTML 进行浏览。 为了简化操作,这里推荐使用微软官方提供的 Web Viewer API 来处理 Word 文件的在线阅读器集成工作。这通常涉及到获取 OneDrive 或 SharePoint 上托管文件 URL 并将其传递给 viewer 组件。 如果倾向于本地转换,则需先安装 mammoth 插件: ```bash npm install mammoth ``` 接着可以在 vue 组件里调用它读取 docx 文件转成 html 字符串再插入到页面中去呈现出来。 需要注意的是这两种方案各有优缺点,前者更易于维护但是可能受限于网络连接;后者虽然独立性强却增加了服务器端负担以及复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值