当前位置:首页 > 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 渲染功能,支持分页、缩放等特性。安装核心库:

vue实现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 查看器添加导航控制:

vue实现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文件,建议实现分页加载而不是一次性渲染所有页面。可以使用懒加载技术,只在用户滚动到可视区域时才渲染对应页面。

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

标签: vuepdf
分享给朋友:

相关文章

vue实现年历

vue实现年历

Vue 实现年历的方法 使用 Vue 实现年历可以通过组件化开发方式,结合日期计算和动态渲染完成。以下是两种常见的实现方式: 基于原生 Vue 的日历组件 创建 Calendar.vue 组件文件…

用vue实现搜索查询

用vue实现搜索查询

实现搜索查询的基本思路 在Vue中实现搜索查询功能通常涉及以下几个核心部分:数据绑定、事件监听、过滤逻辑和UI反馈。以下是一个完整的实现方案。 数据绑定与输入框 创建一个Vue组件,包含一个输入框用…

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v…

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…

vue实现博客

vue实现博客

Vue 实现博客的基本步骤 使用 Vue.js 实现一个博客系统可以分为前端和后端两部分。以下是基于 Vue 的前端实现方案,后端可以选择 Node.js、Django 或其他框架。 项目初始化 使…