Java项目开发PDF在线浏览/预览功能完整流程和代码(基于pdf.js实战demo)

16 篇文章 0 订阅
11 篇文章 0 订阅

前言
项目中使用到了PDF在线浏览功能,故记录下来,供大家参考。

开发步骤:
1、下载pdf.js插件包
到官网下载 pdf.js 插件并解压 (地址: http://mozilla.github.io/pdf.js/ )

 

点下载

 

下载后得到一个压缩包,解压

将解压后的文件名称修改为 pdfJs (也可直接用上面的名称 pdfjs-2.0.943-dist)

2、项目中PDF功能开发
1)将pdfJs文件夹放到项目js路径中,比如我的放在 WebContent/scripts/pdfJs

2)添加页面触发在线浏览PDF按钮事件,点击查看按钮,会打开一个在线PDF的预览页面

 

在线浏览效果:

 

3)点击浏览之后,新打开一个PDF在线浏览窗口:
js代码:

function viewPdfDocument(pdfname,userEmail){debugger;

     if(userEmail!=""&&userEmail!=undefined&&userEmail!=null&&userEmail!=" "){
    	
    	 window.open(basePath+"/scripts/pdfJs/web/viewer.html?file="
    			 +encodeURIComponent(basePath+"/quick/pdfStreamHandeler.do?fileName="+ pdfname +".pdf"));
     }else{
    	 //layer.msg("请先登录");
    	 // 判断是否登录
         // 没有登录则打开登录弹窗
    	 //$("#login-layer").find("input[type='hidden']").val(callbackUrl);
    	 console.log("callbackUrl=="+callbackUrl);
    	 $("#login-layer #callbackUrlPath").val(callbackUrl);
    	 $("#login-layer #callbackUrlPath2").val(callbackUrl);
         layer.open({
           type: 1,
           title: '登录',
           area: ['350px', '380px'],
           skin: 'layui-gray',
           shadeClose: true,
           content: $('#login-layer'),
           success: function (layero, index) { 
        	   $().layer_drag();
           }
         });
     }
}

前端的核心代码就这一行:

window.open(basePath+"/scripts/pdfJs/web/viewer.html?file="
    			 +encodeURIComponent(basePath+"/quick/pdfStreamHandeler.do?fileName="+ pdfname +".pdf"));

window.open(url):打开一个新的窗口
其中,

  • "/scripts/pdfJs/web/viewer.html?file="是默认固定访问路径,viewer.html页面pdf.js插件自带默认访问的页面,后面接一个参数file表示文件路径文件流
  • "/quick/pdfStreamHandeler.do?fileName="+ pdfname +".pdf",请求到Java后端获取PDF文件流。
  • encodeURIComponent:是对请求路径进行编码,反正Java后端不能识别特殊字符,因为pdfname可能存在中文空格、括号之类的

这样代码就能在线浏览后端提供给这个页面的PDF文件流。

注:如果PDF文件是这直接放在项目代码里的,比如放在resources目录下的话,就可以直接提供pdf的文件文件项目路径给这个file参数即可。如果是放在D盘之类的文件路径或是通过调用接口获得PDF的,是不能这放在file参数后面的,要读取为文件流然后传给file参数。

 

encodeURIComponent(basePath+"/quick/pdfStreamHandeler.do?fileName="+ pdfname +".pdf"),请求到Java后端controller获取PDF文件流。


4)Java后端PDF文件流获取.
后端Java全部核心代码就这个方法,获取到PDF的流即可:

/**
	 * 预览pdf文件,获取PDF需要浏览的PDF文件流
	 * @author chunlynn
	 * @param request
	 * @param response
	 * @param fileName
	 */
	@RequestMapping(value = "/pdfStreamHandeler", method = RequestMethod.GET)
	public void pdfStreamHandeler(HttpServletRequest request, HttpServletResponse response, String fileName) {

		String urlPath = "";
		response.reset();
		response.setContentType("application/octet-stream");
		response.setCharacterEncoding("utf-8");
		response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
		byte[] buff = new byte[1024];
		BufferedInputStream bis = null;
		OutputStream os = null;
		try {
			logger.debug("==================pdf处理开始==================");
			//写入操作日志start-------------------
			User user = (User) request.getSession().getAttribute("LOGON_USER");
			ProductOperLog log = new ProductOperLog();
			log.setUserId(user.getId());
			log.setFileName(fileName);
			logger.debug("==================操作日志记录start==================");
			switch (fileName) {
			case "zlyjjb.pdf": {
				urlPath = dataCenterURIPdf + pdfurl_zlyjjb + URLEncoder.encode(pdfurl_zlyjjb_name, "UTF-8") + ".pdf?"
						+ "access_token=" + TokenSingleton.getInstance().getAccessToken();
				logger.debug("==================pdf处理拼接路径1,urlPath==" + urlPath);
				log.setOperIndex((short) 0);
				break;
			}
			case "zzjgzlfxbg.pdf": {
				urlPath = dataCenterURIPdf + pdfurl_zzjgzlfxbg + URLEncoder.encode(pdfurl_zzjgzlfxbg_name, "UTF-8")
						+ ".pdf?" + "access_token=" + TokenSingleton.getInstance().getAccessToken();
				logger.debug("==================pdf处理拼接路径2,urlPath==" + urlPath);
				log.setOperIndex((short) 1);
				break;
			}
			}
			log.setOperType((short) 0);
			productOperLogManageService.saveProductLog(log);
			//写入操作日志 end--------------------

			System.out.println("请求PDF路径:" + urlPath);
			os = response.getOutputStream();
              //获得PDF文件流,核心代码
			InputStream is = HttpUtil.getInputStream(urlPath);
			System.out.println("获取流结束。。。。");
			bis = new BufferedInputStream(is);
			int i = 0;
			while ((i = bis.read(buff)) != -1) {
				os.write(buff, 0, i);
				os.flush();
			}

		} catch (Exception e) {
			logger.error("pdf处理出现异常:" + e.getMessage() + "; ");
			
		} finally {
			try {
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

核心代码:

@RequestMapping(value = "/pdfStreamHandeler", method = RequestMethod.GET)
	public void pdfStreamHandeler(HttpServletRequest request, HttpServletResponse response, String fileName) {

		String urlPath = "";
		response.reset();
		response.setContentType("application/octet-stream");
		response.setCharacterEncoding("utf-8");
		response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
		byte[] buff = new byte[1024];
		BufferedInputStream bis = null;
		OutputStream os = null;
		try {
			logger.debug("==================pdf处理开始==================");
			urlPath = dataCenterURIPdf + pdfurl_zlyjjb + URLEncoder.encode(pdfurl_zlyjjb_name, "UTF-8") + ".pdf?"
						+ "access_token=" + TokenSingleton.getInstance().getAccessToken();
			logger.debug("==================pdf处理拼接路径1,urlPath==" + urlPath);
	

			System.out.println("请求PDF路径:" + urlPath);
			os = response.getOutputStream();
            //获得PDF文件流
			InputStream is = HttpUtil.getInputStream(urlPath);
			System.out.println("获取流结束。。。。");
			bis = new BufferedInputStream(is);
			int i = 0;
			while ((i = bis.read(buff)) != -1) {
				os.write(buff, 0, i);
				os.flush();
			}

		} catch (Exception e) {
			logger.error("pdf处理出现异常:" + e.getMessage() + "; ");
		} finally {
			try {
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

后端Java的controller获取到PDF文件流后,写回到Response里去了,页面上就能响应PDF流,然后预览PDF了。
浏览效果:

 

整个前后端代码过程介绍完成。

如果对你有帮助,可以打赏一下哈,谢谢,左侧栏目“关于我”有微信赞赏二维码。赞赏时可以留言留下QQ或微信加好友(可以提供在线指导)。

 

本文为博主chunlynn原创,转载请注明出处https://blog.csdn.net/chenchunlin526/article/details/83269416

 

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: pdf.js是一款功能强大的JavaScript库,可用于在网页上展示PDF文档pdf.js允许开发者在所有现代浏览器上直接嵌入PDF文件,而无需使用第三方插件。这样一来,用户可以在不离开网页的情况下浏览和阅读PDF文档pdf.js附带了一个demo,可以帮助开发者了解和体验pdf.js功能demo提供了各种不同的示例,展示了不同的PDF文档在网页上的显示效果。开发者可以使用demo中的代码作为起点,进一步定制和集成pdf.js到自己的网页应用中。 demo中的示例包括基本的PDF展示、缩放、翻页和搜索功能。用户可以通过demo来体验在不同浏览器和设备上加载和浏览PDF文档的效果。此外,demo还提供了一些高级功能,比如延迟渲染、打印、导出和书签功能,以及在网页上查看多个PDF文件的选项。 使用pdf.js demo开发者可以快速入门并了解pdf.js的核心功能。通过查看demo中的代码文档开发者可以学习如何使用pdf.js库创建自定义的PDF浏览器。pdf.js demo开发者提供了一个学习和实践的平台,帮助他们更好地理解和应用pdf.js库。 总而言之,pdf.js demo是一个方便的工具,提供了一个交互式的环境来学习和测试pdf.js功能。无论是初学者还是有经验的开发者,都可以通过pdf.js demo来提升对pdf.js的理解和应用能力。 ### 回答2: pdf.js demo 是一个开源的基于 JavaScript 的 PDF 阅读器库,它使用 HTML5 技术来在网页上显示和加载 PDF 文档。使用 pdf.js demo,你可以在不需要安装第三方插件的情况下,在网页上直接查看浏览 PDF 文件。 pdf.js demo 提供了一个简单易用的 API,能够方便地在网页上加载和显示 PDF 文件。它支持多种功能,如缩放、旋转、滚动和搜索等等。你可以使用这些功能来快速定位和查找 PDF 文档中的内容,方便用户进行阅读和导航。 pdf.js demo 的优势之一是它的兼容性很好。它不需要任何浏览插件的支持,只需要使用现代浏览器即可完美运行。这使得你在不同平台和设备上都可以无障碍地查看和访问 PDF 文档pdf.js demo 也具有高度的可定制性。你可以根据自己的需求来定制页面的展示效果和交互方式。如果你是一位开发者,你还可以直接访问源代码来进行更深入的定制和扩展。 总之,pdf.js demo 是一个强大而且方便的 PDF 阅读器库,它能够帮助你在网页上实现高效的 PDF 查看和阅读功能。无论你是需要在网站上显示 PDF 文档,还是需要开发自己的 PDF 阅读器应用程序,pdf.js demo 都是一个很好的选择。 ### 回答3: pdf.js demo是一个用于显示和渲染PDF文件的开源JavaScript库。它可以通过在网页上嵌入PDF文件,让用户直接在浏览器中查看浏览PDF文档,而无需安装任何PDF阅读器插件。 使用pdf.js demo可以实现许多功能,比如展示PDF页面、搜索文本、放大和缩小页面、旋转页面等。用户可以通过点击页面、拖动页面滚动条来浏览整个文档pdf.js demo还提供了一些实用的工具栏,例如缩放按钮、旋转按钮、搜索框、前进和后退按钮等,让用户可以更方便地浏览文档pdf.js demo的一个重要优点是它与现代浏览器兼容性良好,并且可以在不同平台上运行,例如Windows、Mac和Linux。此外,pdf.js demo支持多种语言,可以根据用户的地区设置自动切换显示语言。 使用pdf.js demo还能够加强文档的安全性。通过在服务器端嵌入水印、禁止复制和打印等措施,可以防止文档被非法下载和修改。 总而言之,pdf.js demo是一个非常实用的工具,可以实现在浏览器中查看浏览和管理PDF文档功能。它的易用性、兼容性和安全性使其成为很多网站和应用程序的首选解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值