Skip to content

uniapp-pdf线上

1、在线链接的pdf文件下载查看

这里我们利用的还是微信提供给我们的openDocument 的方式

之前我们的pdf文件都是在本地下载进行查看的,但是服务器上的在线链接的pdf文件怎么办呢

这里我们可以换个思路:先将文件进行下载,然后再进行预览

接下来我们就在我们的代码之中进行简单的一些实现

需要注意的就是:其实这里有个缺陷,就是通过这种下载再进行预览的方式我们无法进行分享好友,或者分享好友之后我们的文件后缀是缺失的,造成分享或者发送给朋友之后文件的后缀就没了

javascript
按照大多数写法,先下载,再打开即可实现需求

这里是我们的文件的地址

http://localhost:8888/uploads/file/pdf/lin.pdf

image.png

这里我们打印出来看看以后,然后完善一下我们的点击方法,逻辑就是先进行下载本地,然后下载完成以后打开本地的文件夹

image.png

2、小程序pdf下载并预览

javascript
// 小程序pdf下载并预览 
	const topdf = (row) => {
		console.log('查看pdf', row);
		uni.downloadFile({
			url: row.uploadfile, //仅为示例,并非真实的资源
			success: (res) => {
				console.log('下载!!!', res);
				if (res.statusCode === 200) {
					console.log('下载成功', res);
					let filePath = res.tempFilePath;
					console.log(filePath, 'filePath');
					uni.openDocument({
						filePath: filePath,
						showMenu: true,
						fileType: 'pdf', // 指定文件类型为 pdf,根据实际情况修改
						success: function(res) {
							console.log('文件打开成功');
						}
					})
				}
			},
			fail: (res) => {
				console.log(res, wx.env.USER_DATA_PATH, '0')
				wx.showToast({
					title: '下载失败',
					duration: 1000
				})
			}
		});
	}

这里我们尝试一下,ok,我们的功能已经成功实现了!

3、小程序pdfwebview的方式

之前我们的pdf都是利用的微信给我们提供的openDocument的方式,也就是打开文档然后进行查看

接下来我们采用一下微信提供给我们的webview的方式,去查看我们的pdf报告

先来搭建一下我们查看的方式 image.png

新建一个webview文件

我们先在其中建立一些比较简单的一些查看方式,先把我们本地的静态文件拿过来然后试试

javascript
<template>
	<view>
		<web-view :src="webViewUrl" ></web-view>
	</view>
</template>
<script setup>
import { onLoad } from "@dcloudio/uni-app";
import { ref, computed, watchEffect } from 'vue';
import request from '@/utils/request.js'; //接口
import baseURL from '@/utils/config.js'; //公共路径前缀
const webViewUrl=ref('http://localhost:8888/uploads/file/pdf/lin.pdf');
</script>
<style>
</style>

然后完善一下我们页面跳转的方式

javascript
	// 小程序pdf webview 方式查看
	const handleview = (row) => {
		console.log('查看pdf-handleview', row);
		uni.navigateTo({
			url:'/pages/component/webview/webview',
		})
  }

image.png

这里我们发现,我们的pdf由于是流的形式,所以跳过去以后也是一串乱码的方式

blob 流介绍

这里我们看看blob 流的相关知识点,Blob是前端的一个专门用于支持文件操作的二进制对象 ,将二进制数据存储为一个个体的集合,通常是视频,音乐,或者多媒体文件,目的是为了更好的操作二进制数据对象,使用blob构造函数返回一个新的 Blob 对象。blob 的内容由参数数组中给出的值的串联组成,然后再将blob转成路径URL.createObjectURL(blob),再在项目根目录下新建hybrid文件夹,将下载的pdf.js压缩包解压后,复制到hybrid下的html文件夹中,路径拼接好,再通过web-view打开。这种事最简单的实现方式,缺点就是app里无法使用blob函数,因此这个方法无法使用。

这个时候就是代表我们查看的文件是一个二进制流文件,那么这种文件如何查看和处理呢

其实就是比上面的思路多了一点步骤,就是定义响应内容为二进制流形式responseType:'arraybuffer',通过wx.getFileSystemManager().writeFile({}),将下载回来的data写在一个新建的本地文件中,写完后调用wx.openDocument({})实现预览功能。

plain

定义一下静态资源用来存放pdf的界面
viewerUrl: '/static/hybridn/html/web/viewer.html',

pdfjs包下载地址

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

下载完成以后解压,在我们的static静态资源新建一个文件夹解压即可

javascript
更正一下我们的地址

const viewerUrl =ref('/static/pdfjs/web/viewer.html');


