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

相关专题连接

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

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

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

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

前言:上一篇中介绍了上传的文件转PDF,主要是一些经常使用的文档格式转换为PDF;这一篇主要介绍如何把PDF转换为SWF,为下一步文件在线浏览作准备;linux

PDF在线浏览的主要如下几种方式:windows

一、PDF浏览器插件浏览器

这种方式依赖PDF阅读器厂商提供的浏览器插件,主流的PDF阅读器如Adobe、福昕在安装本地客户端的时候都会附带安装这种控件,直接把本地的PDF文件拖到浏览器便可看到效果,以下:工具

 image image

image 

如上图所示,不一样阅读器的插件功能差别较大,不一样的浏览器效果也有不一样,没法保证有一个统一的展示效果,并且这种方式必须依赖客户机安装上述软件,有很大的局限性;字体

二、使用Jquery插件ui

这种方式大部分都依赖html5技术,鉴于目前国内的浏览器市场占比,这种方式显示极其小众,这里就再也不介绍了,有兴趣的能够参考:8个实如今线浏览PDF文件的实用jQuery插件

三、经过转换为SWF来实现

虽然html5技术正在兴起,但在目前flash依然受支持比较普遍的技术,经过Flash控件也保证了不一样浏览器相同的展现效果,一些开源的前端控件也提供很好的SWF在线浏览体验,因此这里咱们就重点介绍这种实现方式;

PDF转SWF

这里采用开源软件swftools,它支持把PDF、图片、声音等文件转换为SWF文件,而且提供windows和linux版本,能够在linux环境部署;

swftools下载地址:http://www.swftools.org/download.html

下载安装后就能够经过命令行的方式进行调用,pdf2swf提供不少的参数来进行配置,经常使用的如-p设置打开pdf的密码,-z使用Flash 6的zlib压缩机制,-s设置更信息的参数(能够经过pdf2swf -s help来获取更详细的参数信息),-o输出swf文件位置等:

 

image

下面就经过Java代码启动系统进程的方式来调用pdf2swf命令进行转换,Java在启动进程成功后就会返回,而实际上咱们但愿等待文件转换成功后程序再返回,此时就须要用到Process类了,在Java文档提到“ProcessBuilder.start() 和 Runtime.exec 方法建立一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并得到相关信息”,利用这一点咱们能够获取文件转换的信息并可让程序再系统进程结束后再返回,代码中的dealWith方法就是对Process,详细转换代码以下:

/**
     * 把pdf转换为swf
     * @param pdfPath pdf文件路径
     * @throws Exception
     */
    public static boolean convert2SWF(String pdfPath) throws Exception
    {
        String swfFile = pdfPath.substring(0, pdfPath.lastIndexOf("."))
                + ".swf";
        File outFile = new File(swfFile);
        if (outFile.exists())
        {
            return true;
        }

        File pdfFile = new File(pdfPath);
        if (!pdfFile.exists())
        {
            return false;
        }

        //建立调用swftools命令list
        List<String> command = new ArrayList<String>();
        command.add("c:\\SWFTools\\pdf2swf");//pdf2swf命令路径
        command.add("-z");
        command.add("-s");
        command.add("flashversion=9");
        command.add("-s");
        command.add("languagedir=C:\\xpdf\\xpdf-chinese-simplified");//添加xpdf解决转换时出现的字符集问题
        command.add(pdfPath);
        command.add("-o");
        command.add(swfFile);
        
        /**
         * java启动系统进程时,启动成功后就直接返回了,并不会等待系统进程执行结束,这里咱们须要等待系统进程调用结束后java方法再返回
         */
        try
        {
            //建立系统进程
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.command(command);//设置系统进程要执行的系统程序和参数
            Process process = processBuilder.start();//使用此进程生成器的属性启动一个新进程
            dealWith(process);
            try
            {
                process.waitFor();// 等待子进程的结束,子进程就是系统调用文件转换这个新进程
            } catch (InterruptedException e)
            {
                throw new Exception(e.getMessage());
            }
        } catch (IOException e)
        {
            throw new Exception(e.getMessage());
        }
        return true;
    }

    /**
     * 处理进程的IO防止出现阻塞、死锁等状况
     * @param pro
     * @throws
     */
    private static void dealWith(final Process pro)
    {
        // 下面是处理堵塞的状况
        try
        {
            //启动单独线程来清空pro.getInputStream()的缓冲区
            new Thread() {
                public void run()
                {
                    BufferedReader br1 = new BufferedReader(
                            new InputStreamReader(pro.getInputStream()));
                    try
                    {
                        String text;
                        while ((text = br1.readLine()) != null)
                        {
                            System.out.println(text);
                        }
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }.start();
        } catch (Exception e)
        {
            e.printStackTrace();
        }

        try
        {
            //不要忘记处理出理时产生的错误信息,否则会堵塞不前的
            new Thread() {
                public void run()
                {
                    BufferedReader br2 = new BufferedReader(
                            new InputStreamReader(pro.getErrorStream()));
                    String text;
                    try
                    {
                        while ((text = br2.readLine()) != null)
                        {
                            System.err.println(text);
                        }
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }.start();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

 

上面的代码中在建立swftools命令行时使用了参数 -s languagedir=C:\\xpdf\\xpdf-chinese-simplified,这里的地址对应的是另一个工具xpdf,swftools自己会支持一些字体,可是当pdf中存在它不支持的字体时就会报错,以下图,此时咱们就须要用到xpdf,Xpdf 是一个开源的PDF文件浏览器,经过语言包能够很好的支持中文,而且提供了windows和linux版本,能够跨平台部署

image

xpdf:ftp://ftp.foolabs.com/pub/xpdf/xpdfbin-win-3.04.zip

语言包:ftp://ftp.foolabs.com/pub/xpdf/xpdf-chinese-simplified.tar.gz

xpdf解压放到C盘根目录便可,语言包解压放到xpdf的根目录中,修改xpdf-chinese-simplified的文件add-to-xpdfrc,添加须要的字体目录和要展现的具体字体,而后在swftools命令中经过参数指定语言包目录便可

image

相关文件下载:

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

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

相关文章
相关标签/搜索