相关专题链接

PDF解决方案(1)--文件上传

PDF解决方案(2)--文件转PDF

PDF解决方案(3)--PDF转SWF

PDF解决方案(4)--在线浏览

前言:最近参与了一个项目,客户要求把系统所有用户提交的所有电子文件(主要是word、Excel、图片等)都转化为PDF格式保存,并且要能支持在线查看、自动加签(添加图片印章、数字证书)等功能,因为之前也没有接触这方面的知识在项目开发过程中也是遇到了诸多困难,但庆幸的是通过自己研究、百度等方法得到了解决,最后的效果还算令人满意,趁现在项目比较空闲把整个实现方案做个介绍。

一、demo效果图

选择文件提交后,在后台先转成pdf文件,然后再转化为swf文件在前台展示! demo比较简陋,没做太多修饰,主要是为了说明问题,大家不要在意这些细节!demo中用到的部分软件在下面下载区有链接,下载解压放在C盘即可。

二、文件上传

1、前台部分

前台采用form表单、隐藏iframe实现无刷新上传:

js部分代码

  1. <script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
  2. <script type="text/javascript">
  3.  
  4. //支持的文件上传类型
  5. var accept_extend = ['jpg', 'doc', 'docx', 'xls', 'xlsx', 'pdf', 'bmp', 'jpeg', 'png', 'gif'];
  6. var basePath = "<%=basePath%>";
  7.  
  8. /**
  9. * 校验文件扩展名
  10. * @param {Object} t_ext 文件扩展名
  11. * @return {TypeName} 校验是否通过
  12. */
  13. function checkFileExtendName(t_ext)
  14. {
  15. var flag = false;
  16. if (t_ext != '')
  17. {
  18. var length = accept_extend.length;
  19. for (var i = 0; i < length; i++)
  20. {
  21. if (t_ext == accept_extend[i]) flag = true;
  22. }
  23. }
  24. return flag;
  25. }
  26.  
  27. /**
  28. * 文件上传方法
  29. */
  30. function upload()
  31. {
  32. //校验
  33. var file = document.getElementById("file").value;
  34. if(file == undefined || file == null || file == "" )
  35. {
  36. alert("请选择文件!");
  37. return;
  38. }
  39.  
  40. var type = file.slice(file.lastIndexOf('.')+1);
  41. if(!checkFileExtendName(type.toLowerCase()))
  42. {
  43. alert("文件类型不支持!");
  44. return;
  45. }
  46.  
  47. //提交
  48. var form = document.getElementById('upload_form');
  49. form.submit();
  50.  
  51. //提交按钮控制
  52. $('#uploadBtn').attr('disabled', 'disabled');
  53. $('#loading').css('display', '');
  54.  
  55. //获取写入隐藏iframe的上传结果
  56. $("#iframe").load(function ()
  57. {
  58. var contents = $(this).contents().get(0);
  59. var data = $(contents).find('body').html();
  60. data = window.eval('(' + data + ')');
  61. if(data.rtncode == 2000)
  62. {
  63. //上传成功后提示并展示swf区域
  64. alert(data.name + "上传成功!");
  65. $("#iframe_pdf_view").width($('body').width() * 0.97).height($('body').height() * 0.85);
  66. $("#iframe_pdf_view").attr("src", basePath + "fileview.jsp?path=" + data.path);
  67. }
  68. $('#uploadBtn').removeAttr('disabled');
  69. $('#loading').css('display', 'none');
  70.  
  71. $("#iframe").off("load");
  72. });
  73. }
  74.  
  75. </script>

html部分代码

此处需要注意:文件上传时form表单属性enctype="multipart/form-data"后台才能获取文件流,属性target="iframe"需指向隐藏iframe的name才能实现无刷新上传。

  1. <div style="background-color:#BDD8F2;margin-left:40%;margin-top:20px;border-style:double;margin-right:35%">
  2. <div style="margin-top:10px;margin-left:10px">
  3. <!-- from的target需指向隐藏iframe的name -->
  4. <form id="upload_form" action="commonServlet?type=upload" method="post"
  5. enctype="multipart/form-data" target="iframe" >
  6. <input id="file" type="file" name="file" />
  7. <img id="loading" src="data:images/loading.gif" style="display:none">
  8. <input id="uploadBtn" type="button" value="提交" onclick="upload()"/>
  9. </form>
  10. <iframe id="iframe" name="iframe" style="width:0px;height:0px"></iframe>
  11. </div>
  12. </div>
  13. <iframe id="iframe_pdf_view" scrolling="auto" frameborder="0" marginheight="0" marginwidth="0"></iframe>

