pdf.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <div ref="pdfContainer" class="pdF-container" @scroll="onScroll">
  3. <div ref="canvasWrapper" class="canvas-wrapper"></div>
  4. </div>
  5. </template>
  6. <script setup>
  7. import { onMounted, ref } from 'vue';
  8. import * as pdfjsLib from 'pdfjs-dist';
  9. const pdfUrl = 'https://celiang.oss-cn-hangzhou.aliyuncs.com/measurement/2022-01/18/75it6phpocqYFV1642488558220118.pdf';
  10. const pdfContainer = ref(null); // PDF容器
  11. const canvasWrapper = ref(null); // canvas容器
  12. let currentPage = 1; // 当前显示的页码
  13. const totalPages = ref(0); // PDF 总页数
  14. const pageHeight = 1000; // 每个页面的高度,用于判断是否需要加载新页面
  15. let loadedPages = new Set(); // 存储已加载的页面编号
  16. onMounted(() => {
  17. console.log(pdfjsLib.version);
  18. // 设置 pdf.js 的 workerSrc
  19. pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.6.347/pdf.worker.min.js`;
  20. // 加载 PDF 文件
  21. pdfjsLib.getDocument(pdfUrl).promise.then((pdf) => {
  22. console.log('PDF loaded', pdf.numPages);
  23. totalPages.value = pdf.numPages;
  24. // 初始化页面加载
  25. loadPagesInView();
  26. }).catch((error) => {
  27. console.error('Error loading PDF:', error);
  28. });
  29. });
  30. // 滚动事件处理函数
  31. function onScroll() {
  32. loadPagesInView();
  33. }
  34. // 加载当前可视区域的页面
  35. function loadPagesInView() {
  36. const container = pdfContainer.value;
  37. const scrollTop = container.scrollTop; // 获取当前滚动位置
  38. const containerHeight = container.clientHeight; // 容器的可视区域高度
  39. // 计算可见区域的开始和结束页码
  40. const startPage = Math.floor(scrollTop / pageHeight) + 1;
  41. const endPage = Math.ceil((scrollTop + containerHeight) / pageHeight);
  42. // 加载可见范围内的页面
  43. for (let pageNum = startPage; pageNum <= endPage; pageNum++) {
  44. if (!loadedPages.has(pageNum)) {
  45. loadedPages.add(pageNum); // 标记该页已经加载
  46. loadPage(pageNum); // 加载该页
  47. }
  48. }
  49. }
  50. // 加载指定页码的PDF页面
  51. async function loadPage(pageNum) {
  52. const pdf = await pdfjsLib.getDocument(pdfUrl).promise; // 获取 PDF 文档对象
  53. const page = await pdf.getPage(pageNum);
  54. const canvas = document.createElement('canvas');
  55. const context = canvas.getContext('2d');
  56. const scale = 2; // 设置缩放比例
  57. const viewport = page.getViewport({ scale });
  58. // 设置 canvas 大小
  59. canvas.height = viewport.height;
  60. canvas.width = viewport.width;
  61. // 渲染页面
  62. await page.render({
  63. canvasContext: context,
  64. viewport: viewport
  65. }).promise;
  66. console.log('Page rendered', pageNum);
  67. // 将渲染后的 canvas 添加到容器中
  68. canvasWrapper.value.appendChild(canvas);
  69. }
  70. </script>
  71. <style scoped>
  72. .pdF-container {
  73. height: 100%;
  74. overflow-y: auto; /* 支持垂直滚动 */
  75. }
  76. .canvas-wrapper {
  77. display: block;
  78. width: 100%;
  79. }
  80. canvas {
  81. margin-bottom: 10px;
  82. border: 1px solid #ccc;
  83. }
  84. </style>