当前位置:   article > 正文

uni-app实现PDF预览功能(避坑看这)_uniapp预览pdf

uniapp预览pdf

目录

前言

一、下载PDF预览相关文件

二、使用步骤


前言

去年就想写一篇关于uni-app的pdf预览功能,拖很久了,补上。


一、下载PDF预览相关文件

二、使用步骤

  • 在  static  文件夹下新建  pdf  文件夹,将解压文件放进  pdf  文件夹下(看网上很多博主把文件夹放在根目录里,我反正之前试到最后始终无法打开预览请求的PDF文件!  避坑 放在  static 文件夹下就没问题了
  • 如图所示:

  •  这里以  demo  演示  pdf   预览效果
  • 新建了一个  index  页面,加了一个  预览PDF  按钮

  • 代码如下:
  1. <template>
  2. <view class="content">
  3. <view class="text-area">
  4. <button @click="previewPdf()">预览PDF</button>
  5. </view>
  6. </view>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. }
  13. },
  14. onLoad() {
  15. },
  16. methods: {
  17. previewPdf(){
  18. console.log('=>点击了预览pdf按钮')
  19. uni.navigateTo({//保留当前页面,跳转到应用内的某个页面
  20. url: '/pages/pdfDemo/pdfView?id='+123456//带参跳转
  21. // url: '/pages/pdfDemo/pdfView'//无参跳转
  22. })
  23. }
  24. }
  25. }
  26. </script>
  27. <style>
  28. .content {
  29. display: flex;
  30. flex-direction: column;
  31. align-items: center;
  32. justify-content: center;
  33. position: absolute;
  34. top: 0;
  35. bottom: 0;
  36. left: 0;
  37. right: 0;
  38. margin: auto;
  39. }
  40. .logo {
  41. height: 200rpx;
  42. width: 200rpx;
  43. margin-top: 200rpx;
  44. margin-left: auto;
  45. margin-right: auto;
  46. margin-bottom: 50rpx;
  47. }
  48. .text-area {
  49. display: flex;
  50. justify-content: center;
  51. }
  52. .title {
  53. font-size: 36rpx;
  54. color: #8f8f94;
  55. }
  56. </style>
  • 新建了一个  pdfView  PDF预览页面 
  •  web-view  是一个 web 浏览器组件,可以用来承载网页的容器,会自动铺满整个页面,这里用它来展示PDF。

  • 安卓模拟器、ios手机浏览器访问截图
  •   

  • 代码如下(  根据业务自行更改  ):

  1. <template>
  2. <view>
  3. <web-view :src="url"></web-view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. url: '',//PDF路径
  11. viewerUrl:'/static/pdf/web/viewer.html',//用来渲染PDF的html
  12. fileUrl:'/static/pdf/web/compressed.tracemonkey-pldi-09.pdf'//pdfjs自带的默认PDF
  13. };
  14. },
  15. onLoad(option) {
  16. console.log('=>进入了PDF预览页面')
  17. console.log('获取的参数=>',option)
  18. if(option.id !=undefined && option.id !='undefined' && option.id !='' && option.id !=null){
  19. this.url =this.viewerUrl+'?file='+encodeURIComponent(this.fileUrl); // encodeURIComponent 函数可把字符串作为 URI 组件进行编码;
  20. //以发起请求的方式获取预览PDF
  21. // uni.request({
  22. // url: '/xxx/xxx/xxx/previewPdf/'+option.id,
  23. // method: 'GET',
  24. // header: { 'Authorization': 'Bearer ' + uni.getStorageSync('Admin-Token') },//自定义请求头
  25. // responseType: 'arraybuffer',
  26. // success: (res) => {
  27. // let blob = new Blob([res.data],{type:'application/pdf;chartset=UTF-8'});//转换blob数据类型
  28. // let href = URL.createObjectURL(blob);
  29. // this.url =this.viewerUrl+'?file='+encodeURIComponent(href);// encodeURIComponent 函数可把字符串作为 URI 组件进行编码;
  30. // },
  31. // });
  32. console.log('PDF预览成功=>')
  33. }else{//无参就不预览PDF
  34. uni.showModal({//弹出提示
  35. title:'系统提示',//提示的标题
  36. content: '参数无效',//提示的内容
  37. confirmText:'返回',//取消按钮的文字,默认为"取消"
  38. showCancel:false,//是否显示取消按钮,默认为 true
  39. success: (res) => {
  40. if (res.confirm) {//监听弹窗返回按钮
  41. uni.navigateBack();//返回上一页
  42. }
  43. }
  44. });
  45. }
  46. },
  47. methods: {
  48. }
  49. }
  50. </script>
  51. <style>
  52. </style>
  1. @GetMapping("/previewPdf/{id}")
  2. public void previewPdf(@PathVariable("id") String id) {}
  •  返回文件流(Java)
  1. /**
  2. * pdf预览
  3. * @author luvJie-7c
  4. * @date 2022-8-5 17:31
  5. * @param fileName 文件名
  6. * @param path 文件路径
  7. * @return void
  8. */
  9. public static String previewPdf(String fileName, String path){
  10. //获取HttpServletResponse (静态自创建)
  11. HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
  12. // 验证该文件是否是存在
  13. if(new File(path).exists()){
  14. //添加跨域访问
  15. response.setHeader("Access-Control-Allow-Origin", "*");
  16. //以流的形式传输
  17. response.setContentType("application/octet-stream");
  18. // 设置文件流编码格式
  19. response.setCharacterEncoding("UTF-8");
  20. //Content-Disposition属性名 (attachment表示以附件的方式下载;inline表示在页面内打开)
  21. response.setHeader("Content-Disposition", "attachment; fileName="+fileName+".pdf");
  22. try { //输入输出
  23. FileInputStream is = new FileInputStream(path);
  24. ServletOutputStream out = response.getOutputStream();
  25. byte[] buffer = new byte[1024];
  26. int i = 0;
  27. while ((i = is.read(buffer)) != -1) {
  28. out.write(buffer,0,i);
  29. }
  30. //缓存区的数据进行输出
  31. out.flush();
  32. //关闭流
  33. out.close();
  34. is.close();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/608995
推荐阅读
相关标签
  

闽ICP备14008679号