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 ...
随机推荐
- Androida规划nt打包
1.准备工作 (1)首先安装好ant工具 (2)生成keystore 在jdk的bin文件夹下 输入 keytool -genkey -alias android.keystore -keyalg R ...
- MVC 分离Controllers-Views
将MVC中的Controllers.Model和View分别放到单独的项目中 Model: 新建-项目-Windows-类库 MVCTest.Model Controller:新建-项目-Window ...
- 本人第一个android游戏《新连连看》上架
经过艰苦奋战了几天,本人的第一个android游戏<新连连看>最终完毕了第一个版本号,比較简陋.另一部分功能保留没有开放.等第二个版本号再上.用的libgdx框架.可能不是非常出名,可是本 ...
- 通过管道进行线程间通信:字节流。字符流的用法及API类似
管道流(PipedStream)可以用于不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西. p ...
- MAX2323E - 原理图系列
在本实施例MAX2323E(3.3V)采用LPC1752驱动器. 一.截图 文件备份:sch20110723.7z 版权声明:本文博主原创文章.博客,未经同意不得转载.
- VisualStudio 怎么使用Visual Leak Detector
VisualStudio 怎么使用Visual Leak Detector 那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测 ...
- js中位运算的运用
原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...
- hdu 逆袭指数
Problem Description 这依然是关于高富帅小明曾经的故事—— 尽管身处逆境,但小明一直没有放弃努力,除了搬砖,小明还研究过东方的八卦以及西方的星座,一直试图在命理上找到自己能够逆袭 ...
- 找呀志_使用SQLiteDatabase增删改提供的搜索方法和事务
知识具体解释:http://blog.csdn.net/zhaoyazhi2129/article/details/9026093 MainActivity.java,User.java,BaseDa ...
- TFTP server组态
TFTP server组态 2014-10-31北京海淀区 张俊浩 一.TFTP(Trivial File Transfer Protocol,简单文件传输协议或称小型文件传输协议) 是一种简化的文 ...