越寫悅快樂之Vue項(xiàng)目如何集成PDF組件

Vue框架 - 圖片來自簡(jiǎn)書App

今天的越寫悅快樂系列文章為大家?guī)韚e項(xiàng)目如何集成PDF組件的文章。做過前端開發(fā)的小伙伴都知道,我們?nèi)绾卧陧撁嬷屑蒔DF文件,也就是讀取二進(jìn)制數(shù)據(jù)并渲染到頁面上,我們可以使用vue-pdf來快速構(gòu)建頁面,也可以自定義組件使用pdf-dist來直接操作PDF文檔,通過獲取文檔信息然后根據(jù)頁碼依次渲染頁面,接下來的文章我為大家?guī)鞻ue項(xiàng)目中如何集成PDF組件,也就是渲染PDF文件到頁面上。

開發(fā)環(huán)境

  • Window 10.0.17763
  • Node 10.15.3
  • Yarn 1.16.0
  • Vue CLI 3.7.0
  • Git 2.21.0

接入步驟

添加依賴

{
  "name": "vant-tour",
  "version": "1.0.0",
  "private": true,
  "description": "An Vant Tour",
  "license": "MIT",
  "author": "Watony Weng <softweitao@126.com>",
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "axios": "^0.18.0",
    "babel-runtime": "^6.26.0",
    "vant": "^1.6.14",
    "vue": "^2.6.10",
    "vue-pdf": "^4.0.6",
    "vue-router": "^3.0.5"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^3.4.0",
    "@vue/cli-plugin-eslint": "^3.4.0",
    "@vue/cli-service": "^3.4.0",
    "babel-plugin-import": "^1.8.0",
    "less": "^3.8.1",
    "less-loader": "^4.1.0",
    "postcss-pxtorem": "^4.0.1",
    "qs": "^6.7.0",
    "vue-cli-plugin-axios": "0.0.4",
    "vue-template-compiler": "^2.6.10",
    "vuejs-logger": "^1.5.3",
    "webpack": "^4.32.0"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/recommended"
    ],
    "rules": {},
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "browserslist": [
    "Android >= 4.0",
    "iOS >= 7"
  ]
}

vue-pdf庫需要依賴babel-runtime

引入組件 - 模板部分

<pdf 
      v-for="i in numPages" 
      :key="i" 
      :src="src" 
      :page="i"/>

引入組件 - 邏輯部分

<script>
import { NavBar } from 'vant'
import pdf from 'vue-pdf'

export default {
  name: 'Verify',
  components: {
    [NavBar.name]: NavBar,
    pdf
  },
  data() {
    return {
      // 頁面標(biāo)題
      pageTitle: '查看業(yè)務(wù)',
      // 頁面參數(shù)
      taskId: '',
      processId: '',
      key: '',
      // 模板參數(shù)
      src: undefined,
      numPages: undefined
    }
  },
  mounted() {
    // 獲取參數(shù)
    this.taskId = this.$route.query.taskId
    this.processId = this.$route.query.processId
    this.key = this.$route.query.key
    // 文件渲染
    this.getPdf()
  },
  methods: {
    onClickLeft() {
      this.$router.push('upcoming')
    },
    onClickRight() {
      this.$router.push({
        path: 'review',
        query: {
          taskId: this.taskId,
          processId: this.processId,
          key: this.key
        }
      })
    },
    getPdf() {
      const url = this.axios.defaults.baseURL + this.taskId + '.PDF'
      this.$log.info(url)
      this.src = pdf.createLoadingTask(url)
      this.src
        .then(pdf => {
          this.numPages = pdf.numPages
        })
        .catch(error => {
          Toast.fail(error)
        })
    }
  }
}
</script>

運(yùn)行

運(yùn)行結(jié)果 - 圖片來自簡(jiǎn)書App

原理分析

我們使用vue-pdf這個(gè)組件其實(shí)是利用pdfjs生成文檔數(shù)據(jù),然后通過組件進(jìn)行渲染,通過PDFJS.getDocument()獲取文檔對(duì)象,然后根據(jù)src屬性按照頁碼依次渲染。

參考

FAQ

  • PDF文件有簽章不顯示該怎么辦?

臨時(shí)方案可以注釋pdf-dist下的pdf.worker.js中的Sig判斷

  • PDF文件加載報(bào)錯(cuò)

請(qǐng)參考issue

個(gè)人收獲及感想

本文的使用只是pdf.js的冰山一角,若是有興趣的朋友可以深入學(xué)習(xí)一下該開源庫的渲染原理和其它用法。

今天的這篇文章我們分析和整理了如何在Vue項(xiàng)目中渲染PDF文件,其實(shí)是利用pdf.js來處理和渲染文件的,vue-pdf只是針對(duì)Vue封裝了一些屬性方法,假設(shè)我們不使用Vue也可以渲染PDF文件,只是需要我們利用pdf.js提供的方法來操作DOM,獲取URL地址最后渲染在頁面上。通過以上的整理和總結(jié)我們應(yīng)該了解PDF文件渲染的原理以及如何封裝Vue組件,最后可以在修改源代碼的基礎(chǔ)上解決一些實(shí)際的業(yè)務(wù)問題。希望大家保存學(xué)習(xí)的熱情,繼續(xù)構(gòu)建高可用低延遲的產(chǎn)品和服務(wù),為公司創(chuàng)建更大的價(jià)值。若是我的文章對(duì)你有所啟發(fā),那將是我莫大的榮幸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前幾日聽到一句生猛與激勵(lì)并存,可怕與尷尬同在,最無奈也無解的話:“90后,你的中年危機(jī)已經(jīng)殺到”。這令我很受觸動(dòng)。...
    王鈺峰閱讀 4,585評(píng)論 1 22
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    小姜先森o0O閱讀 10,101評(píng)論 0 72
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    王喂馬_閱讀 6,579評(píng)論 1 77
  • 我是央塔克鄉(xiāng)精干小學(xué)一年級(jí)(1)班語文教師兼班主任胡鴻燕。從2018年3月份來到這里任教,沒有什么經(jīng)驗(yàn),只是...
    023a1aef77aa閱讀 368評(píng)論 0 1
  • 原文鏈接 本文主要記錄CGAffineTransform方法類的大概使用方式
    rapunzelyeah閱讀 602評(píng)論 0 1

友情鏈接更多精彩內(nèi)容