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


    1.安装插件

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

    2.完整代码

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

  • 相关阅读:
    《Flink学习笔记》——第十二章 Flink CEP
    linux系统下切换源
    力扣501 二叉搜索树中的众数
    想要精通算法和SQL的成长之路 - 超过经理收入的员工(SQL)
    刷题知识回顾《二》LRU缓存详解
    ArcGIS 10.7软件安装包下载及安装教程!
    PyCharm+PyQT5之二第一个QT程序
    别再听中介忽悠了,用python找到最合适你的房子
    计算机操作系统-第六天
    基于ssm的奥博羽毛球俱乐部管理系统-计算机毕业设计
  • 原文地址:https://blog.csdn.net/2202_75509848/article/details/136257299