pdf.js可以通过链接和流的方式展示pdf,由于后台接口不想保存缓存文件生成链接,直接返回流的方式在pdf.js中展示,链接比较方便简单,但是流的方式相对就比较繁琐。

项目中vue->html大概流程:

vue通过html模板参数调用pdf生成接口->返回pdf流传参给pdf.js->pdf.js解析展示。

起初的实现方式sessionStore保存pdf流:

vue中通过sessionStore保存返回的pdf流数据,在pdf.js中获取然后解析。实现结果是可以的,但是存在一个sessionStore存储大小5M限制问题,如果后台返回的流大于5M,就不能正常显示。

间接实现方式sessionStore保存pdf生成参数:

通过sessionStore传入生成pdf的参数(html code),在pdf.js中调用接口返回流并解析展示pdf。该实现方式同样存在生成的pdf参数大于5M的情况,尤其是参数中如果嵌入图片就难免会大于5M(生成pdf的参数主要是html,如果带图片类的,仍然会>5M,但是如果不是这种形式,其实是可以采用这种方式)。

通过vuex共享方式,由于涉及到pdfview.html 原生的js,因此需要嵌入的和改造的比较多,也不知道是否会存在其他影像,因此放弃。

最终方式通过postMessage传参的方式:

// vue 代码
// 获取pdf.js 嵌入的iframelet pdfViewerFrame = document.getElementById("pdfViewer");let _pdfViewerFrame = document.getElementById("pdfViewer").contentWindow;axios.post('获取pdf的接口url'// 生成pdf的参数数据{ data: this.jsonData, thtml: this.elHtmlCode },{}).then((res) => {// 注释部分为原有实现方式//sessionStorage.setItem("pdfData", res.data.content.filedata);pdfViewerFrame.src = "./pdfjs/web/pdfviewer.html";// 防治异步未加载成功pdfViewerFrame.onload = function(){// 加载成功后传递pdf base64数据_pdfViewerFrame.postMessage(res.data.content.filedata, '*');};}).catch(function (error) {console.log(error);});
      // pdfjs pdfviewer.html中部分代码var DEFAULT_URL = "";var BASE64_MARKER = ';base64,';//声明文件流编码格式var preFileId = "";var pdfAsDataUri;var pdfAsArray;// 监听获取postMessage中的参数window.addEventListener("message", function(event){// pdf数据 base64(没有base64前缀)var data = event.data;this.pdfAsDataUri = data;this.pdfAsArray = convertDataURIToBinary(pdfAsDataUri);this.DEFAULT_URL = pdfAsArray;console.log(DEFAULT_URL)// viewer.js用于渲染pdf数据的,默认读取DEFAULT_URL,如果初始化时DEFAULT_URL没有数据则渲染会失败,这里存在异步的问题,因此需要改为动态加载viewer.jsvar head = document.getElementsByTagName('head')[0];var script = document.createElement('script');script.src = "viewer.js";script.type = 'text/javascript';head.appendChild(script);});// pdf流数据转换function convertDataURIToBinary(dataURI) { //编码转换var raw = window.atob(dataURI);//这个方法在ie内核下无法正常解析。var rawLength = raw.length;//转换成pdf.js能直接解析的Uint8Array类型var array = new Uint8Array(new ArrayBuffer(rawLength));for (i = 0; i < rawLength; i++) {array[i] = raw.charCodeAt(i) & 0xff;}return array;}

关键的几点:

  1. 调用postMessage的方法对象是_pdfViewerFrame,而非pdfViewerFrame,这里有些文章使用的对象错误,因此无法传参成功。
  2. “pdfViewerFrame.onload” 作用是iframe加载后再调用postMessage,防止异步向iframe子页面传参失败。
  3. pdfviewer.html中“viewer.js” 动态加载,使用动态加载是因为viewer.js是用来渲染pdf的,起初iframe加载pdfviewer.html是没有pdf数据,是无法渲染的,因此需要在获取到解析后的pdf数据后再渲染,也就是再加载viewer.js 才能渲染出pdf。

至此pdf通过流数据方式的展示不再受大小限制了。