2、后台代码:

后台使用Apache的fileupload包和IO包来解析请求获取文件流:

  1. PrintWriter out = response.getWriter();
  2.  
  3. // 创建文件处理工厂,它用于生成FileItem对象。
  4. DiskFileItemFactory difactory = new DiskFileItemFactory();
  5.  
  6. // 设置缓存大小,如果上传文件超过缓存大小,将使用临时目录做为缓存。
  7. difactory.setSizeThreshold(1024 * 1024 * 5);
  8. String dir = this.getServletContext().getRealPath("/");//应用目录
  9.  
  10. // 设置处理工厂缓存的临时目录,此目录下的文件需要手动删除。
  11. File filedir = new File(dir + "file/temp");
  12. if (!filedir.exists())
  13. {
  14. filedir.mkdirs();
  15. }
  16. difactory.setRepository(filedir);
  17.  
  18. // 设置文件实际保存的目录
  19. File fudir = new File(dir + "file/upload");
  20. if (!fudir.exists())
  21. {
  22. fudir.mkdirs();
  23. }
  24.  
  25. //创建request的解析器,它会将数据封装到FileItem对象中。
  26. ServletFileUpload sfu = new ServletFileUpload(difactory);
  27. sfu.setHeaderEncoding("GBK");
  28.  
  29. //解析保存在request中的数据并返回list集合
  30. List<FileItem> list = null;
  31. try
  32. {
  33. list = sfu.parseRequest(request);
  34.  
  35. } catch (FileUploadException e)
  36. {
  37. e.printStackTrace();
  38. out.print("{rtncode:2001,message:'" + e.getMessage() + "'}");
  39. out.flush();
  40. out.close();
  41. return;
  42. }
  43. String filename = null;
  44. InputStream in = null;
  45. FileOutputStream fos = null;
  46. if (list != null && list.size() > 0)// 遍历list集合,取出每一个输入项的FileItem对象,并分别获取数据
  47. {
  48. for (Iterator<FileItem> it = list.iterator(); it.hasNext();)
  49. {
  50. FileItem fi = (FileItem) it.next();
  51. if (fi.isFormField())//判断是否为表单属性
  52. {
  53. continue;
  54. }
  55.  
  56. String originalName = fi.getName();//原始文件名
  57. String extendName = originalName.substring(originalName
  58. .lastIndexOf(".") + 1);//获取原始文件扩展名
  59. filename = UUID.randomUUID().toString() + ".pdf";//新文件名
  60.  
  61. //获取上传文件流
  62. in = fi.getInputStream();
  63. String pdfPath = dir + "file/upload/" + filename;//生成的PDF路径
  64. fos = new FileOutputStream(pdfPath);//创建文件输出流
  65.  
  66. //文件转PDF处理
  67. if (Constans.FileExtName.DOC.equalsIgnoreCase(extendName)
  68. || Constans.FileExtName.DOCX
  69. .equalsIgnoreCase(extendName)
  70. || Constans.FileExtName.XLS
  71. .equalsIgnoreCase(extendName)
  72. || Constans.FileExtName.XLSX
  73. .equalsIgnoreCase(extendName))
  74. {
  75. // 调用openoffice转换office文件为PDF并存放到指定目录
  76. PDFUtil.converterOffiec2PDF(in, fos, extendName);
  77. }
  78. else if (Constans.FileExtName.PDF.equalsIgnoreCase(extendName))
  79. {
  80. // 上传pdf文件到指定目录
  81. PDFUtil.uploadPDF(in, fos);
  82. }
  83. else
  84. {
  85. PDFUtil.converterImg2Pdf(in, fos);
  86. }
  87. fi.delete();// 文件删除前需要关闭流
  88.  
  89. //调用swftools转换PDF为swf文件
  90. if(PDFUtil.convert2SWF(pdfPath))
  91. {
  92. out.print("{rtncode:2000,message:'success',name:'"
  93. + originalName.substring(0, originalName
  94. .lastIndexOf(".")) + "',path:'"
  95. + filename.replaceAll(".pdf", ".swf") + "'}");
  96. }
  97. else
  98. {
  99. out.print("{rtncode:2001,message:'error'}");
  100. }
  101. out.flush();
  102. out.close();
  103. }
  104. }
  1.  

