uni-app h5微信浏览器 预览和下载pdf

本文介绍如何使用pdf.js预览PDF文件,并针对不同设备提供PDF下载解决方案,包括iOS设备的特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​​​​​​预览offce文件。可以打开 PDF WORD PPT EXCEL 文件 - DCloud 插件市场

一、预览pdf

预览本来使用的是uni-app插件市场的插件,但是这里会使用到插件开发者的服务器,出于安全考虑,就打算用pdf.js来实现预览。

pdf.js这个使用起来是比较简单的,但是因为版本的问题无法打开pdf,一直在报下面截图的错误。

换了一个旧版本之后就好了。无语......

一开始用的是官网的最新版。

下载之后解压,把文件放在static中,文件夹的名字随便取,我这里取的是pdfjs。

 项目的目录级别:

componentsmumu-previewOffcemumu-previewOffce.vue
pagesindex      

index.vue、

IOSDownLoad.vue

static        pdfjs        

/web/viewer.html

在页面中显示,我这里还是用的最上面的插件,只是把这里的链接改成了本地的html文件地址。

pasePdfUrl(url) {
	// 找到对应的pdfjs里的viewer.html文件
	return `./static/pdfjs/web/viewer.html?file=${url}`
},

 pdf.js后面的url,可以是网络地址,也可以是blob。但是如果使用这个插件,url必须是网络地址。我这里是因为赖得写布局了,所以就使用了插件。这样预览就解决了。

二、下载pdf

安卓手机下载直接打开文件地址就可以自动跳转到浏览器下载。

苹果手机不能自动下载,需要我们新建一个页面,让用户在浏览器打开这个页面,然后点击下载按钮下载文件。

1、判断是否是ios,是的话去ios的下载页面,不是就直接打开url。

// pages/index/index

isIos() {
	let u = navigator.userAgent
	let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)

	if (isIOS) {
		return true
	} else {
		return false
	}
},


downLoad() {
	if(this.isIos()){
		uni.navigateTo({
		    url:'/pages/inedx/IOSDownLoad?url='+this.fileUrl
	    })
	}else{
        //直接在浏览器中打开
		window.location.href = this.fileUrl;
	}
}

2、在ios页面中,让用户手动在浏览器打开页面,然后主动点击按钮去下载pdf文件。

// pages/inedx/IOSDownLoad

<template>
	<view>
		<button v-if="!isWeiXin" class="download-btn" type="default" @click="downLoad()">点击下载pdf</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				isWeiXin: true,
				fileUrl:''
			};
		},
		
		onLoad(options) {
			if(options && options.url){
				this.fileUrl = options.url;
				console.log(this.fileUrl)
			}
			
			this.getIsWxClient();
		},
		methods: {
			// 判断是否是微信浏览器
			getIsWxClient() {
				const ua = navigator.userAgent.toLowerCase()

				if (ua.match(/MicroMessenger/i) == 'micromessenger') {
					this.isWeiXin = true;
					uni.showModal({
						title: '提示',
						content: '请点击右上角,在浏览器打开页面。',
						showCancel: false
					});
				} else {
					this.isWeiXin = false
				}
			},

			downLoad() {
				console.log('download')
				uni.showLoading({
					title: "正在请求数据"
				});
				uni.request({
					url: this.fileUrl, //获取文件流的请求路径
					responseType: "arraybuffer",
					success: (response) => {
						uni.hideLoading();
						console.log("response:", response)
						if (!response) {
							uni.showToast({
								title: "下载失败",
								duration: 2000
							});
						}
						let blob = new Blob([response.data]);
						let downloadElement = document.createElement("a");
						let href = window.URL.createObjectURL(blob); //创建下载的链接
						downloadElement.href = href;
						downloadElement.download = '文件.pdf'; //下载后文件名
						document.body.appendChild(downloadElement);
						downloadElement.click(); //点击下载
						uni.showToast({
							title: "下载成功",
							duration: 2000
						});
						document.body.removeChild(downloadElement); //下载完成移除元素
						window.URL.revokeObjectURL(href); //释放掉blob对象

					}
				})
			}
		},
	}
