pdfViewExample.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <template>
  2. <div class="pdf-view-example j-contanter">
  3. <div class="pdf-view-container j-main">
  4. <div id="pdf-container" />
  5. </div>
  6. <div v-if="!getUserId" class="j-footer">
  7. <a href="/jyapp/free/login?url=/jy_mobile/order/create/creditreport&activity=bidCreditReportPreview" class="adsense-container">
  8. <AdSingle
  9. ad="app-credit-report-sample"
  10. :show-tag="false"
  11. :show-close-icon="false"
  12. class="adsense-container"
  13. />
  14. </a>
  15. </div>
  16. </div>
  17. </template>
  18. <script>
  19. import { mapGetters } from 'vuex'
  20. import * as pdfjsLib from 'pdfjs-dist/build/pdf'
  21. import AdSingle from '@/components/ad/Ad'
  22. import { getAssetsFile } from '@/utils'
  23. import 'pdfjs-dist/build/pdf.worker.mjs'
  24. export default {
  25. name: 'PdfViewExample',
  26. components: {
  27. AdSingle
  28. },
  29. data() {
  30. return {
  31. pdfUrl: '',
  32. pdf: null,
  33. totalPages: 0
  34. }
  35. },
  36. computed: {
  37. ...mapGetters('user', ['getUserId'])
  38. },
  39. created() {
  40. const { pdfUrl } = this.$route.query
  41. if (pdfUrl) {
  42. this.pdfUrl = decodeURIComponent(pdfUrl)
  43. }
  44. else {
  45. const pdfAssets = getAssetsFile('example.pdf')
  46. this.pdfUrl = pdfAssets
  47. }
  48. },
  49. mounted() {
  50. const container = document.getElementById('pdf-container')
  51. this.loadPdf(this.pdfUrl, container)
  52. // 监听窗口的 resize 事件,实现自适应效果
  53. window.addEventListener('resize', () => {
  54. container.innerHTML = ''
  55. this.loadPdf(this.pdfUrl, container)
  56. })
  57. },
  58. methods: {
  59. async loadPdf(pdfUrl, container) {
  60. try {
  61. const loadingTask = pdfjsLib.getDocument({
  62. url: pdfUrl,
  63. disableRange: true
  64. })
  65. this.pdf = await loadingTask.promise
  66. this.totalPages = this.pdf.numPages
  67. for (let pageNum = 1; pageNum <= this.totalPages; pageNum++) {
  68. const page = await this.pdf.getPage(pageNum)
  69. const viewport = page.getViewport({ scale: this.calculateScale(page) })
  70. const canvas = document.createElement('canvas')
  71. const ctx = canvas.getContext('2d')
  72. canvas.height = viewport.height
  73. canvas.width = viewport.width
  74. container.appendChild(canvas)
  75. await page.render({
  76. canvasContext: ctx,
  77. viewport,
  78. }).promise
  79. }
  80. }
  81. catch (error) {
  82. console.error('Error loading PDF:', error)
  83. }
  84. },
  85. // 计算缩放比例以适应容器宽度
  86. calculateScale(page) {
  87. const containerWidth = document.getElementById('pdf-container').clientWidth
  88. const viewport = page.getViewport({ scale: 1 })
  89. return containerWidth / viewport.width
  90. }
  91. }
  92. }
  93. </script>
  94. <style lang="scss" scoped>
  95. .pdf-container {
  96. width: 100%;
  97. height: 100%;
  98. iframe {
  99. width: 100%;
  100. height: 100%;
  101. }
  102. }
  103. </style>