当前位置:   article > 正文

【vue-pdf】PDF文件预览插件_vue fdf查看插件

vue fdf查看插件

1 插件安装

npm install vue-pdf

vue-pdf GitHubhttps://github.com/FranckFreiburger/vue-pdf#readme

参考文档:https://www.cnblogs.com/steamed-twisted-roll/p/9648255.html

catch报错:vue-pdf组件报错vue-pdf Cannot read properties of undefined (reading ‘catch‘)_你看我像是会的样子吗?的博客-CSDN博客

2 代码示例

Example.01 超简单分页预览

  1. <template>
  2. <div class="container">
  3. <div class="header">
  4. <van-nav-bar
  5. title="文件预览"
  6. left-text="关闭"
  7. left-arrow
  8. @click-left="returnTo"
  9. />
  10. </div>
  11. <div class="main">
  12. <pdf
  13. :src="src"
  14. :page="currentPage"
  15. @num-pages="pageCount=$event"
  16. @page-loaded="currentPage=$event"
  17. @loaded="loadPdfHandler">
  18. </pdf>
  19. </div>
  20. <div class="footer">
  21. <van-pagination v-model="currentPage" :page-count="pageCount" mode="simple"/>
  22. </div>
  23. </div>
  24. </template>
  1. <script>
  2. import pdf from 'vue-pdf'
  3. // 引入api
  4. import { getItemDetailAPI } from '@/api'
  5. export default {
  6. name: 'PreView',
  7. components: {
  8. pdf
  9. },
  10. data () {
  11. return {
  12. file_id: '',
  13. src: '',
  14. currentPage: 0, // pdf文件页码
  15. pageCount: 0 // pdf文件总页数
  16. }
  17. },
  18. created () {
  19. this.file_id = this.$route.query.item_id
  20. // this.fetchFileDetail()
  21. this.src = '/files/xxxx.pdf' // 本地测试版
  22. },
  23. methods: {
  24. returnTo () {
  25. // this.$router.go(-1)
  26. this.$router.back() // 返回
  27. },
  28. // 改变PDF页码,val传过来区分上一页下一页的值,0上一页,1下一页
  29. changePdfPage (val) {
  30. // console.log(val)
  31. if (val === 0 && this.currentPage > 1) {
  32. this.currentPage--
  33. // console.log(this.currentPage)
  34. }
  35. if (val === 1 && this.currentPage < this.pageCount) {
  36. this.currentPage++
  37. // console.log(this.currentPage)
  38. }
  39. },
  40. // pdf加载时
  41. loadPdfHandler (e) {
  42. this.currentPage = 1 // 加载的时候先加载第一页
  43. },
  44. // 根据fileId获取文件
  45. async fetchFileDetail () {
  46. /** 文件地址 **/
  47. // this.src = `/hbdjv1/files/${this.file_name}` // 发布版
  48. // this.src = `/files/${this.file_name}` // 本地测试版
  49. const params = {
  50. file_id: this.file_id
  51. }
  52. this.$toast.loading({ // 打开toast提示
  53. message: '加载中...',
  54. forbidClick: true,
  55. loadingType: 'spinner',
  56. duration: 0
  57. })
  58. console.log('=====文件详情===')
  59. console.log(params)
  60. const res = await getItemDetailAPI(params)
  61. this.$toast.clear() // 关闭toast
  62. if (res && res.code === 200) {
  63. if (res.data && res.data.length > 0) {
  64. this.src = res.data[0].url
  65. }
  66. }
  67. }
  68. }
  69. }
  70. </script>

Example.02 少于20页滚动预览,多于20分页预览

  1. <template>
  2. <div class="container">
  3. <div class="header">
  4. <van-nav-bar
  5. title="文件预览"
  6. left-text="关闭"
  7. left-arrow
  8. @click-left="returnTo"
  9. />
  10. </div>
  11. <div class="main" v-if="loaded">
  12. <!-- 页数 <= 20 直接滑动 -->
  13. <div v-show="pageCount <= divider ">
  14. <pdf v-for="index in pageCount" :key="index" :src="src" :page="index"></pdf>
  15. </div>
  16. <!-- 页数 > 20 分页 -->
  17. <div v-show="pageCount > divider">
  18. <pdf
  19. :src="src"
  20. :page="currentPage"
  21. @num-pages="pageCount=$event"
  22. @page-loaded="currentPage=$event"
  23. @loaded="loadPdfHandler">
  24. </pdf>
  25. </div>
  26. </div>
  27. <div class="footer" v-show="pageCount > divider" v-if="loaded">
  28. <van-pagination v-model="currentPage" :page-count="pageCount" mode="simple"/>
  29. </div>
  30. <van-empty description="文件加载失败" v-else/>
  31. </div>
  32. </template>
  1. <script>
  2. import pdf from 'vue-pdf'
  3. // 引入api
  4. import { getItemDetailAPI } from '@/api'
  5. export default {
  6. name: 'PreView',
  7. components: {
  8. pdf
  9. },
  10. data () {
  11. return {
  12. file_id: '',
  13. src: '',
  14. currentPage: 0, // pdf文件页码
  15. pageCount: 0, // pdf文件总页数
  16. divider: 20, // 设置分割数
  17. loaded: false
  18. }
  19. },
  20. created () {
  21. this.file_id = this.$route.query.item_id
  22. this.fetchFileDetail()
  23. },
  24. methods: {
  25. returnTo () {
  26. // this.$router.go(-1)
  27. this.$router.back() // 返回
  28. },
  29. // 改变PDF页码,val传过来区分上一页下一页的值,0上一页,1下一页
  30. changePdfPage (val) {
  31. // console.log(val)
  32. if (val === 0 && this.currentPage > 1) {
  33. this.currentPage--
  34. // console.log(this.currentPage)
  35. }
  36. if (val === 1 && this.currentPage < this.pageCount) {
  37. this.currentPage++
  38. // console.log(this.currentPage)
  39. }
  40. },
  41. // pdf加载时
  42. loadPdfHandler (e) {
  43. this.currentPage = 1 // 加载的时候先加载第一页
  44. },
  45. // 根据fileId获取文件
  46. async fetchFileDetail () {
  47. /** 文件地址 **/
  48. // this.src = `/hbdjv1/files/${this.file_name}` // 发布版
  49. // this.src = `/files/${this.file_name}` // 本地测试版
  50. const params = {
  51. file_id: this.file_id
  52. }
  53. this.$toast.loading({ // 打开toast提示
  54. message: '加载中...',
  55. forbidClick: true,
  56. loadingType: 'spinner',
  57. duration: 0
  58. })
  59. console.log('=====文件详情===')
  60. console.log(params)
  61. const res = await getItemDetailAPI(params)
  62. this.$toast.clear() // 关闭toast
  63. if (res && res.code === 200) {
  64. if (res.data && res.data.length > 0) {
  65. // this.src = res.data[0].url
  66. this.src = pdf.createLoadingTask(res.data[0].url)
  67. this.src.promise.then(pdf => {
  68. this.$nextTick(() => {
  69. this.pageCount = pdf.numPages // pdf总页数
  70. this.loaded = true
  71. })
  72. })
  73. }
  74. }
  75. }
  76. }
  77. }
  78. </script>

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

闽ICP备14008679号