PDF解决方案(1)--文件上传
相关专题链接
前言:最近参与了一个项目,客户要求把系统所有用户提交的所有电子文件(主要是word、Excel、图片等)都转化为PDF格式保存,并且要能支持在线查看、自动加签(添加图片印章、数字证书)等功能,因为之前也没有接触这方面的知识在项目开发过程中也是遇到了诸多困难,但庆幸的是通过自己研究、百度等方法得到了解决,最后的效果还算令人满意,趁现在项目比较空闲把整个实现方案做个介绍。
一、demo效果图
选择文件提交后,在后台先转成pdf文件,然后再转化为swf文件在前台展示! demo比较简陋,没做太多修饰,主要是为了说明问题,大家不要在意这些细节!demo中用到的部分软件在下面下载区有链接,下载解压放在C盘即可。
二、文件上传
1、前台部分
前台采用form表单、隐藏iframe实现无刷新上传:
js部分代码
<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
<script type="text/javascript"> //支持的文件上传类型
var accept_extend = ['jpg', 'doc', 'docx', 'xls', 'xlsx', 'pdf', 'bmp', 'jpeg', 'png', 'gif'];
var basePath = "<%=basePath%>"; /**
* 校验文件扩展名
* @param {Object} t_ext 文件扩展名
* @return {TypeName} 校验是否通过
*/
function checkFileExtendName(t_ext)
{
var flag = false;
if (t_ext != '')
{
var length = accept_extend.length;
for (var i = 0; i < length; i++)
{
if (t_ext == accept_extend[i]) flag = true;
}
}
return flag;
} /**
* 文件上传方法
*/
function upload()
{
//校验
var file = document.getElementById("file").value;
if(file == undefined || file == null || file == "" )
{
alert("请选择文件!");
return;
} var type = file.slice(file.lastIndexOf('.')+1);
if(!checkFileExtendName(type.toLowerCase()))
{
alert("文件类型不支持!");
return;
} //提交
var form = document.getElementById('upload_form');
form.submit(); //提交按钮控制
$('#uploadBtn').attr('disabled', 'disabled');
$('#loading').css('display', ''); //获取写入隐藏iframe的上传结果
$("#iframe").load(function ()
{
var contents = $(this).contents().get(0);
var data = $(contents).find('body').html();
data = window.eval('(' + data + ')');
if(data.rtncode == 2000)
{
//上传成功后提示并展示swf区域
alert(data.name + "上传成功!");
$("#iframe_pdf_view").width($('body').width() * 0.97).height($('body').height() * 0.85);
$("#iframe_pdf_view").attr("src", basePath + "fileview.jsp?path=" + data.path);
}
$('#uploadBtn').removeAttr('disabled');
$('#loading').css('display', 'none'); $("#iframe").off("load");
});
} </script>
html部分代码
此处需要注意:文件上传时form表单属性enctype="multipart/form-data"后台才能获取文件流,属性target="iframe"需指向隐藏iframe的name才能实现无刷新上传。
<div style="background-color:#BDD8F2;margin-left:40%;margin-top:20px;border-style:double;margin-right:35%">
<div style="margin-top:10px;margin-left:10px">
<!-- from的target需指向隐藏iframe的name -->
<form id="upload_form" action="commonServlet?type=upload" method="post"
enctype="multipart/form-data" target="iframe" >
<input id="file" type="file" name="file" />
<img id="loading" src="data:images/loading.gif" style="display:none">
<input id="uploadBtn" type="button" value="提交" onclick="upload()"/>
</form>
<iframe id="iframe" name="iframe" style="width:0px;height:0px"></iframe>
</div>
</div>
<iframe id="iframe_pdf_view" scrolling="auto" frameborder="0" marginheight="0" marginwidth="0"></iframe>
2、后台代码:
后台使用Apache的fileupload包和IO包来解析请求获取文件流:
PrintWriter out = response.getWriter(); // 创建文件处理工厂,它用于生成FileItem对象。
DiskFileItemFactory difactory = new DiskFileItemFactory(); // 设置缓存大小,如果上传文件超过缓存大小,将使用临时目录做为缓存。
difactory.setSizeThreshold(1024 * 1024 * 5);
String dir = this.getServletContext().getRealPath("/");//应用目录 // 设置处理工厂缓存的临时目录,此目录下的文件需要手动删除。
File filedir = new File(dir + "file/temp");
if (!filedir.exists())
{
filedir.mkdirs();
}
difactory.setRepository(filedir); // 设置文件实际保存的目录
File fudir = new File(dir + "file/upload");
if (!fudir.exists())
{
fudir.mkdirs();
} //创建request的解析器,它会将数据封装到FileItem对象中。
ServletFileUpload sfu = new ServletFileUpload(difactory);
sfu.setHeaderEncoding("GBK"); //解析保存在request中的数据并返回list集合
List<FileItem> list = null;
try
{
list = sfu.parseRequest(request); } catch (FileUploadException e)
{
e.printStackTrace();
out.print("{rtncode:2001,message:'" + e.getMessage() + "'}");
out.flush();
out.close();
return;
}
String filename = null;
InputStream in = null;
FileOutputStream fos = null;
if (list != null && list.size() > 0)// 遍历list集合,取出每一个输入项的FileItem对象,并分别获取数据
{
for (Iterator<FileItem> it = list.iterator(); it.hasNext();)
{
FileItem fi = (FileItem) it.next();
if (fi.isFormField())//判断是否为表单属性
{
continue;
} String originalName = fi.getName();//原始文件名
String extendName = originalName.substring(originalName
.lastIndexOf(".") + 1);//获取原始文件扩展名
filename = UUID.randomUUID().toString() + ".pdf";//新文件名 //获取上传文件流
in = fi.getInputStream();
String pdfPath = dir + "file/upload/" + filename;//生成的PDF路径
fos = new FileOutputStream(pdfPath);//创建文件输出流 //文件转PDF处理
if (Constans.FileExtName.DOC.equalsIgnoreCase(extendName)
|| Constans.FileExtName.DOCX
.equalsIgnoreCase(extendName)
|| Constans.FileExtName.XLS
.equalsIgnoreCase(extendName)
|| Constans.FileExtName.XLSX
.equalsIgnoreCase(extendName))
{
// 调用openoffice转换office文件为PDF并存放到指定目录
PDFUtil.converterOffiec2PDF(in, fos, extendName);
}
else if (Constans.FileExtName.PDF.equalsIgnoreCase(extendName))
{
// 上传pdf文件到指定目录
PDFUtil.uploadPDF(in, fos);
}
else
{
PDFUtil.converterImg2Pdf(in, fos);
}
fi.delete();// 文件删除前需要关闭流 //调用swftools转换PDF为swf文件
if(PDFUtil.convert2SWF(pdfPath))
{
out.print("{rtncode:2000,message:'success',name:'"
+ originalName.substring(0, originalName
.lastIndexOf(".")) + "',path:'"
+ filename.replaceAll(".pdf", ".swf") + "'}");
}
else
{
out.print("{rtncode:2001,message:'error'}");
}
out.flush();
out.close();
}
}
相关文件下载地址
PDF解决方案demo: http://pan.baidu.com/s/1i3mmwux
swftools、xpdf:http://pan.baidu.com/s/1dDu1Yoh(注:解压放在C盘根目录即可)
PDF解决方案(1)--文件上传的更多相关文章
- Word,Excel,pdf,txt等文件上传并提取内容
近期项目需求:1.要用到各种文件上传,下载. 2.并对文件进行搜索. 3.仅仅要文件里包括有搜索的内容,所有显示出来. 今天正好有时间整理一下,方便以后阅读,及对须要用到的朋友提供微薄之力.首先在实现 ...
- Struts2之文件上传下载
本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 <!-- 引入struts标签 --> <%@tag ...
- springMVC 文件上传 HTTP Status 400 – Bad Request
可能原因是:multipartResolver没有配置正确 请看解决方案: <!--文件上传 id必须为multipartResolver,不然报错HTTP Status 400 – Bad R ...
- java文件上传下载组件
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
- 超过20g的文件+上传
demo下载地址:jsp-Eclipse,jsp-MyEclipse,PHP,ASP.NET 教程:ASP.NET,JSP,PHP 一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件 ...
- ASP.NET文件上传大小的限制解决方案
我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.config中的httpRunti ...
- SharePoint 2010 ——自定义上传页面与多文件上传解决方案
最近项目遇到一个很麻烦的问题,原以为很容易解决,结果搞了那么久,先开个头,再慢慢写 SharePoint 2010 ——自定义上传页面与多文件上传解决方案 1.创建Sharepoint空白项目,创建应 ...
- Ubuntu本地文件上传至HDFS文件系统出现的乱码问题及解决方案
1.问题来源及原因 用shell命令上传到HDFS中之后出现中文乱码,在shell命令窗口查看如图: 在eclipse中的文件HDFS查看工具查看如图: 原因:上传至HDFS文件系统的文本文件(这里是 ...
- 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 ...
随机推荐
- 移动端 常见问题整理 iOS下的 Fixed + Input 调用键盘的时候fixed无效问题解决方案
使用iScroll时,input等不能输入内容的解决方法 <script> function allowFormsInIscroll(){ [].slice.call(document.q ...
- LinkedBlockingQueue的put,add跟offer的区别(转)
LinkedBlockingQueue的put,add和offer的区别 最近在学习<<Java并发编程实践>>,有很多java.util.concurrent包下的新类.Li ...
- ListView单选的实现总结(转)
今天在智能停车场项目中需要实现PullToRefreshListView的单选功能,考虑到分页,刷新等,以前的实现方式是采用自己维护一个集合保存选中位置的选中状态,但这个方式比较繁琐,今天采用了lis ...
- CSS3图片轮播效果
原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ...
- Kinect的学习笔记发展一Kinect引进和应用
Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...
- 数据库性能监测工具——SQL Server Profiler
使用SQL Server Profiler 进行sql监控需要一些设置: 其他的就是进行分析了~ 清除SQL SERVER缓存 常用的方法: DBCC DROPCLEANBUFFERS 从缓冲池中删除 ...
- malloc,free简单的实现
有关标准库首先简要malloc其原理: 标准库内部通过一个双向链表.管理在堆中动态分配的内存. malloc函数分配内存时会附加若干(一般是12个)字节,存放控制信息. 该信息 ...
- Session or Cookie?是否有必要使用Tomcat等一下Web集装箱Session
Cookie是HTTP协议标准下的存储用户信息的工具.浏览器把用户信息存放到本地的文本文件里. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生).面试官也问过这个 ...
- matlab配置Libsvm 防止备忘录
1 首先我们要下载一个Libsvm 工具箱 其中,这一切都可以被下载到 2 我们解包 我解压在桌面上 住址C:\Users\Administrator\Desktop\libsvm 3打开matlab ...
- c#中 ==与equals有什么区别
对于值类型.引用类型来说比较过程怎样的? using System;using System.Collections.Generic;using System.Text; namespace Cons ...
