tj
2025-04-30 5a30c92533a87bd5c93ab8620e6de695a66a3b3a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<template>
  <div class="pdf-div flex flex-col justify-center items-center">
    <!-- canvas 占满屏幕 -->
    <canvas ref="canvasRef" class="canvas-full"></canvas>
    <!-- 分页控制 -->
    <div class="text-center m-1 ">
      <el-link type="primary" @click="prevPage">上一页</el-link>
      <span class="mx-4 text-xs">当前第 {{ page }} 页,共 {{ totalPages }} 页</span>
      <el-link type="primary" @click="nextPage">下一页</el-link>
    </div>
  </div>
</template>
  
  <script setup lang="ts">
  import { ref, watch, onMounted } from 'vue'
  import * as pdfjsLib from 'pdfjs-dist'
  pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdf.worker.js'
  
  const props = defineProps<{
    src: string
    scale?: number
  }>()
  
  const canvasRef = ref<HTMLCanvasElement | null>(null)
  const page = ref(1)
  const pdfDoc = ref<any>(null)
  const totalPages = ref(0)
  const scale = props.scale ?? 1.2
  
  const renderPage = async (num: number) => {
    if (!pdfDoc.value) return
    const pageObj = await pdfDoc.value.getPage(num)
    const viewport = pageObj.getViewport({ scale })
    const canvas = canvasRef.value
    if (!canvas) return
    const context = canvas.getContext('2d')
    canvas.height = viewport.height
    canvas.width = viewport.width
    await pageObj.render({ canvasContext: context!, viewport }).promise
  }
 
  const loadPdf = async () => {
    const loadingTask = pdfjsLib.getDocument(props.src)
    pdfDoc.value = await loadingTask.promise
    totalPages.value = pdfDoc.value.numPages
    renderPage(page.value)
  }
 
 
  watch(page, renderPage)
  onMounted(loadPdf)
 
 
  
  const prevPage = () => {
    if (page.value > 1) page.value--
  }
  const nextPage = () => {
    if (page.value < totalPages.value) page.value++
  }
  </script>
  <style scoped>
 .pdf-div {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  height: 100%; /* 如果需要填充整个容器高度,可以设置 */
}
.canvas-full {
  width: 100%;  /* 让 canvas 宽度占满父容器 */
  height: 90%; /* 让 canvas 高度占满父容器 */
}
  </style>