关于pdf.js在线预览base64格式的实现以及出现的问题

首先我接收到的是后台返回的标准格式的base64 编码流 有png格式的和pdf格式的编码流两种

可以使用base64在线转换工具来查看png和pdf需要加的格式

png : "data:image/png;base64," + 后台返回的数据流;
pdf:"data:application/pdf;base64," + 后台返回的数据流;
使用pdf.js实现base64编码流实现pdf文件的预览

pdf.js官网链接:pdf.js官网下载链接

  • 下载下来后将会有一个build文件夹和web文件夹,然后将这两个文件放在vue的public下面 如下图:
    在这里插入图片描述
  • 在 viewer.js 文件中的 defaultUrl 在这里插入图片描述
  • 修改为下图
    在这里插入图片描述
  • 然后还要在viewer.js.map文件下 搜索 compressed.tracemonkey-pldi-09.pdf 将其改为 DEFAULT_URL 字符串
    在这里插入图片描述
  • 修改为
    在这里插入图片描述
  • 然后在 viewer.html 中将下面代码放里面(记得要放在 viewer.js 之前~)
<script type="text/javascript">
  var DEFAULT_URL = "";
  var pdfUrl = document.location.search.substring(1);
  if(null == pdfUrl || "" == pdfUrl){
      var BASE64_MARKER = ';base64,';//声明文件流编码格式
      var preFileId = "";
      var pdfAsDataUri = sessionStorage.getItem("_imgUrl");//这里就是pdf文件的base64码,我是通过session传递base64的
      var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
      DEFAULT_URL = pdfAsArray;
      //编码转换
      function convertDataURIToBinary(dataURI) {
          //[RFC2045]中有规定:Base64一行不能超过76字符,超过则添加回车换行符。因此需要把base64字段中的换行符,回车符给去掉。
          var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
          var newUrl = dataURI.substring(base64Index).replace(/[\n\r]/g,'');
          var raw = window.atob(newUrl);//这个方法在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;
      }
  }
</script>
  • 请求后端文件流的接口代码,仅供参考,可以根据自己的情况进行相应修改以及相关数据的定义
expressPrint(sheetId){
        this.$http({
        method:'get',
        responseType: 'blob',
        url:'/api' + this.$api.haiyunchukou.yibanshuju.searchBySheetId,
        data:{
          id:sheetId
        },
        success:(res)=>{
          console.log(res);
          if(res.datas.shipprdRemark == 'png'){
            const img = new Image();
            img.src = "data:image/png;base64," + res.datas.sheetFile;
            const newWin = window.open("", "_blank");
            newWin.document.write(img.outerHTML);
            newWin.document.title = "面单"
            newWin.document.close();
          }else if(res.datas.shipprdRemark =='pdf'){
            this.expressVisible = false;
            this.shipprdRemark = res.datas.shipprdRemark;
            sessionStorage.setItem('_imgUrl',"data:application/pdf;base64,"+res.datas.sheetFile);
            window.open("/static/pdf/web/viewer.html");
          }
        },
      })
    },
  • 接下来即为PDF文件的预览方式有一下两种:
  • 一:在需要的位置使用iframe标签引入
    在这里插入图片描述
  • 将后台传给你的base64格式的代码放在本地的sess中
sessionStorage.setItem('_imgUrl',"data:application/pdf;base64,"+res.datas.sheetFile);
  • 二:使用开启新标签的方式进行预览
sessionStorage.setItem('_imgUrl',"data:application/pdf;base64,"+res.datas.sheetFile);
window.open("/static/pdf/web/viewer.html");   
png格式的base64编码流的预览以及导出方法
<div>
  <img :src="expressImg" alt="" style='height:100%;width:100%;'>
</div>

this.expressImg = "data:image/png;base64," + 后台返回的base64编码流;     
  • 新窗口打开图片
  • 获取base64编码流成功的回调函数中调用一下代码
    let hreLocal="";
  	hreLocal = "data:image/png;base64," + res.datas.sheetFile;
    this.downloadByBlob(hreLocal,"面单")    
  • 在成功回调函数后定义一下方法
downloadByBlob(url,name) {
     let image = new Image()
     image.setAttribute('crossOrigin', 'anonymous')
     image.src = url
     image.onload = () => {
       let canvas = document.createElement('canvas')
       canvas.width = image.width
       canvas.height = image.height
       let ctx = canvas.getContext('2d')
      ctx.drawImage(image, 0, 0, image.width, image.height)
      canvas.toBlob((blob) => {
        let url = URL.createObjectURL(blob)
        this.download(url,name)
        // 用完释放URL对象
        URL.revokeObjectURL(url)
      })
    }
  },
 download(href, name) {
   let eleLink = document.createElement('a')
   eleLink.download = name
   eleLink.href = href
   eleLink.click()
   eleLink.remove()
 },

over~

  • 好好工作,不仅仅是为了挣钱~
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PDF.js是一个用于在网页上预览PDF文件的JavaScript库。如果你想使用PDF.js预览base64编码的PDF文件,你可以按照以下步骤进行操作: 1. 首先,你需要将base64编码的PDF数据换为Blob对象。你可以使用atob函数将base64字符串解码为二进制数据,然后使用Blob构造函数将二进制数据换为Blob对象。 2. 接下来,你需要在HTML文件中引入PDF.js的相关脚本和样式表。你可以在https://mozilla.github.io/pdf.js/getting_started/页面上找到相关的资源链接。 3. 在你的HTML文件中创建一个用于显示PDF的容器元素,例如一个div元素。 4. 使用JavaScript代码,通过PDF.js的API加载和显示PDF文件。你可以使用PDFViewerApplication.open方法来加载PDF文件,将Blob对象作为参数传递给该方法。 5. 最后,你可以根据需要自定义PDF预览的样式和功能,例如添加工具栏、翻页等。 请注意,以上步骤只是一个基本的示例,你可能需要根据你的具体需求进行适当的修改和扩展。你可以参考Mozilla开发者网络(MDN)上的PDF.js文档和示例代码,以获取更详细的信息和指导。 #### 引用[.reference_title] - *1* [pdf.js 怎么预览 base64 类型的 pdf 文件](https://blog.csdn.net/kaimo313/article/details/125887227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [使用pdf.js 预览pdf文件(BASE64格式)前端](https://blog.csdn.net/weixin_41668951/article/details/118547632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值