相关专题链接

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

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

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

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

前言:最近参与了一个项目,客户要求把系统所有用户提交的所有电子文件(主要是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)--文件上传的更多相关文章

  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. mod_wsgi + pymssql通路SQL Server座

    靠pymssql通路SQL Server时刻,直接地python没有问题的执行.靠mod_wsgi和Apache当部署.所有请求被发现hang然后数据库查询. 通过google查到了答案,感谢goog ...

  2. web自定义炫酷字体

    电脑有已经安装好的字体,但是如果你有特殊需要而要选择其他字体,则需要以下几个步骤 1.寻找适合你的字体 有下面几个站点提供字体下载: www.theleagueofmoveabletype.com w ...

  3. C#名单:一个简单的实现

    C#它配备了一个泛型列表类,在很多情况下,足以.实际应用中遇到.最好的报价C#该链表,包装成自己的阶级需求. 该名单的努力的原则,基本实现探索实施一些简单的方法. 一个.(Node.cs文件)作为一类 ...

  4. twitter接口开发

    前一阵子研究了下twitter接口,发现网上的资料不是很多.遂花了些心血,终于有所收获~ 现在有时间赶紧整理出来便于自己以后查阅,也想帮助有困难的同学们.废话不多说,现在就以最简洁的方式开始了.注意: ...

  5. 深入理解Android View(转)

    做android其实也有一段时间了,我们每个人都会碰到一些这样或那样的问题,碰到问题了就拼命百度,可是发现,我们解决问题的能力并没有提升很多,所以我才有想总结一下我项目中所用过的相关知识,并了解一下A ...

  6. HDU ACM 1068 最大独立集

    意甲冠军:n同学.有些学生将有宿命的男性和女性成为恋人.收集注定要成为爱好者求学生的最大数目不存在. 分析:独立设置,顶点设定图的一个子集,在休闲2不连续: 二分图:最大独立集 = 顶点 - 匹配的最 ...

  7. Java学习之路:ArrayList用法

    1.什么是ArrayList     ArrayList是一个动态数组传奇,使用MSDN声明.那是,Array复杂的版本号,它具有以下优点,例如: 动态的添加和降低元素 实现了ICollection和 ...

  8. .NET中Redis安装部署及使用方法简介

    一Redis服务端以服务方式运行 修改端口压缩文件中配置的是6488 修改密码 修改库的数量 工具配置安装后如下图 二Redis服务端以控制台方式运行 第一步配置本地服务 第二部安装和配置客户端 三C ...

  9. hdu 2141 Can you find it?(二分查找变例)

    Problem Description Give you three sequences of numbers A, B, C, then we give you a number X. Now yo ...

  10. 两个容易被忽略的mysql知识

    原文:两个容易被忽略的mysql知识 为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql ...