vue+pdf.js预览本地pdf文件(可以复制文本,滚动页码展示)

这篇具有很好参考价值的文章主要介绍了vue+pdf.js预览本地pdf文件(可以复制文本,滚动页码展示)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、安装pdfjs-dist插件,推荐使用2.0.943这个版本

npm install pdfjs-dist@2.0.943

2、页面中引入使用

import PDFJS from 'pdfjs-dist'
// 文本视图,可复制
import { TextLayerBuilder } from 'pdfjs-dist/web/pdf_viewer'
import 'pdfjs-dist/web/pdf_viewer.css'
PDFJS.workerSrc = require('pdfjs-dist/build/pdf.worker.min')

3、页面标签

<div class="pdfContainer">
  <div class="pdfOprate">
    <!-- 当前页码/页码总数 -->
    <span class="pdfCount">
       <span class="pdfPage">{{pdfPage}}</span> / <span class="pdfPageTotal">{{pdfTotalPages}}</span>
    </span>
  </div>
  <!-- pdf视图 -->
  <div class="pdfBody" @scroll="pdfScroll($event)">
    <div id="pdfBox">
      <!-- pdf内容,图片和文本视图 -->
      <!-- <div class="divBox">
        <canvas ></canvas>
        <div class="textLayer"></div>
      </div> -->
    </div>
  </div>
</div>

3、解析pdf,获取pdf所有页数据,使用canvas渲染,并使用TextLayerBuilder创建文本层,可以复制文本信息

// 使用pdf.js加载和显示PDF文件
previewPdf(file){
    var that=this
    const fileReader = new FileReader();
    fileReader.onload = function() {
        const typedArray = new Uint8Array(this.result);
        // 调用pdf.js的API加载PDF文件
        PDFJS.getDocument(typedArray).promise.then(async function(pdf) {
            that.viewPdfObject=pdf
            // 获取PDF的总页数
            const numPages = pdf.numPages;
            // 渲染当前显示页码和总页数
            this.pdfPage=1
            this.pdfTotalPages=numPages
            const pdfBox = document.getElementById("pdfBox");
            // 循环绘制每个页面
            for (let pageNum = 1; pageNum <= numPages; pageNum++) {
              // 获取指定页数据
              let page = await pdf.getPage(pageNum)
              // 获取视图 1是倍率,按照pdf解析出来的原始宽高
              const viewport = page.getViewport(1)
              
              const divBox=document.createElement("div")
              divBox.className="divBox"
              pdfBox.appendChild(divBox)
              const canvasElement=document.createElement("canvas")
              const context = canvasElement.getContext("2d");
              canvasElement.width = viewport.width;
              canvasElement.height = viewport.height;
              divBox.appendChild(canvasElement)

              // 渲染指定页的内容到canvas上
              // 如果你只是展示pdf而不需要复制pdf内容功能,则可以这样写render
              // page.render({canvasContext: context,viewport})
              // 需要复制内容就使用下面的渲染方式
              var textContent=await page.render({
                canvasContext: context,
                viewport
              }).then(() => {
                return page.getTextContent();
              })

              // 创建文本图层div
              const textLayerDiv = document.createElement('div')
              textLayerDiv.className="textLayer"
              textLayerDiv.setAttribute('class', 'textLayer')
              textLayerDiv.setAttribute('style', 'margin:auto;'+'width:'+viewport.width+'px;'+'height:'+viewport.height+'px')
              // 将文本图层div添加至每页pdf的div中
              divBox.appendChild(textLayerDiv)
              // 创建新的TextLayerBuilder实例
              let textLayer = new TextLayerBuilder({
                textLayerDiv: textLayerDiv,
                pageIndex: page.pageIndex,
                viewport: viewport
              })
              textLayer.setTextContent(textContent)
              textLayer.render()
            }
        })
    }
    fileReader.readAsArrayBuffer(file);
},

在渲染pdf数据时,当pdf文件很大渲染量很多时,会导致页面卡住,无法执行其他操作;这涉及到队列优先级问题:
vue+pdf.js插件包打开本地pdf文件,pdf预览,vue,javascript,javascript,vue.js,pdf
在这里就是因为微任务导致,所以我们这里渲染pdf任务可以每次渲染完一页后等待一定时间才执行下一页的渲染,空出时间给主线程

// 将渲染pdf的代码休眠一定时间,留给主线程
sleep(time){
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(time)
    }, time)
  })
},
// 创建一个延时队列的任务 主进程会执行渲染队列任务后在执行延时队列任务等待延时,后再创建渲染pdf下一页的微任务(在循环代码的最后使用)
await that.sleep(100)

在滚动时当前是第几页的页码同步更新展示:需要在渲染每页pdf时将每页的高度存起来,以及每页滚动的临界值

// 每页累加的高度
this.scrollHeight=[0]
// 每页滚动切换值的临界滚动距离
this.scrollHalfHeight=[0]
this.heightAll=0
$(".pdfBody canvas").each(function (i) {
	// 滚动到前一页高度的70%,即页码自动更改为下一页
    that.heightAll+=this.height*that.zoom*0.7
    that.scrollHalfHeight.push(that.heightAll)
    that.heightAll+=this.height*that.zoom*0.3
    that.scrollHeight.push(that.heightAll)
})

在滚动时,根据当前滚动距离和每页滚动的临界距离相比较,判断当前是第几页