Vue中使用pdf.js通过流的方式传参给pdfviewer.html相关推荐

  1. vue中使用pdf.js插件打包后不显示插件及打包后动态修改接口地址

    最近写了一个项目 需要在线展示pdf 实现方法是下载该插件并解压放到 static文件夹中 地址:http://mozilla.github.io/pdf.js/ 我在项目中使用iframe嵌套的方式 ...

  2. vue从后台获取新数据后刷新_vue传参页面刷新数据丢失问题

    在做vue的时候,经常会遇到组件之间数据的传递问题,通过params或者query传参,但是,当页面刷新的时候,数据会丢失,找不到数据.今天经过总结,解决了这个问题.通过了一下几种情况进行传值: 通过 ...

  3. Vue项目中利用pdf.js实现pdf内容滑选文字展示与搜索功能

    Vue项目中利用pdf.js实现pdf内容滑选文字展示与搜索功能 需求:在pdf中鼠标滑动选中一段文字,将选中文字展示到input框中(pdf在iframe中) 完成效果: 关于pdf的引用:我是直接 ...

  4. vue 中展示PDF内容

    vue 中展示PDF内容 不久前有个需要改的需求,以前是直接根据链接让用户下载对应pdf文件来查看,最主要是给用户查看,然而这种并不是很安全的,其他用户可以进行下载或者使用pdf链接分享给其他人,所以 ...

  5. 前端vue项目(使用pdf.js) pdf展示及pdf工具栏放大缩小功能实现

    前端vue项目(使用pdf.js) pdf展示及pdf工具栏放大缩小功能实现 1.vue项目pdf展示 2.pdf工具栏放大缩小功能 文章目录 前端vue项目(使用pdf.js) pdf展示及pdf工 ...

  6. vue里使用pdf.js实现pdf文件的预览功能

    引言:经过上一篇文章的测试,发现了以下问题: 兼容性不好 不适用多语言场景(不能共用一套) 会出现跨域问题 难于监控阅读状态 不能控制下载状态 在基于vue开发的移动项目中,如果预览的pdf数量不是很 ...

  7. SpringBoot+Vue+Itext实现前端请求文件流的方式导出PDF时在指定位置添加照片

    场景 SpringBoot+Vue+Itext实现前端请求文件流的方式下载PDF: SpringBoot+Vue+Itext实现前端请求文件流的方式下载PDF_BADAO_LIUMANG_QIZHI的 ...

  8. vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件

    昔登铜井望法华,葱茏螺黛浮蒹葭.今登法华望铜井,湖水迷茫烟色瞑.-- <登法华寺山顶> Proxy是什么 Proxy是JS标准内置对象中的一个对象.用于创建一个对象的代理.从而实现对对象操 ...

  9. vue中config/index.js:配置的详细理解

    当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面  (环境变量及其基本变量的配置) 1 2 3 4 5 6 7 8 9 10 11 12 ...

  10. vue中解决three.js出现内存泄漏丢失上下文问题

    vue中解决three.js出现内存泄漏丢失上下文问题 参考文章: (1)vue中解决three.js出现内存泄漏丢失上下文问题 (2)https://www.cnblogs.com/lichuank ...

最新文章

  1. IDEA里运行代码时出现Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger的解决办法(图文详解)...
  2. 菜鸟教程:SQL 通用数据类型
  3. 1.11 双向循环神经网络-深度学习第五课《序列模型》-Stanford吴恩达教授
  4. 《计算机组成与设计(ARM版)》读书笔记-第二章指令2
  5. html5如何划分区域,10.4 51单片机 RAM 区域的划分
  6. 阿里云边缘计算与云边端协同网络的融合与挑战
  7. java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....
  8. pandas从dataframe中选择部分行、列
  9. FinalData磁盘文件恢复工具(绿色破解版)
  10. 图论(graph)相关算法总结
  11. id在python中是什么意思_Python中的id函数是什么意思
  12. 面向对象:让我们红尘作伴,吃的白白胖胖
  13. PC屏幕颜色识别实现鼠标自动点击
  14. Number isFinite()方法
  15. Ajax请求URL的写法
  16. iOS-建设银行破解分享
  17. 核密度估计(Kernel Density Estimation)和累积分布函数 (Cumulative Distribution Function)
  18. 3D模型欣赏:眼球 眼睛 写实
  19. java查询日期类的表,JAVA菜鸟入门篇 - 时间处理相关类实例:打印该月日期表 (29)...
  20. linux `uname -r`作用

热门文章

  1. 基于java的铁路售票系统(火车票预订)ssh框架
  2. 【Java视频教程等百度云资源分享】
  3. 视频教程-CCNA视频----从零开始学CCNA实验视频课程(加强版)-思科认证
  4. 山东烟建借沟通CTBS实现财务数据大集中
  5. WINDOWS自带md5校验工具
  6. android视频播放器排行榜,安卓视频播放器哪个好 五款主流视频播放器对比
  7. java opencv 打开图片路径_Java 调用 OpenCV (可获取到图像)
  8. 数字图像处理复习记录(一)图像平滑、图像锐化、间隔检测
  9. 项目管理概论【项目管理基础-第一章 项目与项目管理】
  10. 2019校招开发岗面试题总结(Java后台开发)