# pdfjs

  • 使用不同的版本引入的pdf-dist方式会是不一样的。[例子是^2.2.228]
<!--查看pdf票据-->
<template>
  <div class="main-container">
    <input type="file" ref="fielinput" @change="uploadFile" />
    <h1>PDF翻页显示示例</h1>
    <div class="canvas-container">
      <canvas ref="myCanvas" class="pdf-container">
      </canvas>
    </div>
    <div class="pagination-wrapper">
      <button @click="clickPre">上一页</button>
      <span>第{{pageNo}} / {{pdfPageNumber}}页</span>
      <button @click="clickNext">下一页</button>
    </div>

    <h1>PDF多页连续滚动显示示例</h1>
    <div class="scroll-pdf-contanier" id="scrollPdfBox">
      <div v-for="index in pdfTotalPages" :key="index">
        <canvas :ref="`scrollPdfCanvas${index}`" class="scroll-pdf-container"></canvas>
      </div>
    </div>
  </div>
</template>

<script>
  import * as  pdfJS from 'pdfjs-dist'
  export default {
    mounted() {
      this.$nextTick(()=>{
      console.log('ceshi1',pdfJS,'pdfJS')

      })
    },
    data() {
      return {
        pageNo: null,
        pdfPageNumber: null,
        pdfTotalPages: 1,
        renderingPage: false,
        pdfData: null, // PDF的base64
        scale: 1 // 缩放值
      }
    },
    methods: {
      uploadFile () {
        let inputDom = this.$refs.fielinput
        let file = inputDom.files[0]
        let reader = new FileReader()
        reader.readAsDataURL(file)
        reader.onload = () => {
          let data = atob(reader.result.substring(reader.result.indexOf(',') + 1))
          this.loadPdfData(data)
        }
      },
      loadPdfData (data) {
        // 引入pdf.js的字体
        let CMAP_URL = 'https://unpkg.com/pdfjs-dist@2.0.943/cmaps/'
        //读取base64的pdf流文件
        this.pdfData = pdfJS.getDocument({
		  data:data,// PDF base64编码
          //url: 'https://mkdoorway.oss-cn-hangzhou.aliyuncs.com/%E9%98%BF%E9%87%8C%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83.pdf', //如果加载url可以使用
          cMapUrl: CMAP_URL,
          cMapPacked: true
        })
        this.renderPage(1)
        this.renderScrollPdf()
      },
      // 根据页码渲染相应的PDF
      renderPage (num) {
        this.renderingPage = true
        this.pdfData.promise.then((pdf) => {
          this.pdfPageNumber = pdf.numPages
          pdf.getPage(num)
            .then((page) => {
              // 获取DOM中为预览PDF准备好的canvasDOM对象
              let canvas = this.$refs.myCanvas
              let viewport = page.getViewport(this.scale)
              canvas.height = viewport.height
              canvas.width = viewport.width

              let ctx = canvas.getContext('2d')
              let renderContext = {
                canvasContext: ctx,
                viewport: viewport
              }
              page.render(renderContext).then(() => {
                this.renderingPage = false
                this.pageNo = num
              })
            })
        })
      },
      clickPre () {
        if (!this.renderingPage && this.pageNo && this.pageNo > 1) {
          this.renderPage(this.pageNo - 1)
        }
      },
      clickNext () {
        if (!this.renderingPage && this.pdfPageNumber && this.pageNo && this.pageNo < this.pdfPageNumber) {
          this.renderPage(this.pageNo + 1)
        }
      },
      renderScrollPdf () {
        this.pdfData.promise.then((pdf) => {
          this.pdfTotalPages = pdf.numPages
          this.renderScrollPdfPage(1)
        })
      },
      // 渲染连续滚动PDF
      renderScrollPdfPage (num) {
        this.pdfData.promise.then((pdf) => {
          let numPages = pdf.numPages
          pdf.getPage(num)
            .then((page) => {
              let canvas = this.$refs[`scrollPdfCanvas${num}`][0]
              let viewport = page.getViewport(this.scale)
              canvas.height = viewport.height * this.scale
              canvas.width = viewport.width * this.scale

              let ctx = canvas.getContext('2d')
              let renderContext = {
                canvasContext: ctx,
                viewport: viewport
              }
              page.render(renderContext).then(() => {
                if (num < numPages) {
                  this.renderScrollPdfPage(num + 1)
                }
              })
            })
        })
      }
    }
  }