相关文件下载地址

PDF解决方案demo: http://pan.baidu.com/s/1i3mmwux

swftools、xpdf:http://pan.baidu.com/s/1dDu1Yoh(注:解压放在C盘根目录即可)

PDF解决方案(1)--文件上传的更多相关文章

  1. Word,Excel,pdf,txt等文件上传并提取内容

    近期项目需求:1.要用到各种文件上传,下载. 2.并对文件进行搜索. 3.仅仅要文件里包括有搜索的内容,所有显示出来. 今天正好有时间整理一下,方便以后阅读,及对须要用到的朋友提供微薄之力.首先在实现 ...

  2. Struts2之文件上传下载

    本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 <!-- 引入struts标签 --> <%@tag ...

  3. springMVC 文件上传 HTTP Status 400 – Bad Request

    可能原因是:multipartResolver没有配置正确 请看解决方案: <!--文件上传 id必须为multipartResolver,不然报错HTTP Status 400 – Bad R ...

  4. java文件上传下载组件

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  5. 超过20g的文件+上传

    demo下载地址:jsp-Eclipse,jsp-MyEclipse,PHP,ASP.NET 教程:ASP.NET,JSP,PHP 一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件 ...

  6. ASP.NET文件上传大小的限制解决方案

    我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.config中的httpRunti ...

  7. SharePoint 2010 ——自定义上传页面与多文件上传解决方案

    最近项目遇到一个很麻烦的问题,原以为很容易解决,结果搞了那么久,先开个头,再慢慢写 SharePoint 2010 ——自定义上传页面与多文件上传解决方案 1.创建Sharepoint空白项目,创建应 ...

  8. Ubuntu本地文件上传至HDFS文件系统出现的乱码问题及解决方案

    1.问题来源及原因 用shell命令上传到HDFS中之后出现中文乱码,在shell命令窗口查看如图: 在eclipse中的文件HDFS查看工具查看如图: 原因:上传至HDFS文件系统的文本文件(这里是 ...

  9. Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python

    Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python 1. 上传的几点要求2 1.1. 本地预览2 1.2 ...

随机推荐

  1. 如何获得 oracle RAC 11g asm spfile S档

     方法一: [root@vmrac1 ~]# su - grid [grid@vmrac1 ~]$ sqlplus / as sysasm SQL*Plus: Release 11.2.0.3.0 ...

  2. WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

    .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制 项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩 ...

  3. CentOS7 安装Hbase集群

    继续接上一章,已安装好Hadoop集群环境 http://www.cnblogs.com/dopeter/p/4612232.html 在此基础上继续安装Hbase集群 Hbase版本为1.0.1.1 ...

  4. MTK6572横屏的调试过程

    电视剧集:系统MTK缺省的系统源代码,Phone模式.底部有三个虚拟按键.需求为,设置成默认横屏,设定一个合理的虚拟按键方案. ------------------------------------ ...

  5. JS数组学习笔记

    原文:JS数组学习笔记 最近在备课数组,发现很多ES5的方法平时很少用到.细节比较多,自己做了大量例子和整理,希望对大家了解JavaScript中的Array有所帮助. 概念 数组是值的有序集合.每个 ...

  6. HDU1068/POJ1466_Girls and Boys(二分图/最大独立集=N-最大匹配)

    解题报告 http://blog.csdn.net/juncoder/article/details/38160591 题目传送门(POJ) 题目传送门(HDU) 题意: 求满足条件的最大集合:集合内 ...

  7. SettingsProvider 它SettingsCache

    转载请注明出处:http://blog.csdn.net/droyon/article/details/35558437 SettingsCache,如指出,SettingsProvider缓冲.这将 ...

  8. 2014ACM/ICPC亚洲区域赛牡丹江站汇总

    球队内线我也总水平,这所学校得到了前所未有的8地方,因为只有两个少年队.因此,我们13并且可以被分配到的地方,因为13和非常大的数目.据领队谁oj在之上a谁去让更多的冠军.我和tyh,sxk,doub ...

  9. 采用Duplicate target database在线恢复秩序oracle datagard图书馆设备

    线上oracle datagard备库由于断电以及误删除从库的归档日志文件,所以导致,备库主库数据不一致,备库须要紧急恢复.以下是大概恢复过程 1,从主库上面备份控制文件[oracle@localho ...

  10. Android通过使用Properties保存配置

    读写功能,如下面分别: import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Proper ...