</script>

<style lang="scss">
	.download-btn{
		width:50%;
		background:#3273BD;
		color:#fff;
		margin-top:100rpx;
	}
</style>

### 如何在 UniApp 中设置 web-view 组件的路径 在 UniApp 开发中,`web-view` 是用于加载外部网页的重要组件。为了正确配置其路径并实现功能需求,需遵循以下方式: #### 配置 `web-view` 路径的方法 1. **创建新的页面作为容器** 创建一个新的页面专门用来承载 `web-view` 组件。例如,在项目目录下新建一个名为 `webview` 的文件夹,并在其内部创建必要的 Vue 文件(如 `index.vue`)。该页面的作用是仅展示通过参数传递过来的目标 URL。 2. **注册新页面至 pages.json** 将上述创建的新页面路径添加到项目的 `pages.json` 文件中的 `pages` 数组里。这一步是为了让框架能够识别这个新增加的页面。 ```json { "path": "pages/webview/index", "style": { "navigationBarTitleText": "Web View" } } ``` 3. **编写 webview 页面逻辑** 在 `webview/index.vue` 文件中引入 `<web-view>` 树脂标签来显示目标网站链接。通常情况下会利用路由传参的方式获取要访问的具体网址。 ```html <!-- pages/webview/index.vue --> <template> <web-view :src="url"></web-view> </template> <script> export default { data() { return { url: '' }; }, onLoad(options) { this.url = decodeURIComponent(options.url); // 解码URL以防特殊字符被编码影响正常浏览[^1] } }; </script> ``` 4. **调用导航函数跳转至 webview 页面** 当需要从其他地方触发打开某个特定网页的动作时,可以通过 `uni.navigateTo()` 方法携带所需访问站点的信息完成跳转操作。这里给出了一种基于 Vuex 存储管理状态的例子以便于跨模块间共享数据[^3]。 ```javascript navigateToMineDay(url, type) { if (type === 'webView') { const myurl_ = `${appUrl}/h5/#/pages/Stfj/wxgz_logln/wxgz_login?uid=${this.UserInfo.id}`; // 更新Vuex store里的webViewUrl字段值 this.$store.dispatch('SUpdatewebViewUrl', myurl_); // 延迟执行以确保Store更新完毕后再做下一步动作 setTimeout(() => { uni.navigateTo({ url: '../webview/index?url=' + encodeURIComponent(myurl_) }); }, 0); } else { uni.navigateTo({ url: `${url}` }); } } ``` 注意:对于 iOS 设备而言,由于 Safari 浏览器的安全策略限制了部分 JavaScript API 的可用性,比如直接使用 `window.open()` 函数可能不会生效,因此推荐采用官方文档建议的做法即通过内置组件形式呈现网络资源。 另外如果涉及到 PDF 文档在线预览的需求,则可以考虑借助第三方库如 Mozilla 提供的 pdf.js 来达成目的[^4]。 ```javascript // 加载pdf.js脚本... import * as PdfJs from 'https://mozilla.github.io/pdf.js/build/pdf.min.js'; function loadPdfInWebView(pdfUrl){ fetch(pdfUrl).then(response=>response.arrayBuffer()).then(buffer=>{ PdfJs.getDocument(new Uint8Array(buffer)).promise.then(doc=>{ console.log(`Number of Pages: ${doc.numPages}`); doc.getPage(1).then(page=>{ var scale = window.innerWidth / page.view[2]; var canvas = document.createElement("canvas"); var context = canvas.getContext('2d'); var viewport = page.getViewport({scale}); canvas.width = viewport.width; canvas.height = viewport.height; var renderContext = { canvasContext: context, viewport: viewport }; page.render(renderContext); // Assuming you have a reference to your WebView component. webView.src = canvas.toDataURL(); }) }).catch(err=>console.error(err)); }).catch(err=>console.error(err)); } ``` 以上就是关于如何在 UniApp 应用程序内合理设定以及运用 `web-view` 插件的相关指导说明[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值