PDF.JS-文件流方式在线展示pdf文件

目前所在项目要求实现在线预览PDF功能,于是百度查了一些资料,借鉴了一些大佬好的想法,特总结下来,供参考。


PDFJS是在线预览PDF的一款神器,官网地址:PDF.js


下载后解压文件,直接拖进项目里就可以:



 

一些其博客说要把viewer.js里面的

  defaultUrl: {
    value: "compressed.tracemonkey-pldi-09.pdf",
    kind: OptionKind.VIEWER
  }

该变量定义置空为:

  defaultUrl: {
    value: "",
    kind: OptionKind.VIEWER
  }

这一步我没有操作最后也实现功能,所以可以操作可以不操作。


这个时候直接ip:端口+路径是能访问到pdf文件的。但是如果需要访问服务器文件的话,需要注意文件地址。

对于服务器文档流,网上网友的博客说的方法把拿到的文件流转化为url地址,然后我调用了后台的文件下载方法,并根据方法转换blob

但是最后出现的pdf,页码和后台实现的页数一样,但是每一页都是空白。所以这个方法以失败告终。

不转换直接文件流当作地址赋值过去的方法也未能实现。


后来在查找网友资料的时候,发现一个网友直接调用接口的方法,

该网友博客文章地址:PDF.JS 解决跨域, 传值,本地路径,IE兼容性 问题_沐风Cc的博客-CSDN博客_pdf.js兼容ie8


于是尝试直接调用之前写好的下载文件的后台方法,(如果你的项目有下载文件的方法,可以尝试直接用接口+参数访问)

$scope.print = function () {
            var fileId="20190511001761600"; 
        	window.open('../Print/web/viewer.html?file=' +encodeURIComponent("/XX-webteam/uploadFileDownload.do?id="+fileId));
  }

此上方法测试可以用于Chrome、Edge 浏览器。


Safari 浏览器中没办法在回调函数里面执行window.open, 原因是safari的安全机制将其阻挡了”。

解决办法:在请求之前先打开一个空白窗口,在请求成功的回调函数里面:如果请求错误不需要开页,则将开的空白窗口关掉;否则修改当前打开空白窗口的location地址 。

	$scope.print = function () {
	   
	   var param = {
	      
	   };
	   //获取当前操作系统参数
	   var _pf=navigator.platform; 
	   //var appVer=navigator.userAgent; 
	   if(_pf.indexOf("Win") > -1){//window系统支持chrome,Edge
		   $remote.post("XXXXXXX.do", param, function (data) {
			      var fileId=data.countMap.FilePath;
			      window.open('../Print/web/viewer.html?file=' +encodeURIComponent("/XX-webteam/XXDownload.do?id="+fileId));
		   }); 
	   }else if(_pf.indexOf("Mac") > -1){mac系统支持safari
		   var winRef = window.open("","_blank");//先打开一个页面
		   $remote.post("XXXXXXX.do", param, function (data) {
			      var fileId=data.countMap.FilePath;
			      if(fileId){
			    	  winRef.location='../Print/web/viewer.html?file=' +encodeURIComponent("/XX-webteam/XXDownload.do?id="+fileId);
			      }else{
			    	  winRef.close();
			      }
		   });
	   }else{
		   $remote.post("XXXXXXX.do", param, function (data) {
			      var fileId=data.countMap.FilePath;
			      window.open('../Print/web/viewer.html?file=' +encodeURIComponent("/XX-webteam/XXDownload.do?id="+fileId));
		   });
	   }
	   
	};

 XXXXXXX.do为后台生成pdf交易,生成交易返回data


到此:文档可以成功预览,本地和服务器部署都可以实现预览。

除了上面给出的一篇博客提示我尝试调用后台下载接口.

还有一篇博客大家可以看下:后台返回文件流,前端实现预览pdf - 简书

UniApp 是一套基于 Vue.js 的跨平台应用开发框架,它允许开发者构建一次,发布到多个平台上,如微信小程序、H5、Android 和 iOS。如果你想通过 UniApp 线上环境提供文件下载功能,可以按照以下步骤操作: 1. **设置服务器**: 首先,你需要将需要下载的文件上传到支持 RESTful API 的服务器,比如 Node.js、Java 或 PHP。 2. **创建API**: 创建一个HTTP GET请求的API,该API应返回文件流或者直接返回文件路径供客户端下载。例如,URL可能是 `/api/download/file?filename=yourfile.pdf`。 3. **调用API**: 在 UniApp 中,你可以使用 `uni.request` 方法向服务器发送下载请求。这是一个示例代码片段: ```javascript async downloadFile() { const response = await uni.request({ url: 'https://yourserver.com/api/download/file?filename=document.pdf', // 替换为你的实际服务器地址 method: 'GET', responseType: 'blob' // 设置响应类型为二进制数据,用于处理文件流 }); if (response.status === 200) { const blob = new Blob([response.data], { type: response.headers['content-type'] }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'document.pdf'; link.click(); } else { console.error('Failed to download file:', response.data); } } ``` 4. **触发下载**: 当从服务器获取到文件后,上述代码会创建一个假链接,并模拟用户点击该链接的行为来触发浏览器的文件下载。 注意:确保服务器端的安全措施已到位,防止恶意下载。此外,如果文件较大,建议分段下载以提高用户体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cookies_token

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值