uni-app使用pdfjs插件预览pdf文件

pdfjs插件下载地址

pdf.js官方网站下载

效果预览

pdfjs插件效果

用法说明

插件下载下来为 pdfjs-3.6.172-legacy-dist.zip (以3.6.172为例),解压包含 build 和 web 两个文件夹。将这两个文件夹复制到 uni-app项目/hybrid/html 目录下,如下所示:

uni-app-project/
├── hybrid
│	└── html	
│		├── build/
│		│   ├── pdf.js                             - display layer
│		│   ├── pdf.js.map                         - display layer's source map
│		│   ├── pdf.worker.js                      - core layer
│		│   └── pdf.worker.js.map                  - core layer's source map
│		├── web/
│		│   ├── cmaps/                             - character maps (required by core)
│		│   ├── compressed.tracemonkey-pldi-09.pdf - PDF file for testing purposes
│		│   ├── debugger.js                        - helpful debugging features
│		│   ├── images/                            - images for the viewer and annotation icons
│		│   ├── locale/                            - translation files
│		│   ├── viewer.css                         - viewer style sheet
│		│   ├── viewer.html                        - viewer layout
│		│   ├── viewer.js                          - viewer layer
│		│   └── viewer.js.map                      - viewer layer's source map
│		└── LICENSE
├── App.vue
├── manifest.json
├── package.json
├── package-lock.json
├── ...
└── pages.json

创建预览模板页面文件,以pdf-view.vue为例

<template>
  <view>
    <web-view :src="allUrl"></web-view>
  </view>
</template>
 
<script>
  export default {
    data() {
	  return {
	    viewerUrl: '/hybrid/html/web/viewer.html', 
		allUrl: ''
	  }
	},
	onLoad(options) {
		this.allUrl = this.viewerUrl + '?file=' + options.url
	}
  }
</script>

其他页面需要打开pdf文件的地方调用,以按钮点击clickRight()方法为例

clickRight(){
	var param = {
		"fileId":this.fileId
	};
	this.$API.getFileResource(param).then(res => {
		let pdfData = res; //pdfData是后端返回的文件流
		let blob = new Blob([ pdfData], {
			type: 'application/pdf;charset=UTF-8'
		})
		pdfData = window.URL.createObjectURL(blob) //创建预览路径
		this.fileUrl = encodeURIComponent(pdfData)
		uni.navigateTo({
			url: '/pages/pdf/pdf-view?url=' + this.fileUrl
		})
	});
}

前端pdf文件请求方法参考

function requestFile(requestData, resolve, reject) {
	requestData.url = java_server + requestData.url;
	requestData.header = {
		'content-type': 'application/x-www-form-urlencoded',
		'token': localStorage.getItem("token") || ''
	}
	requestData.responseType = 'arraybuffer';//这里记得设置响应数据格式,不然预览的pdf是空白
	uni.showLoading({
		title: '加载中...',
		mask: true
	})
	uni.request(requestData).then(res => {
		if (!res[1]) {
			if (res[0].errMsg == "request:fail") {
				if (needLoadingRequestCount <= 0) {
					uni.hideLoading()
				}
				resolve(res[0] = {
					data: {
						code: '500'
					}
				})
			}
			reject(res[0])
		} else {
			resolve(res[1].data);
			uni.hideLoading();
		}
		throw res[1].data;
	}).catch(
		parmas => {
			// uni.showToast({
			// 	icon: 'none',
			// 	title: "请求后台服务异常"
			// })
			uni.hideLoading()
		}
	)
}

后端服务接口参考

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.*;
import org.apache.commons.io.IOUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLEncoder;

@RequestMapping("/getFileResource")
public void getFileResource(HttpServletRequest request, HttpServletResponse response) {
	HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
		String fileId = httpServletRequest.getParameter("fileId");
		FileDO fileDO = fileService.selectByFileId(fileId);
		String fileUrl = fileDO.getFileUrl();
		String filename = fileDO.getFileName();
		OutputStream os = null;
		Document document = null;
		try {
			String userAgent = request.getHeader("User-Agent");  
		    // 针对IE或者以IE为内核的浏览器:  
		    if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {  
		    	filename = URLEncoder.encode(filename, "UTF-8");  
		    } else {  
		        // 非IE浏览器的处理:  
		    	filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");  
		    }
			response.reset();
			response.setContentType("application/octet-stream;charset=ISO-8859-1");
			response.addHeader("Content-Disposition", "attachment;filename=" + filename + ".pdf");
//			response.setHeader("Access-Control-Allow-Origin", "*");
			// 得到文件二进制封装得到数据,具有通用性
			os = new BufferedOutputStream(response.getOutputStream());
			// 合并pdf
			document = new Document();
			PdfCopy copy = new PdfCopy(document, os);
			document.open();
			copyPage(document, copy, fileUrl);
		} catch (Exception e) {
			log.error("读取pdf文件失败:{}", e);
			throw new RuntimeException("读取pdf文件失败", e);
		} finally {
			if (document != null) {
				document.close();
			}
			IOUtils.closeQuietly(os);
		}
	}
}
	
public static void copyPage(Document document, PdfCopy copy, String fileUrl)throws Exception {
	URL url = new URL(fileUrl);
	PdfReader reader = null;
	try {
		reader = new PdfReader(url);
		int n = reader.getNumberOfPages();// 获得总页码
		for (int j = 1; j <= n; j++) {
			document.newPage();
			PdfImportedPage page = copy.getImportedPage(reader, j);
			copy.addPage(page);
		} 
	} finally {
		if (reader != null) {
			reader.close();
		}
	}
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值