java web展示PDF 的方案

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数据的展示功能

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

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上就有相应的资源,就可以解决了上述问题。

展示效果

9h1vmq.png

PDFJS的研究使用

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

9cvxCq.png

项目路径

9gy9pV.png
如图中所示,要在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文件的方案一样,同样采用流的方式查询,可以参照上面的代码

展现效果

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

两者的对比

PDF.js

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

FLASH展现PDF

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

猜你喜欢

转载自blog.csdn.net/whp404/article/details/79547431