当前位置:   article > 正文

uniapp 安卓、IOS、H5、微信小程序实现PDF在线预览_小程序开发 展示pdf

小程序开发 展示pdf

    在使用uniapp开发移动端时,微信开发者工具里webview能正常打开后端接口返回的pdf文件流。正式发布后,在配置了业务域名和服务器域名的前提下,预览pdf文件却只能看到白屏,因此我猜测微信小程序不能通过webview读取文件流。这个想法有问题的话请大家给与指正。

    后来我通过uniapp api将文件下载在临时目录,再调用api打开,实现了微信小程序的预览。但在安卓端会调用安装的WPS打开,如果用户没有安装pdf阅读器,则无法打开,造成了不好的用户体验。因此,手机端我用pdf.js实现在线预览。

    苹果IOS直接使用webview预览pdf。

    h5我刚开始的时候使用webview无法预览。报错: no enabled plugin supports this MIME type。所以h5也使用pdf.js实现在线预览,但是我遇到cors跨域问题。后来采用blob实现了在线预览。

后端的api接口如下:

  1. /**
  2. * @功能:pdf预览
  3. */
  4. @IgnoreAuth
  5. @RequestMapping("/pdf/preview/**")
  6. public void pdfPreviewIframe(HttpServletRequest request, HttpServletResponse response) {
  7. String imgPath = extractPathFromPattern(request);
  8. // 其余处理略
  9. InputStream inputStream = null;
  10. OutputStream outputStream = null;
  11. try {
  12. inputStream = MinioUtil.getMinioFile(imgPath);
  13. outputStream = response.getOutputStream();
  14. response.setContentType("application/pdf; charset=UTF-8");
  15. byte[] buf = new byte[1024];
  16. int len;
  17. while ((len = inputStream.read(buf)) > 0) {
  18. outputStream.write(buf, 0, len);
  19. }
  20. response.flushBuffer();
  21. } catch (Exception e) {
  22. log.error("预览文件失败" + e.getMessage());
  23. } finally {
  24. if (inputStream != null) {
  25. try {
  26. inputStream.close();
  27. } catch (IOException e) {
  28. log.error(e.getMessage(), e);
  29. }
  30. }
  31. if (outputStream != null) {
  32. try {
  33. outputStream.close();
  34. } catch (IOException e) {
  35. log.info("imgPath:{}", imgPath);
  36. log.error(e.getMessage(), e);
  37. }
  38. }
  39. }
  40. }

一、下载pdf.js

http://mozilla.github.io/pdf.js/getting_started

二、解压文件并引入到项目

说明:网上很多案例说,在项目目录下创建hybrid文件夹,把解压后的文件全部放到里面的方式我试了后行不通。

查阅了官方文档,发现是我肤浅了。

必须严格按照上面说是的目录才行。 

在static目录下新建pdfview目录,将解压后的文件拷贝到该目录下。如下图所示:

注释viewer.mjs代码,pdf.js不支持加载跨域文件,会报 “file origin does not match viewer’”错误:

三、 webview内预览pdf

  1. <template>
  2. <view>
  3. <web-view :src="fileUrl"></web-view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. fileUrl: "",
  11. pdfViewUrl: '/static/pdfview/web/viewer.html'
  12. }
  13. },
  14. onLoad(options) {
  15. this.fileUrl = decodeURI(options.fileUrl)
  16. if (!!options.isPdfView) {
  17. this.fileUrl = this.pdfViewUrl + '?file=' + encodeURI(this.fileUrl)
  18. }
  19. },
  20. methods: {
  21. }
  22. }
  23. </script>
  24. <style>
  25. </style>

 四、安卓、微信小程序分别预览

  1. //h5预览pdf
  2. h5PdfView(item) {
  3. uni.showLoading({
  4. title: '加载中...'
  5. })
  6. uni.request({
  7. url: this.baseFileURL + '/pdf/preview/' + item.resourceId,
  8. method: 'POST',
  9. responseType: 'arraybuffer'
  10. }).then(res => {
  11. uni.hideLoading()
  12. let pdfData = res.data
  13. let blob = new Blob([pdfData], {
  14. type: 'application/pdf;charset=UTF-8'
  15. })
  16. pdfData = window.URL.createObjectURL(blob)
  17. this.h5PdfUrl = encodeURIComponent(pdfData)
  18. uni.navigateTo({
  19. url: '/subpages/webview/webview?fileUrl=' + this.h5PdfUrl + "&isPdfView=true",
  20. })
  21. })
  22. },
  23. //pdf预览
  24. pdfView(item) {
  25. item.fileUrl = this.baseFileURL + '/pdf/preview/' + item.resourceId
  26. // #ifdef APP-PLUS
  27. switch (uni.getSystemInfoSync().platform) {
  28. case "android":
  29. console.log("android")
  30. uni.navigateTo({
  31. url: '/subpages/webview/webview?fileUrl=' + encodeURI(item.fileUrl) +
  32. "&isPdfView=true",
  33. })
  34. break;
  35. case "ios":
  36. console.log("ios")
  37. uni.navigateTo({
  38. url: '/subpages/webview/webview?fileUrl=' + encodeURI(item.fileUrl),
  39. })
  40. break;
  41. }
  42. // #endif
  43. // #ifdef H5
  44. this.h5PdfView(item)
  45. // #endif
  46. // #ifdef MP-WEIXIN
  47. let fileName = item.resourceId.substring(item.resourceId.lastIndexOf('/') + 1);
  48. uni.downloadFile({
  49. url: item.fileUrl, //文件地址
  50. filePath: wx.env.USER_DATA_PATH + '/' + fileName,
  51. success: function(res) {
  52. const filePath = res.filePath || res.tempFilePath;
  53. uni.openDocument({
  54. filePath: filePath,
  55. showMenu: false,
  56. success: function(res) {}
  57. });
  58. }
  59. });
  60. // #endif
  61. }

五:预览效果

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

闽ICP备14008679号