越写悦快乐之Vue项目如何集成PDF组件

Vue框架 - 图片来自简书App

今天的越写悦快乐系列文章为大家带来ue项目如何集成PDF组件的文章。做过前端开发的小伙伴都知道,我们如何在页面中集成PDF文件,也就是读取二进制数据并渲染到页面上,我们可以使用vue-pdf来快速构建页面,也可以自定义组件使用pdf-dist来直接操作PDF文档,通过获取文档信息然后根据页码依次渲染页面,接下来的文章我为大家带来Vue项目中如何集成PDF组件,也就是渲染PDF文件到页面上。

开发环境

  • 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 {
      // 页面标题
      pageTitle: '查看业务',
      // 页面参数
      taskId: '',
      processId: '',
      key: '',
      // 模板参数
      src: undefined,
      numPages: undefined
    }
  },
  mounted() {
    // 获取参数
    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>

运行

运行结果 - 图片来自简书App

原理分析

我们使用vue-pdf这个组件其实是利用pdfjs生成文档数据,然后通过组件进行渲染,通过PDFJS.getDocument()获取文档对象,然后根据src属性按照页码依次渲染。

参考

FAQ

  • PDF文件有签章不显示该怎么办?

临时方案可以注释pdf-dist下的pdf.worker.js中的Sig判断

  • PDF文件加载报错

请参考issue

个人收获及感想

本文的使用只是pdf.js的冰山一角,若是有兴趣的朋友可以深入学习一下该开源库的渲染原理和其它用法。

今天的这篇文章我们分析和整理了如何在Vue项目中渲染PDF文件,其实是利用pdf.js来处理和渲染文件的,vue-pdf只是针对Vue封装了一些属性方法,假设我们不使用Vue也可以渲染PDF文件,只是需要我们利用pdf.js提供的方法来操作DOM,获取URL地址最后渲染在页面上。通过以上的整理和总结我们应该了解PDF文件渲染的原理以及如何封装Vue组件,最后可以在修改源代码的基础上解决一些实际的业务问题。希望大家保存学习的热情,继续构建高可用低延迟的产品和服务,为公司创建更大的价值。若是我的文章对你有所启发,那将是我莫大的荣幸。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容