소스 검색

feat: 111

lanjianrong 4 년 전
부모
커밋
6bd058c74f
4개의 변경된 파일106개의 추가작업 그리고 8개의 파일을 삭제
  1. 2 1
      package.json
  2. 12 7
      src/views/design-directive/catalog/index.vue
  3. 87 0
      src/views/design-directive/catalog/pdf.vue
  4. 5 0
      yarn.lock

+ 2 - 1
package.json

@@ -38,11 +38,12 @@
     "ant-design-vue": "2.1.0",
     "axios": "^0.21.1",
     "crypto-js": "^4.0.0",
-    "qrcode": "^1.4.4",
     "lodash-es": "^4.17.21",
     "mockjs": "^1.1.0",
     "nprogress": "^0.2.0",
     "path-to-regexp": "^6.2.0",
+    "pdfjs-dist": "^2.6.347",
+    "qrcode": "^1.4.4",
     "sortablejs": "^1.13.0",
     "vue": "^3.0.7",
     "vue-i18n": "^9.0.0",

+ 12 - 7
src/views/design-directive/catalog/index.vue

@@ -45,7 +45,7 @@
           <span class="text-3xl font-bold">{{ detail.name }}</span>
           <section>
             <AButton
-              v-show="showExcelUploadBtn"
+              v-show="showExcel"
               type="primary"
               size="small"
               class="mr-4"
@@ -58,7 +58,9 @@
             <!-- <AButton type="primary" size="small" class="mx-1 mr-4">下载</AButton> -->
           </section>
         </header>
-        <section class="h-11/12 border-gray-400 border"> </section>
+        <section class="h-11/12 border-gray-400 border">
+          <!-- <PreviewPdf v-show="!showExcel" :url="pdfUrl"></PreviewPdf> -->
+        </section>
       </div>
     </div>
   </div>
@@ -75,13 +77,13 @@
   import { uploadApi } from '/@/api/sys/upload'
   import { TreeRow } from '/#/tree'
   import { downloadByUrl } from '/@/utils/file/download'
-  // import PreviewPdf from './pdf.vue'
+  import PreviewPdf from './pdf.vue'
   interface ATreeRow extends TreeRow {
     showUpload: boolean
   }
   export default defineComponent({
     name: 'Catalog',
-    components: { BasicTree, Icon, BasicUpload },
+    components: { BasicTree, Icon, BasicUpload, PreviewPdf },
     setup() {
       const treeData = ref<TreeResultModel[]>([])
       const row = ref<ATreeRow>({
@@ -162,13 +164,15 @@
 
       const showUploadBtn = computed(() => row.value.showUpload)
 
-      const showExcelUploadBtn = computed(() => /.(excel)|(xls)|(xlsl)$/.test(detail.value.ext))
+      const showExcel = computed(() => /.(excel)|(xls)|(xlsl)$/.test(detail.value.ext))
 
       const uploadExecl = () => {
         downloadByUrl({
           url: 'http://localhost:7070' + detail.value.filepath
         })
       }
+
+      const pdfUrl = computed(() => 'http://localhost:7070' + detail.value.filepath)
       return {
         treeData,
         replaceFields,
@@ -180,8 +184,9 @@
         handleChange,
         row,
         showUploadBtn,
-        showExcelUploadBtn,
-        uploadExecl
+        showExcel,
+        uploadExecl,
+        pdfUrl
       }
     }
   })

+ 87 - 0
src/views/design-directive/catalog/pdf.vue

@@ -0,0 +1,87 @@
+<template>
+  <div class="canvas-container">
+    <canvas ref="pdfCanvas" class="pdf-container"> </canvas>
+  </div>
+  <div class="pagination-wrapper">
+    <button @click="clickPre">上一页</button>
+    <span>第{{ pageNo }} / {{ pdfPageNumber }}页</span>
+    <button @click="clickNext">下一页</button>
+  </div>
+</template>
+
+<script lang="ts">
+  import PDF from 'pdfjs-dist'
+  import { defineComponent, PropType, reactive, ref, watch, toRefs } from 'vue'
+  import { PdfData } from '/#/tree'
+  export default defineComponent({
+    props: { url: { type: String as PropType<string>, required: true } },
+    setup(props) {
+      const pdfCanvas = ref(null)
+      const pdfData: any = ref(null)
+      const pdfVM = reactive<PdfData>({
+        pageNo: 0,
+        pdfPageNumber: 0,
+        pdfTotalPages: 1,
+        renderingPage: false,
+        scale: 1 // 缩放值
+      })
+      loadPdf(props.url)
+      watch(props, props => {
+        loadPdf(props.url)
+      })
+      function loadPdf(url: string) {
+        // 引入pdf.js的字体
+        let CMAP_URL = 'https://unpkg.com/pdfjs-dist@2.0.943/cmaps/'
+        pdfData.value = PDF.getDocument({
+          url,
+          cMapUrl: CMAP_URL,
+          cMapPacked: true
+        })
+        renderPage(1)
+        // renderScrollPdf()
+      }
+      function clickPre() {
+        if (!pdfVM.renderingPage && pdfVM.pageNo && pdfVM.pageNo > 1) {
+          renderPage(pdfVM.pageNo - 1)
+        }
+      }
+      function clickNext() {
+        if (
+          !pdfVM.renderingPage &&
+          pdfVM.pdfPageNumber &&
+          pdfVM.pageNo &&
+          pdfVM.pageNo < pdfVM.pdfPageNumber
+        ) {
+          renderPage(pdfVM.pageNo + 1)
+        }
+      }
+
+      function renderPage(num: number) {
+        pdfVM.renderingPage = true
+        pdfData.value.then(pdf => {
+          pdfVM.pdfPageNumber = pdf.numPages
+          pdf.getPage(num).then(page => {
+            // 获取DOM中为预览PDF准备好的canvasDOM对象
+            let canvas = pdfCanvas.value as any
+            let viewport = page.getViewport(pdfVM.scale)
+            canvas.height = viewport.height
+            canvas.width = viewport.width
+            let ctx = canvas.getContext('2d')
+            let renderContext = {
+              canvasContext: ctx,
+              viewport: viewport
+            }
+            page.render(renderContext).then(() => {
+              pdfVM.renderingPage = false
+              pdfVM.pageNo = num
+            })
+          })
+        })
+      }
+
+      return { pdfCanvas, clickPre, clickNext, ...toRefs(pdfVM) }
+    }
+  })
+</script>
+
+<style lang="less" scroped></style>

+ 5 - 0
yarn.lock

@@ -8414,6 +8414,11 @@ path-type@^4.0.0:
   resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
+pdfjs-dist@^2.6.347:
+  version "2.6.347"
+  resolved "https://registry.npm.taobao.org/pdfjs-dist/download/pdfjs-dist-2.6.347.tgz#f257ed66e83be900cd0fd28524a2187fb9e25cd5"
+  integrity sha1-8lftZug76QDND9KFJKIYf7niXNU=
+
 pend@~1.2.0:
   version "1.2.0"
   resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"