</script>

<style scoped>
  .main-container {
    display: flex;
    flex-direction: column;
    align-items: center;
  }
  .canvas-container {
    width: 400px;
    height: 500px;
    border: 1px dashed black;
    position: relative;
    display: flex;
    justify-content: center;
  }
  .scroll-pdf-contanier {
    width: 400px;
    height: 500px;
    border: 1px dashed black;
    position: relative;
    display: flex;
    flex-direction: column;
    overflow-y: scroll;
  }
  .pdf-container {
    width: 100%;
    height: 100%;
  }
  .scroll-pdf-container {
    width: 350px;
  }
  .pagination-wrapper {
    display: flex;
    justify-content: center;
    align-items: center;
  }
</style>

可以引用编译好的包

//如果直接引用可能会报错,那么可能就是版本问题
import * as  pdfJS from 'pdfjs-dist'

2.8.335版本之前

import PDFJS from 'pdfjs-dist/es5/build/pdf.js'

2.8.335版本之后

import PDFJS from 'pdfjs-dist/legacy/build/pdf.js'

虽然用iframe可以直接访问pdf,但是用了pdfjs后,会报跨域问题,需要在oss上进行配置

pdfjs.GlobalWorkerOptions.workerSrc,是一个核心库,单独创建工作者线程去处理复杂的业务,如果不使用可能会存在卡顿的问题。

//这是本地加载
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry'; //最新版本找不到这个文件了
pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
//cdn远程加载 
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;

本地加载的话新版本是加载build下的worker.min.main.js,可以把这个文件拷贝到public目录下,结合window.origin拼接使用

# pdfjs api

属性 说明 类型 默认值
url PDF的url地址 String/URL -
data 二进制 PDF 数据。使用类型化数组 (Uint8Array) 来提高内存使用率。如果 PDF 数据是 BASE64 编码的,请先使用 atob() 将其转换为二进制字符串 TypedArray/Array/String -
httpHeaders 基本身份验证请求头 Object -
withCredentials 指示是否应使用 cookie 或授权标头等凭据发出跨站点访问控制请求。 Boolean false
password 用于解密受密码保护的 PDF String -
initialData 带有第一部分或全部 pdf 数据的类型化数组。由扩展使用,因为在切换到范围请求之前已经加载了一些数据。 TypedArray -
length PDF文件长度。它用于进度报告和范围请求操作 Number -
range 允许使用自定义范围 PDFDataRangeTransport -

......

# 利用pdfjs自带的viewer

去官网上下载pdfjs后将文件解压缩,重命名为pdf文件夹,放在vue的public目录下。

 <iframe src="./pdf/web/viewer.html?file=http://mkdoorway.oss-cn-hangzhou.aliyuncs.com/%E9%98%BF%E9%87%8C%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83.pdf" frameborder="0"></iframe>

pdf目录下的web/viewer.js中,注释掉以下代码,否则页面会报错

// if (origin !== viewerOrigin && protocol !== "blob:") {
//   throw new Error("file origin does not match viewer's");
// }

此方法dist打包后,页面没有任何响应!需要后续试验查看

# pdfjs 签章展示

修改pdf.worker.js中注释掉一下代码,pdf.worker.js.map也需要去处理

// if (data.fieldType === 'Sig') {
//   data.fieldValue = null;

//   _this3.setFlags(_util.AnnotationFlag.HIDDEN);
// }

签章设置在比较新的版本已经修复了,不需要这么操作了

oss需要配置设定跨域规则 (opens new window)

解决pdf引用问题 (opens new window)

pdfjsApi (opens new window)

pdfjs多种写法 (opens new window)

pdfjs放大缩小 (opens new window)

最后更新: 1/15/2025, 10:28:50 PM