当前位置:首页 > VUE

vue实现pdf浏览

2026-02-18 05:34:31VUE

使用 vue-pdf 库实现 PDF 预览

vue-pdf 是一个轻量级的 Vue 组件,专门用于在 Vue 项目中渲染 PDF 文件。安装方式如下:

npm install vue-pdf

基本用法示例:

<template>
  <pdf :src="pdfUrl"></pdf>
</template>

<script>
import pdf from 'vue-pdf'

export default {
  components: { pdf },
  data() {
    return {
      pdfUrl: 'https://example.com/sample.pdf'
    }
  }
}
</script>

使用 PDF.js 实现高级功能

Mozilla 的 PDF.js 提供更完整的 PDF 渲染功能,支持分页、缩放等特性。安装核心库:

npm install pdfjs-dist

完整实现示例:

<template>
  <div>
    <canvas v-for="page in numPages" :key="page" :ref="'canvas'+page"></canvas>
  </div>
</template>

<script>
import * as pdfjsLib from 'pdfjs-dist'

export default {
  data() {
    return {
      pdfDoc: null,
      numPages: 0
    }
  },
  mounted() {
    this.loadPDF('https://example.com/sample.pdf')
  },
  methods: {
    async loadPDF(url) {
      const loadingTask = pdfjsLib.getDocument(url)
      this.pdfDoc = await loadingTask.promise
      this.numPages = this.pdfDoc.numPages

      for(let i = 1; i <= this.numPages; i++) {
        const page = await this.pdfDoc.getPage(i)
        const viewport = page.getViewport({ scale: 1.0 })
        const canvas = this.$refs['canvas'+i][0]
        const context = canvas.getContext('2d')

        canvas.height = viewport.height
        canvas.width = viewport.width

        const renderContext = {
          canvasContext: context,
          viewport: viewport
        }
        page.render(renderContext)
      }
    }
  }
}
</script>

添加 PDF 控制功能

为 PDF 查看器添加导航控制:

<template>
  <div>
    <button @click="prevPage" :disabled="currentPage <= 1">上一页</button>
    <span>第 {{ currentPage }} 页 / 共 {{ numPages }} 页</span>
    <button @click="nextPage" :disabled="currentPage >= numPages">下一页</button>
    <pdf :src="pdfUrl" :page="currentPage"></pdf>
  </div>
</template>

<script>
import pdf from 'vue-pdf'

export default {
  components: { pdf },
  data() {
    return {
      pdfUrl: 'https://example.com/sample.pdf',
      currentPage: 1,
      numPages: 0
    }
  },
  mounted() {
    const loadingTask = pdf.createLoadingTask(this.pdfUrl)
    loadingTask.then(pdf => {
      this.numPages = pdf.numPages
    })
  },
  methods: {
    prevPage() {
      if(this.currentPage > 1) this.currentPage--
    },
    nextPage() {
      if(this.currentPage < this.numPages) this.currentPage++
    }
  }
}
</script>

处理本地 PDF 文件

实现本地文件上传预览:

<template>
  <div>
    <input type="file" @change="onFileChange" accept=".pdf">
    <pdf :src="pdfFile" v-if="pdfFile"></pdf>
  </div>
</template>

<script>
import pdf from 'vue-pdf'

export default {
  components: { pdf },
  data() {
    return {
      pdfFile: null
    }
  },
  methods: {
    onFileChange(e) {
      const file = e.target.files[0]
      if(file.type !== 'application/pdf') {
        alert('请选择PDF文件')
        return
      }
      this.pdfFile = URL.createObjectURL(file)
    }
  }
}
</script>

优化性能的注意事项

对于大型PDF文件,建议实现分页加载而不是一次性渲染所有页面。可以使用懒加载技术,只在用户滚动到可视区域时才渲染对应页面。

vue实现pdf浏览

添加错误处理逻辑,处理可能出现的PDF加载失败情况。PDF.js支持设置密码保护文档的解密功能,需要处理密码输入场景。

标签: vuepdf
分享给朋友:

相关文章

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="con…

vue 简单实现

vue 简单实现

以下是 Vue 的简单实现示例,涵盖基础模板、数据绑定、方法及生命周期: 基础模板与数据绑定 <div id="app"> <p>{{ message }}</p&…

vue实现链接

vue实现链接

Vue 实现链接的方法 在 Vue 中实现链接可以通过多种方式,包括使用 <router-link>、<a> 标签或编程式导航。以下是几种常见的方法: 使用 <rout…

vue实现反转

vue实现反转

实现数组反转 在Vue中反转数组可以通过多种方式实现,以下是几种常见方法: 使用JavaScript原生reverse方法 // 在methods中定义方法 methods: { revers…

vue实现popover

vue实现popover

Vue 实现 Popover 的方法 使用第三方库(如 Element UI、Ant Design Vue) 许多成熟的 UI 库已经内置了 Popover 组件,可以直接调用。 Element U…