当前位置:   article > 正文

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

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

1.安装插件

  1. npm install vue3-pdfjs
  2. npm install vue-pdf-embed

2.完整代码

  1. <template>
  2. <div class="pdf-wrap scrollbar-style">
  3. <vue-pdf-embed :source="state.source" v-if="state.pdfShow" :style="scaleFun" class="vue-pdf-embed" ref="vuePdfRef" :page="state.pageNum" @wheel.prevent="handleScroll"/>
  4. </div>
  5. <div class="page-tool">
  6. <div class="page-tool-item" @click="lastPage">上一页</div>
  7. <div class="page-tool-item">{{state.pageNum}}/{{state.numPages}}</div>
  8. <div class="page-tool-item" @click="nextPage">下一页</div>
  9. <div class="page-tool-item" @click="pageZoomOut">放大</div>
  10. <div class="page-tool-item" @click="pageZoomIn">缩小</div>
  11. <div class="page-tool-item" @click="PDFPrint">下载</div>
  12. </div>
  13. </template>
  14. <script setup>
  15. import { reactive, onMounted, computed } from "vue";
  16. import VuePdfEmbed from "vue-pdf-embed";
  17. import { createLoadingTask } from "vue3-pdfjs/esm";
  18. import { debounce } from "@/utils/handleDebounce"; // 防抖方法
  19. const props = defineProps({
  20. pdfUrl: {
  21. type: String,
  22. required: true
  23. }
  24. })
  25. const scaleFun = computed(() => `transform:scale(${state.scale});margin-top:2%`)
  26. const state = reactive({
  27. source: props.pdfUrl, // 预览pdf文件地址
  28. pageNum: 1, // 当前页面
  29. scale: 1, // 缩放比例
  30. numPages: 0, // 总页数
  31. pdfShow: true, // pdf是否显示
  32. });
  33. const vuePdfRef =ref(null)
  34. // 上一页
  35. function lastPage() {
  36. if (state.pageNum > 1) {
  37. state.pageNum -= 1;
  38. }
  39. }
  40. // 下一页
  41. function nextPage() {
  42. if (state.pageNum < state.numPages) {
  43. state.pageNum += 1;
  44. }
  45. }
  46. // 放大
  47. function pageZoomOut() {
  48. if (state.scale < 2) {
  49. state.scale += 0.1;
  50. }
  51. }
  52. // 缩小
  53. function pageZoomIn() {
  54. if (state.scale > 1) {
  55. state.scale -= 0.1;
  56. }
  57. }
  58. // 打印/下载
  59. function PDFPrint() {
  60. vuePdfRef.value.print(300,'合同',true); // 打印:参数1为分辨率 参数2为文件名称 参数3为是否打印所有页面
  61. // vuePdfRef.value.download('合同'); // 下载:参数为文件名称。我这里会报错可能是有方法冲突了
  62. }
  63. // 滚轮滚动
  64. const handleScroll = debounce((event) => {
  65. event.preventDefault(); // 阻止默认的滚动行为,这里不知为什么不起效,所以直接使用@wheel.prevent
  66. // 判断是否是ctrl+滚轮
  67. if (event.ctrlKey) { // 是ctrl+滚轮就放大缩小页面
  68. if (event.deltaY > 0) {
  69. pageZoomOut();
  70. } else if (event.deltaY < 0) {
  71. pageZoomIn();
  72. }
  73. } else { // 不是就滑动滚轮来翻页
  74. event.wheelDeltaY < 0 ? nextPage() : lastPage();
  75. }
  76. }, 50)
  77. onMounted(() => {
  78. const loadingTask = createLoadingTask(state.source);
  79. loadingTask.promise.then((pdf) => {
  80. state.numPages = pdf.numPages;
  81. });
  82. });
  83. </script>
  84. <style lang="scss" scoped>
  85. .pdf-preview {
  86. position: relative;
  87. height: 100vh;
  88. padding: 20px 0;
  89. box-sizing: border-box;
  90. background: rgb(66, 66, 66);
  91. }
  92. .vue-pdf-embed {
  93. text-align: center;
  94. width: 515px;
  95. border: 1px solid #e5e5e5;
  96. margin: 0 auto;
  97. box-sizing: border-box;
  98. }
  99. .pdf-wrap{
  100. overflow-y:auto ;
  101. }
  102. .page-tool {
  103. position: absolute;
  104. bottom: 35px;
  105. padding-left: 15px;
  106. padding-right: 15px;
  107. display: flex;
  108. align-items: center;
  109. background: rgba(3, 67, 109, 0.075);
  110. color: rgba(2, 1, 41, 0.507);
  111. border-radius: 19px;
  112. z-index: 100;
  113. cursor: pointer;
  114. margin-left: 52%;
  115. transform: translateX(-50%);
  116. }
  117. .page-tool-item {
  118. padding: 8px 15px;
  119. padding-left: 10px;
  120. cursor: pointer;
  121. }
  122. </style>

3.代码说明

(1)属性说明

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

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

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

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

4.总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/153592
推荐阅读
相关标签
  

闽ICP备14008679号