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="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包来解析请求获取文件流:

       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();
            }
        }
 

相关文件下载地址

demo: http://pan.baidu.com/s/1i3mmwux

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

PDF在线解决方案(1)--文件上传,布布扣,bubuko.com

时间: 2024-10-10 09:17:02

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

web大文件上传解决方案支持分片断点上传

一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验:支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持断点续传,关闭浏览器或刷新浏览

JS大文件上传解决方案实例代码

需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持断点续传,关闭浏览器或刷新浏览器后仍然能够保留

JavaScript大文件上传解决方案实例代码

一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验:支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持断点续传,关闭浏览器或刷新浏览

Struts2之文件上传下载

本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 1 <!-- 引入struts标签 --> 2 <%@taglib prefix="s" uri="/struts-tags"%> 3 4 <!-- 5 使用struts中的<s:file></s:file>标签来选择文件. 6 设置name属性,则提交后将传递后给后台一个name属性

springMVC 文件上传 HTTP Status 400 – Bad Request

可能原因是:multipartResolver没有配置正确 请看解决方案: <!--文件上传 id必须为multipartResolver,不然报错HTTP Status 400 – Bad Request--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <propert

用openoffice+jodconverter+webuploader+pdf.js实现文件上传、在线预览功能

一.背景 最近公司一个项目要实现一个文件上传以及多文档在线预览的功能,之前一直做无线工具开发的,没有涉及到这些东西.另外项目组缺java开发人员,而且自己也只是一个半吊子前端加小半吊子java开发人员,所以让我一个人先弄个Demo出来瞧瞧.在网上搜索了不少资料,在这里只是整理一下,留作以后查阅. 二.插件以及工具包 1.pdfjs-v1.7.225  前端pdf格式文件的显示组件 2.webuploader-0.1.5  百度的文件上传组件 3.video-js-6.2.5 html5视频播放组

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

相关专题链接: PDF在线解决方案(1)--文件上传 PDF在线解决方案(2)--文件转PDF 前言:上一篇中讲到的文件上传,文件上传在网络上有大量的范例,因为想提供一个完整的解决方案就放上了,仅供参考:这一篇主要介绍一些常用文件转换为PDF的实现. 1.word.excel转pdf 通过百度了解到现在office转换为pdf主要有三种形式:Jacob.JCom.openoffice,前两种方式均依赖windows平台和office软件(其中JCom还需要Acrobat_Pro且已注册),成本很

MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件02-多文件上传

上一篇中,使用客户端jJSAjaxFileUploader插件实现单文件异步上传,本篇实现多文件异步上传. 本篇源码在github,先看效果: ● 上传文件显示进度条. ● 停止上传按钮和关闭缩略图按钮. ● 限制上传文件的类型. ● 限制上传文件的尺寸. ●同时上传多个文件成功后显示缩略图.文件名: ● 点击界面上的删除按钮,界面删除,同步删除文件夹中文件. ● 再点击上传文件,界面追加一行新的缩略图.文件名.删除按钮: □ HomeController 把上传的文件名改成以GUID命名的格式

文件上传大小被限制的解决方案。

修改配置文件Web.config <httpRuntime targetFramework="4.5" maxRequestLength="2147483640" executionTimeout="300" /> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules