##PDF整合到项目中的注意事项
这里主要介绍两个PDF展示方案:1.PDF.js 2.falsh 展示 pdf文件

##Flash展示PDF文件

网上有很多pdf的flash展示工具组合,这里主要针对的是FlexPaper+swftools,FlexPaper是一个开源轻量级的文档浏览组件,被设计和比如PDF2SWF库(包含于SWFTools)一起工作,使得在网页上,Adobe Flex以及别的Flash的应用程序中显示和交互PDF文件成为可能。即,使得在没有安装PDF阅读器软件的情况下浏览PDF文件成为可能。
###需要的工具

  • Flexpaper:用于在页面上展现PDF的工具
  • PDF2SWF:用于将PDF转化为swf格式的工具,swf是flash 可以展示的格式之一

###转化流程
SWFTools工具包中的PDF2SWF工具可用来将PDF格式文件转换成SWF格式。使用下面的命令可以将pdf文件转换为swf文件。命令行方式调用

pdf2swf  pdfPath  –o swfPath  –T 9  –f

pdf2swf为pdf2swf二进制命令的绝对路径;pdfpath为要进行转换的PDF文件的绝对路径;swfPath为转换后swf文件的路径;-T 9 用来设定转换的swf版本为9,这样设置是因为某些版本的swf文件并不能用flexpaper正常显示出来;-f,可以使搜索字符高亮显示。

编程实现pdf转化为swf格式

Runtime r = Runtime.getRuntime();	 
  Process p = r.exec("F:/swftools/pdf2swf.exe " + pdfFile.getPath() + " -o  " + swfFile.getPath() + " -f  -T 9 "); //-T 代表flash的版本为9 ,否则可能会出现字符问题 -f是为了支持高亮搜索功能

在上面的例子中本机的pdf2swf程序是在 F:/swftools/pdf2swf.exe,可以根据实际情况调整
###存储过程
把刚刚生成的xx.swf的文件存储到数据库,底层是通过将base64编码后的字符串存储到数据库完成

String pdfString = Pdfutil.PDFToBase64(new File(filePath));//base64转码

###PDF数据的展示功能

首先在工程中需要导入以下三个部分:

Java pdf 打开 java展示pdf_javascript

1.css样式文件

2.flexpaper需要用到的JS文件,expressInstall.swf是用户flash版本过低后,adobe官方的flash版本升级的引导文件

3.FlexPaperViewer.swf是 pdf文档的展示模板文件(即pdf文件的展示窗口,窗口上有一些工具控件比如 搜索框和页码跳转框)

后台代码如下:

public void  getPdf() throws  Exception{
			
			......................//查询参数设置
			
			InputStream input =null;
			OutputStream out =null;
			
			req.setParameter("mongoDBCursor", mongoDBCursor);
			String base64String = ServiceProxy.getDefault().execute(req).getResult();//查询出来的base64的字符串
		
		try{
		    BASE64Decoder decoder = new sun.misc.BASE64Decoder();
		    byte[] decodeBuffer = decoder.decodeBuffer(base64String); 
		 
			response.setStatus(HttpServletResponse.SC_OK);  
			response.setContentType("application/pdf;charset=utf-8");  
			input = new BufferedInputStream( new ByteArrayInputStream(decodeBuffer));  
			byte buffBytes[] = new byte[1024];  
			out =  response.getOutputStream();  
			int read = 0;    
			while ((read = input.read(buffBytes)) != -1) {    
			    out.write(buffBytes, 0, read);    
			}  
			out.flush();   
		}catch(Exception e){
			System.out.println(e.getMessage());
			throw new ServletException("pdf error");
		}finally{
			
			input.close();
			out.close(); 
		}
	
	}

前台

<%@ page language="java" contentType="text/html; charset=UTF-8"
		pageEncoding="UTF-8"%>
	<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
	<html>
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<script type="text/javascript" src="js/ht-local.js"></script>
	<link rel="stylesheet" type="text/css" href="test/flexpaper.css" />
	<script type="text/javascript" src="test/jquery.min.js"></script>
	<script type="text/javascript" src="test/flexpaper.js"></script>
	<script type="text/javascript" src="test/flexpaper_handlers.js"></script>
	</head>
	<body>
	<div style="position: absolute; left: 10px; top: 10px;">
	<input value="${tokenId}" id="token"/>
	
	<div id="documentViewer" class="flexpaper_viewer" style="width:770px;height:500px"></div>

	
	<script type="text/javascript">
		var token =$("#token").val();
		
	  	$('#documentViewer').FlexPaperViewer(
	  			
	            { config : {

	               SWFFile : escape('do?module=sys&action=Test&method=getPdf&tokenId='+token), 请求swf的路径
	                Scale : 0.6,
	                ZoomTransition : 'easeOut',
	                ZoomTime : 0.5,
	                ZoomInterval : 0.2,
	                FitPageOnLoad : false,
	                FitWidthOnLoad : true,
	                FullScreenAsMaxWindow : false,
	                ProgressiveLoading : false,
	                MinZoomSize : 0.2,
	                MaxZoomSize : 5,
	                SearchMatchAll : false,
	                InitViewMode : 'Portrait',
	                RenderingOrder : 'flash',
	                StartAtPage : '',

	                ViewModeToolsVisible : true,
	                ZoomToolsVisible : true,
	                NavToolsVisible : true,
	                CursorToolsVisible : true,
	                SearchToolsVisible : true,
	                WMode : 'window',
	                localeChain: 'en_US'
	            }}
	    );
		</script>
	</div>
	</body>
	</html>

官网的flexPaper的例子有两个问题

  • 可以打印PDF,实际项目不需要这个功能
  • 展示PDF时会有公司Logo的问题

解决上述问题的方式是将官网的FlexPaperViewer.swf替换为网上修改后的FlexPaperViewer.swf的文件,CSDN上就有相应的资源,就可以解决了上述问题。

###展示效果

Java pdf 打开 java展示pdf_javascript_02

##PDFJS的研究使用

PDF.js是一个由HTML5建立的PDF阅读器。依托开源社区驱动和Mozilla实验室的技术支持。目标是建立一个通用的,基于web的解析和渲染PDF文件的平台。对比与Flash展示PDF文件的方案,该方案只要浏览器支持html5技术即可,并不要求浏览器安装pdf的任何插件,完全用Js渲染pdf的展示页面,所以对计算机性能有一定要求。官网上其对主流浏览器的支持性如下图,IE系列最低支持ie9 以上版本


Java pdf 打开 java展示pdf_Java pdf 打开_03

###项目路径

Java pdf 打开 java展示pdf_java_04

如图中所示,要在webContent目录下导入从网上下载的pdf.js的资源包。 ###存储过程 将pdf文件以base64的编码存储到数据库中

###PDF数据的展示功能
展示页面需要导入以下js:

<script type="text/javascript" src="test/jquery.min.js"></script>
	<script type="text/javascript" src="pdf/generic/web/compatibility.js"></script>//用于解决低版本的浏览器的兼容性问题
	<script type="text/javascript" src="pdf/generic/build/pdf.js"></script>
	<script type="text/javascript" src="pdf/generic/build/pdf.worker.js"></script>

页面上:

<button value="viewpdf" id="pdfClick1" />//触发查询的按钮

<iframe id="iframePreview" width='100%' height='900px'  style="border:0px solid red"  ></iframe>//展现pdf的框架

$("#pdfClick1").click(function(){

	var tmpUrl ="pdf/generic/web/viewer.html?file="+encodeURIComponent("/htcdr2/do?module=sys&action=Test&method=getPdf5&tokenId="+"${tokenId}");//对url进行编码,解决url中的特殊字符问题,file= 后的东西为要查询的pdf的路径或url,需要手动指定
	  $("#iframePreview").attr("src", tmpUrl);
})

后台和Flash展示PDF文件的方案一样,同样采用流的方式查询,可以参照上面的代码

###展现效果

同样这里也可以隐藏打印和下载功能

Java pdf 打开 java展示pdf_java web_05

##两者的对比
###PDF.js

  • 优点:不需要浏览器下载Pdf插件,客户电脑不需要任何pdf的环境,开源免费
  • 缺点:导入js文件有点大,导致等待时间可能较长;需要浏览器支持HTML5技术,对低版本浏览器支持度不够;渲染pdf时,需要占用一定的CPU资源

###FLASH展现PDF

  • 优点:对低版本浏览器支持度很高,对计算机性能要求不高
  • 缺点:需要将浏览器安装adobe 的flash 插件,免费版要求pdf的页数最多十页;pdf需要转换成swf格式,才能被flash显示;