vue3中vue-pdf-embed实现放大、缩小、上一页、下一页、滚动翻页功能(pdf文件预览)

1.安装插件

javascript 复制代码
npm install vue3-pdfjs
npm install vue-pdf-embed

2.完整代码

javascript 复制代码
<template>
    <div class="pdf-wrap scrollbar-style">
        <vue-pdf-embed :source="state.source" v-if="state.pdfShow" :style="scaleFun" class="vue-pdf-embed" ref="vuePdfRef" :page="state.pageNum" @wheel.prevent="handleScroll"/>
    </div>
    <div class="page-tool">
        <div class="page-tool-item" @click="lastPage">上一页</div>
        <div class="page-tool-item">{{state.pageNum}}/{{state.numPages}}</div>
        <div class="page-tool-item" @click="nextPage">下一页</div>
        <div class="page-tool-item" @click="pageZoomOut">放大</div>
        <div class="page-tool-item" @click="pageZoomIn">缩小</div>
        <div class="page-tool-item" @click="PDFPrint">下载</div>
    </div>
</template>
<script setup>
import { reactive, onMounted, computed } from "vue";
import VuePdfEmbed from "vue-pdf-embed";
import { createLoadingTask } from "vue3-pdfjs/esm";
import { debounce } from "@/utils/handleDebounce"; // 防抖方法

const props = defineProps({
    pdfUrl: {
        type: String,
        required: true
    }
})
const scaleFun = computed(() => `transform:scale(${state.scale});margin-top:2%`)
const state = reactive({
    source: props.pdfUrl, // 预览pdf文件地址
    pageNum: 1, // 当前页面
    scale: 1, // 缩放比例
    numPages: 0, // 总页数
    pdfShow: true, // pdf是否显示
});
const vuePdfRef =ref(null)
// 上一页
function lastPage() {
    if (state.pageNum > 1) {
        state.pageNum -= 1;
    }
}
// 下一页
function nextPage() {
    if (state.pageNum < state.numPages) {
        state.pageNum += 1;
    }
}
// 放大
function pageZoomOut() {
    if (state.scale < 2) {
        state.scale += 0.1;
    }
}
// 缩小
function pageZoomIn() {
    if (state.scale > 1) {
        state.scale -= 0.1;
    }
}
// 打印/下载
function PDFPrint() {
    vuePdfRef.value.print(300,'合同',true); // 打印:参数1为分辨率 参数2为文件名称 参数3为是否打印所有页面
    // vuePdfRef.value.download('合同'); // 下载:参数为文件名称。我这里会报错可能是有方法冲突了
}
// 滚轮滚动
const handleScroll = debounce((event) => {
    event.preventDefault(); // 阻止默认的滚动行为,这里不知为什么不起效,所以直接使用@wheel.prevent
    // 判断是否是ctrl+滚轮
    if (event.ctrlKey) { // 是ctrl+滚轮就放大缩小页面
        if (event.deltaY > 0) {
            pageZoomOut();
        } else if (event.deltaY < 0) {
            pageZoomIn();
        }
    } else { // 不是就滑动滚轮来翻页
        event.wheelDeltaY < 0 ? nextPage() : lastPage();
    }
}, 50)
onMounted(() => {
    const loadingTask = createLoadingTask(state.source);
   loadingTask.promise.then((pdf) => {
       state.numPages = pdf.numPages;
   });
});
</script>
<style lang="scss" scoped>
.pdf-preview {
    position: relative;
    height: 100vh;
    padding: 20px 0;
    box-sizing: border-box;
    background: rgb(66, 66, 66);
}
.vue-pdf-embed {
    text-align: center;
    width: 515px;
    border: 1px solid #e5e5e5;
    margin: 0 auto;
    box-sizing: border-box;
}
.pdf-wrap{
    overflow-y:auto ;
}
 
.page-tool {
    position: absolute;
    bottom: 35px;
    padding-left: 15px;
    padding-right: 15px;
    display: flex;
    align-items: center;
    background: rgba(3, 67, 109, 0.075);
    color: rgba(2, 1, 41, 0.507);
    border-radius: 19px;
    z-index: 100;
    cursor: pointer;
    margin-left: 52%;
    transform: translateX(-50%);
}
.page-tool-item {
    padding: 8px 15px;
    padding-left: 10px;
    cursor: pointer;
}
</style>

3.代码说明

(1)属性说明

  • source:文档来源(支持 string、object、Uint8Array 类型数据),一般是文档流(我这是后端返回的文档流)
  • page:要显示的页数(如果未指定,则显示所有页)
  • textLayer:是否应启用文本图层(用于文本选中、复制)

(2)css样式不重要,只要根据自己需求来布局就行了

(3)翻页、缩放这些功能都是基本js方法,重点在于source和page这两个属性

(4)我这里:source="state.source"文件来源是从父组件传递过来的文档流,在父组件中从后端获取的

4.总结

简单来说,只要安装好了这两个插件,做好source和page这两个属性就可以预览pdf文档了,其他功能都是基本js方法。vue3-pdfjs这个插件是用于获取pdf文件总页数,vue-pdf-embed插件才是用于预览pdf文件的

相关推荐
陈随易1 小时前
Postman 被曝自动往 Claude Code 和 Codex 装插件
前端·后端·程序员
Dream-Y.ocean3 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Csvn4 小时前
性能监控
前端
Highcharts.js4 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
Csvn5 小时前
构建工具
前端
FRing035 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Java小卷6 小时前
JuanForm vs FormCreate!Vue3 表单引擎联动配置 PK!
vue.js·低代码
kyriewen7 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒8 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫8 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库