完善一下我们的方法
onMounted(() => {
		loadPdf();
	})

	function loadPdf() {
	
		uni.request({
			url: "http://localhost:8888/uploads/file/pdf/lin.pdf",
			method: 'get',
			data: {},
			responseType: 'arraybuffer',
			success: (response) => {
				console.log(response,'resonse');
				if (!response) {
					uni.showToast({
						title: "预览失败",
						duration: 2000
					});
				}
				let pdfData = response.data; //pdfData是后端返回的文件流
				let blob = new Blob([pdfData],{type:"application/pdf;charset=utf-8"});
				let pdfSrc = window.URL.createObjectURL(blob);
				pdfBlobUrl.value = viewerUrl.value++ '?file=' + encodeURIComponent(pdfSrc);
				
			},
			fail: err => {
				console.log(err)
			}
		});
	}

然后我们进行一下查看

javascript
这个时候依然是告诉我们
Blob is not defined

可见我们依然是没有更正过来

需要格外注意的就是:

**微信小程序不支持转为blob**

4、保存pdf


接下来我们实现一下点击我们右侧的保存pdf的按键,然后实现保存到我们本地的功能!

javascript
// 小程序pdf下载
	const handlesave = (row) => {
		uni.downloadFile({
			url: row.uploadfile, //仅为示例,并非真实的资源
			success: (res) => {
				console.log('下载!!!', res);
				if (res.statusCode === 200) {
					console.log('下载成功', res);
					uni.showToast({
						title: '下载成功',
						icon: "none",
						duration:2000,
					});
				}
			},
			fail: (res) => {
				console.log(res, wx.env.USER_DATA_PATH, '0')
				wx.showToast({
					title: '下载失败',
					duration: 1000
				})
			}
		});
	}

接下来我们尝试一下我们的功能试试,点击下载以后可以看到我们已经下载成功了!

image.png

pdf在线预览

uniapp 实现 h5、app 与微信小程序三端 pdf 文件下载和预览功能

手机端有两种方法,使用 renderjs 或者 uniapp 的 api

两者的区别

使用 renderjs 的写法,会提示用户是否下载文件,下载完成后用户需要手动点击下载的文件,才会打开文件

使用 uniapp 的 api 则可以直接下载并直接预览,不需要用户操作

根据场景需求进行选择即可

JS
<template>
<div>
<!-- #ifdef APP-PLUS -->
<button @click="test.exportPDF">预览和下载pdf (renderjs) </button>
<button @click="exportPDF">预览和下载pdf (uniapp api)</button>
<!-- #endif -->
<!-- #ifndef APP-PLUS -->
<button @click="exportPDF">预览和下载pdf</button>
<!-- #endif -->
</div>
</template>

<!-- #ifdef APP-PLUS -->
<script module="test" lang="renderjs">
export default {
methods: {
exportPDF() {
const Url = "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7da443bc-353a-4224-ab27
const a = document.createElement("a")
a.href = Url
a.download = "download"
a.click()
}
}
</script>
<!-- #endif -->

<script>
export default {
methods: {
exportPDF() {
// #ifdef H5
window.open(
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7da443bc-353a-4224-ab27-b98917aa6
)
// #endif
// 微信下载文件需要在微信公众平台>开发>开发管理>服务器域名>downloadFile合法域名>配置
// #ifdef MP-WEIXIN
uni.downloadFile({
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7da443bc-353a-4224-ab27-b98917a
success: res => {
url:
console.log(res)
if (res.statusCode === 200){
// 预览pdf文件
uni.openDocument({
filePath: res.tempFilePath,
showMenu: true,// 右上角菜单,可以进行分享保存pdf
success: function(file) {
console.log("file-success", file)
232
})
// #endif
// #ifdef APP-PLUS
uni.downloadFile({
"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-7da443bc-353a-4224-ab27-b98917a
success: res => {
url:
if (res.statusCode === 200){
// 保存pdf文件至手机,一般安卓端存储路径为:手机存储/dcim/camera文件夹下
uni.saveImageToPhotosAlbum({
	console.log(res)
	filePath:res.tempFilePath,
	success: function() {
	uni.showToast({
	title:"文件已保存至/DCIM/CAMERA文件夹下"
	icon: "none"
})
setTimeout(function() {
// 预览pdf文件
uni.openDocument({
	filePath: res.tempFilePath,
	showMenu: true,
	success: function(file) {
	console.log("file-success", file)
	})
	},1500)
},
fail: function() {
uni.showToast({
	title:"保存失败,请稍后重试!"
	icon: "none"
	22232
})
// #endif
}
</script>

Released under the MIT License.