pdf.vue 3.0 KB

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