VUE2实现pdf批注

VUE2实现pdf批注

最近有一个开发需需求, 需要用在pdf做标注功能,用了很多插件,都和目标不太相符,最后用canvas绘制完成了此功能。


前言

如果有不懂canvas的具体操作和api调用,推荐先去b站深入学习,具体实现操作代码如下。


提示:以下是本篇文章正文内容,下面案例可供参考

一、canvas是什么?

Canvas是一个基于Web的HTML5应用程序,它提供了一个用于创建和展示图形和动画的HTML元素。Canvas可以用来绘制图形、动画、视频、音频、游戏等等。它是HTML5标准的一部分,使用JavaScript编程语言来操作和控制

二、使用步骤

1.引入库

代码如下(示例):

		<el-button size="mini">{{ pageNum }}/{{ numPages }}</el-button>
        <el-button size="mini" type @click="resetAll">清空</el-button>
        <el-button size="mini" type @click="handleRepealCancvs">撤销</el-button>
        <el-button size="mini" type @click="downLoad">下载</el-button>
        <el-button size="mini" type @click="radioClick('R')">矩形绘制</el-button>
        <el-button size="mini" type="primary" @click="btnPre">上一页</el-button>
        <el-button size="mini" type="success" @click="btnNext">下一页</el-button>
        <el-button size="mini" type="danger">提交</el-button>

2.实现

代码如下(示例):

	//上一页
	btnPre() {
      let page = this.pageNum
      page = page > 1 ? page - 1 : this.numPages
      this.pageNum = page
    },
    //下一页
    btnNext() {
      let page = this.pageNum
      page = page < this.numPages ? page + 1 : 1
      this.pageNum = page
      // this.resetAll()
    },
    // 下载画布 这里用的是html2canvas 插件
    downLoad() {
      html2canvas(document.getElementsByClassName('pdf-canvas-warp')).then(cavans => {
        this.imgData = cavans.toDataURL('image/png')
        const fileName = 'canvas.png'
        if ('download' in document.createElement('a')) {
          // 非IE下载
          const elink = document.createElement('a')
          elink.download = fileName
          elink.style.display = 'none'
          elink.href = this.imgData
          document.body.appendChild(elink)
          elink.click()
          document.body.removeChild(elink)
        } else {
          // IE10+下载
          navigator.msSaveBlob(this.url, fileName)
        }
      })
    },
    // 关键代码实现 
    onPointerDown(e) {
      if (this.type !== 'R') {
        return
      }
      var location = this.unifyCoordinates(e.clientX, e.clientY)
      this.pointerDownLocation.x = location.x
      this.pointerDownLocation.y = location.y
      this.dragging = true
      this.saveData()
      console.log(this.rubberBandRect)
      console.log(this.pointerDownLocation)
    },
    onPointerMove(e) {
      if (this.type !== 'R') {
        return
      }
      if (this.dragging) {
        let location = this.unifyCoordinates(e.clientX, e.clientY)
        this.restoreData()
        this.makeRect(location)
        this.drawShape(location)
      }
    },

    onPointerUp(e) {
      if (this.type !== 'R') {
        return
      }
      if (this.dragging) {
        var location = this.unifyCoordinates(e.clientX, e.clientY)
        this.dragging = false
        this.restoreData()
        this.makeRect(location)
        this.drawShape(location)

        this.recordHisy()
      }
    }
    //调用处 
    deactivated() {
    this.canvas.removeEventListener('pointerdown', this.onPointerDown)
    this.canvas.removeEventListener('pointermove', this.onPointerMove)
    this.canvas.removeEventListener('pointerup', this.onPointerUp)
  },
  methods: {
    initImage() {
      this.canvas = this.$refs.mycanvss
      this.ctx = this.canvas.getContext('2d')
      const image = new Image()
      image.setAttribute('crossOrigin', 'anonymous')
      image.src = this.img
      image.onload = () => {
        // 图片加载完,再draw 和 toDataURL
        if (image.complete) {
          this.canvas.width = image.width
          this.canvas.height = image.height
          this.imageObj = image
          this.ctx.drawImage(image, 0, 0)
          this.ctx.globalCompositeOperation = 'R'
          this.canvas.addEventListener('pointerdown', this.onPointerDown)
          this.canvas.addEventListener('pointermove', this.onPointerMove)
          this.canvas.addEventListener('pointerup', this.onPointerUp)
          let imgData = this.canvas.toDataURL()
          this.historyList.push(imgData)
        }
      }
    },

总结

提示:这里对文章进行总结:

以上内容是关键实现代码逻辑可对pdf内容进行圈注,撤销,清空等操作。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2实现PDF在线预览可以借助pdf.js库来实现。 首先需要安装pdf.js库: ``` npm install pdfjs-dist ``` 安装完成后,在Vue组件中引入pdf.js: ```javascript import pdfjsLib from 'pdfjs-dist' ``` 接着,在Vue组件中定义一个canvas元素来承载PDF页面: ```html <template> <div> <canvas ref="pdfCanvas"></canvas> </div> </template> ``` 在Vue组件的mounted钩子函数中,使用pdf.js的API来加载PDF文档并进行渲染: ```javascript mounted() { // 获取canvas元素 const canvas = this.$refs.pdfCanvas; // 获取渲染上下文 const context = canvas.getContext('2d'); // 定义PDF文档的URL const pdfUrl = 'https://example.com/example.pdf'; // 加载PDF文档 pdfjsLib.getDocument(pdfUrl).promise.then(pdf => { // 获取第一页 const pageNumber = 1; pdf.getPage(pageNumber).then(page => { // 获取页面渲染参数 const viewport = page.getViewport({ scale: 1 }); // 设置canvas元素的大小 canvas.height = viewport.height; canvas.width = viewport.width; // 渲染PDF页面 const renderContext = { canvasContext: context, viewport: viewport }; page.render(renderContext); }); }); } ``` 以上代码中,我们首先获取canvas元素和渲染上下文,然后使用pdfjsLib的getDocument()方法加载PDF文档,接着获取第一页并获取页面渲染参数。最后使用page.render()方法渲染PDF页面。 通过这种方式,就可以在Vue2中实现PDF在线预览了。请注意,以上代码仅为示例代码,具体实现方式可能因情况而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值