pdfScroll(e){
  var pdfBody=document.querySelector(".pdfBody")
  for (let i=0;i<this.scrollHeight.length;i++){
    // 在滚动时,根据当前滚动距离和每页滚动的临界距离相比较,判断当前是第几页
    if(pdfBody.scrollTop>=this.scrollHeight[i]&&pdfBody.scrollTop<this.scrollHeight[i+1]){
      if (this.pdfPage!=i+1){
        this.pdfPage=i+1
      }
    }
  }
}

效果如下
vue+pdf.js插件包打开本地pdf文件,pdf预览,vue,javascript,javascript,vue.js,pdf文章来源地址https://www.toymoban.com/news/detail-810536.html

到了这里,关于vue+pdf.js预览本地pdf文件(可以复制文本,滚动页码展示)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【vue2】纯前端实现本地的pdf/word/epub文件预览

    需求是预览本地的pdf/word/epub格式的文件,但是搜索后发现没有可以直接使用的,格式不同,显示的方式和效果也都略有不同。 最后还是 分别实现预览 的功能。 如果只需要预览pdf/word等格式的话,可以使用的方案:vue-office,支持多种文件(docx、excel、pdf)预览的vue组件库,支持

    2024年02月11日
    浏览(74)
  • 【vue2】纯前端实现本地的pdf/word/epub文件预览(包括pdf选中文字,epub高亮等)

    需求是预览本地的pdf/word/epub格式的文件,但是搜索后发现没有可以直接使用的,格式不同,显示的方式和效果也都略有不同。 最后还是 分别实现预览 的功能。 如果只需要预览pdf/word等格式的话,可以使用的方案:vue-office,支持多种文件(docx、excel、pdf)预览的vue组件库,支持

    2024年02月11日
    浏览(58)
  • 前端(vue)js在线预览PDF、Word、Excel、ppt等office文件

    可选参数 pdf=true,word文档尝试以pdf方式显示,默认false watermark=水印文本,显示文本水印;“img:”+图片url表示图片水印,如:img:https://view.xdocin.com/demo/wm.png saveable=true,是否允许保存源文件,默认false printable=false,是否允许打印,默认true ©able=false,是否允许选择复制内容,

    2024年02月13日
    浏览(69)
  • 前端vue3实现本地及在线文件预览(含pdf/txt/mp3/mp4/docx/xlsx/pptx)

    (一)微软office免费预览( 推荐 ) 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 (二)XDOC文档预览云服务  移动端和PC端无插件预览PDF、OFD、Word、WPS等多种格式文档 本地或内网预览需要借助插件实现,pdf、mp3、mp4等主要靠原生标签或浏览器自带功能,尽量减少

    2024年02月05日
    浏览(71)
  • pdf.js预览pdf文件

    预览pdf一般通过浏览器自带的pdf预览器就可以,但有时候需要窗口预览或自定义操作,可以使用pdf.js操作 pdf.js需要构建后使用,我们可以直接下载安装pdfjs-dist,这是构建好的版本 这里注意你的环境,新版本使用了可选链,空值合并和私有 class 字段/方法等,如果你的浏览器

    2024年02月03日
    浏览(65)
  • 【PDF.js】PDF文件预览

    使用PDFJS实现pdf文件的预览,支持预览指定页、搜索、缩略图、页面尺寸调整等等。 官方地址 文档地址 下载地址 将下载的压缩包解压并放入到项目中的public文件夹下,我这里下载的是pdfjs-4.0.379-dist版本,如下 在 pdfjs-4.0.379-dist/web/viewer.mjs 内搜索 throw new Error(“file or

    2024年04月11日
    浏览(60)
  • 【vue2中的pdf预览】iframe/pdf.js/vue-pdf

    vue2中预览pdf的方法有pdf.js和vue-pdf等。下面进行简单对比使用方法的介绍。 使用iframe预览pdf 如果后端返回的不是url,那么需要使用 responseType = \\\'blob\\\' 来读取后端传来的内容。 扩展: 同样是使用iframe进行预览,如果有 其他格式 如word/xls/ppt/txt的文件需要预览,可以使用微软解

    2024年02月09日
    浏览(51)
  • vue或uniapp使用pdf.js预览

    一、先下载稳定版的pdf.js,可以去官网下载  官网下载地址  或  pdf.js包下载(已配置好,无需修改) 二、下载好的pdf.js文件放在public下静态文件里, uniapp是放在 static下静态文件里 三、使用方式    1. vue项目 注意路径  :src=\\\"`static/pdfjs-1.9/web/viewer.html?file=你的pdf路径  2.

    2024年02月13日
    浏览(41)
  • js实现PDF 预览和文件下载

    在开发过程中要求对 PDF 类型的发票提供 预览 和 下载 功能, PDF 类型文件的来源又包括 H5 移动端 和 PC 端 ,而针对这两个不同端的处理会有些许不同,下文会有所提及。 针对 PDF 预览 的文章不在少数,但似乎都没有提及可能遇到的问题,或是提供对应的具体需求场景下如何

    2024年02月15日
    浏览(47)
  • js下载图片、pdf等文件,无预览

    直接使用window.open()或window.locat.href()下载文件遇到图片或pdf文件就会跳转预览页,不能满足我想要的点击直接下载文件到本地的需求,尝试多次,最终通过以下方法实现了我的需求。 鉴于后端返回的是文件路径,首先要将文件url地址转为文件对象,代码如下: npm install saveA

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包