微信小程序:打开预览pdf格式文档,及兼容性问题

在开发中有个功能是查看pdf格式的报告,接口返回的链接是以“.pdf "结尾的,查询并实践了一下,在此记录。

方法一:使用微信提供的API先下载文件后展示

wx.downloadFile()参考文档:DownloadTask | 微信开放文档

wx.openDocument()参考文档:DownloadTask | 微信开放文档

需要注意:下载的地址需要配置到下载文件的白名单中,打开文档类型要指定pdf。根据别人查询反馈,在iOS系统中会出现打开文档是API调用成功,但是没有正常显示的情况

 wx.downloadFile({
        url,
        success(res) {
          // console.log("res", res);
          if (res.statusCode === 200) {
            wx.openDocument({
              filePath: res.tempFilePath,
              fileType: "pdf",
            });
          }
        },
        fail(err) {
          // console.log("err", err);
        },
        complete() {
          wx.hideLoading();
        },
      });

方法二:通过web-view直接加载

需要注意:在实践中发现这个方法在安卓系统的小程序中无法打开,iOS系统是可以正常使用的

<web-view src="xxx.pdf"></web-view>

基于以上两种情况。我在开发过程中根据设备的系统坐了区分,安卓的通过方法一展示,其他情况通过web-view展示。获取设备平台方法可使用wx.getDeviceInfo()的platform熟悉。参考文档:Object wx.getDeviceInfo() | 微信开放文档

方法三:使用pdf.js等三方工具

这个方法我没有尝试,在查的时候有提到,我理解就是写一个H5页面,这个页面引入pdf.js,利用API展示PDF文件,再将这个写好的H5通过web-view嵌入到小程序中,后续有时间实践成功再来记录。或者有尝试成功的小伙伴可以来分享一下。

最后还有说通过第三方服务将PDF转换成图片或者H5,再通过web-view加载转换后的内容,没有尝试,效果还未可知。

### 如何在 UniApp 微信小程序中实现 PDF 文件预览 为了实现在 UniApp 中的微信小程序预览 PDF 文件的功能,可以采用 `web-view` 组件加载在线 PDF 查看器的方式。这种方式能够很好地适配不同类型的设备并提供较为流畅的用户体验。 对于直接通过 URL 访问 PDF 文件的情况,在 web-view 中可以直接指定该 URL 进行展示[^1]: ```html <template> <view> <!-- 使用 web-view 加载 pdf --> <web-view :src="pdfUrl"></web-view> </view> </template> <script> export default { data() { return { pdfUrl: 'https://example.com/path/to/your/document.pdf' // 替换成实际的PDF链接 }; } }; </script> ``` 然而当遇到经过代理服务器处理后的请求时(即URL不以`.pdf`结尾),可能会导致部分平台无法正常解析文档内容而出现白屏现象。针对这一情况,建议使用 PDF.js 来解决跨平台兼容性问题,并且还可以借此机会加入更多定制化特性比如添加水印等[^2]。 具体做法如下所示: #### 安装依赖库 首先需要引入 PDF.js 库到项目当中去。可以通过 npm 或者手动下载的形式完成安装操作。这里推荐利用 npm 方式来进行管理以便于后续维护升级工作更加便捷高效。 ```bash npm install pdfjs-dist --save ``` 接着确保已将字体资源也一并打包进来以免发生渲染异常状况: ```javascript import * as pdfjsLib from "pdfjs-dist"; // 导入worker脚本 import { Worker } from "pdfjs-dist/build/pdf.worker.entry"; pdfjsLib.GlobalWorkerOptions.workerSrc = Worker; ``` #### 编写页面逻辑 创建一个新的 Vue 页面用于呈现 PDF 文档视图。在此基础上编写相应的 JavaScript 方法来获取远程文件流数据并通过 canvas 元素绘制每一页的内容图像。 ```html <template> <scroll-view scroll-y class="container"> <canvas v-for="(page, index) in pages" :key="index" :id="'pdf-page-' + (index + 1)" style="width: 100%; height: auto;"></canvas> </scroll-view> </template> <script> import * as pdfjsLib from "pdfjs-dist"; import { getDocument } from "pdfjs-dist"; export default { onLoad(options) { this.loadPdf(options.url); }, methods: { async loadPdf(url) { const loadingTask = getDocument({ url }); const pdf = await loadingTask.promise; let totalPages = pdf.numPages; for (let pageNumber = 1; pageNumber <= totalPages; pageNumber++) { try { const page = await pdf.getPage(pageNumber); const viewport = page.getViewport({ scale: window.innerWidth / page.view[2] }); const canvasId = '#pdf-page-' + pageNumber; const query = uni.createSelectorQuery().in(this.$scope); query.select(canvasId).fields({ node: true, size: true }, res => { if (!res || !res.node) return; const canvas = res.node; const ctx = canvas.getContext('2d'); const renderContext = { canvasContext: ctx, viewport: viewport }; page.render(renderContext); }).exec(); } catch (error) { console.error(`Failed to fetch or render page ${pageNumber}`, error); } } this.pages = Array.from({ length: totalPages }, (_, i) => i + 1); } }, data() { return { pages: [] }; } } </script> <style scoped> .container { padding-top: 20rpx; } /* 添加一些样式调整 */ </style> ``` 上述代码实现了基本的 PDF 预览功能,同时也解决了由于路径格式引起的显示错误问题。如果还需要进一步增强应用的安全性和功能性,则可以在原有基础上继续扩展其他插件或服务端接口的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值