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

相关专题链接

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

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

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

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

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

1、PDF浏览器插件

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

 

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

2、使用Jquery插件

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

3、通过转换为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文件位置等:

下面就通过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版本,可以跨平台部署

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命令中通过参数指定语言包目录即可

相关文件下载:

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

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

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

时间: 2024-10-04 04:25:09

PDF解决方案(3)--PDF转SWF的相关文章

java将office文档pdf文档转换成swf文件在线预览

java将office文档pdf文档转换成swf文件在线预览 第一步,安装openoffice.org   openoffice.org是一套sun的开源office办公套件,能在widows,linux,solaris等操作系统上执行. 主要模块有writer(文本文档),impress(演示文稿),Calc(电子表格),Draw(绘图),Math(公式),base(数据库) 笔者下载的是openoffice.org 3.3.0.下载完直接安装即可.      但是,我们还需要启动openof

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

相关专题链接 PDF解决方案(1)--文件上传 PDF解决方案(2)--文件转PDF PDF解决方案(3)--PDF转SWF PDF解决方案(4)--在线浏览 前言:上一篇主要提到了PDF在线浏览的各种方案的优劣和如何把PDF转换为SWF文件,这一篇主要介绍SWF文件的在线浏览. SWF在线浏览 SWF在线浏览选择的是FlexPaper,一个轻量级的开源(又是开源,开源万岁!)组件,可以在浏览器中显示各种文档. 下载地址:http://flexpaper.devaldi.com/ 在自己的页面中

PDF编辑工具——PDF Desktop Converter 4 Professional

管理和操作PDF的工具.PDF Desktop Converter 4 Professional可以生成,转换,提取,组合,分割合并PDF.新增加的OCR功能可以将扫描后的文件转变成可以检索和编辑的PDF.以上这些功能只需要一个软件就可以全部实现. 软件特点 1. 快速,准确,简单的生成PDF. * Add-in按钮 -从Microsoft应用程序立即生成PDF -无需Microsoft应用程序,可以立即将PDF转换成Word,Excel. * 采用密码对PDF文件中的敏感信息进行控制,限制浏览

MFC使用Haru free pdf lib生成pdf文件

MFC使用Haru free pdf lib生成pdf文件 我们先创建一个项目MFCPDFDemo,在上面添加一个编辑框和一个按钮: haru free pdf类库下载地址 这里直接下载dll,如果想以静态库的方式使用,得下载源码自己编译.然后把这个dll添加到项目中,怎么添加就不说了吧,还是说一下吧,万一有新手看不懂呢.解压后我们要用到三个东西:libhpdf.dlllibhpdf.libinclude整个文件夹解压后复制libhpdf.dll到项目的release和debug目录下:libh

15、对IBM-adpat-helen_useReg-State15实验的未乘以转化矩阵的mmf文件,使用hts_engine的mgc.pdf和lf0.pdf进行替换,得到乘以转化矩阵之后的mmf文件

在IBM-adpat-helen_useReg-State15/voices/...路径下产生mgc.pdf和lf0.pdf文件(都是乘以转化矩阵之后的模型文件) 在scripts/Config.pm文件中,把$yu_HHEd开关打开,重新make 在IBM-adpat-helen_useReg-State15/voice/...路径下产生了mgc.pdf和lf0.pdf,主意是二进制的 去scripts/Config.pm文件中,使用HHEd的另一个路径,$HHED      = '/home

PHP+JavaScript+HTML实现上传PDF和浏览PDF课件

在寒假简单制作PHP网站时,需要实现在线浏览PDF和上传PDF的简单功能,下面就简单介绍下该功能.实现效果如下图所示: 1.当用户登录后,点击"上传课件"超链接可以实现隐藏和显示上传table的功能: 2.当用户选择上传的课件后,PDF上传至本地网页文件夹下,同时插入数据库: 3.当点击相关PDF教学课件后,可以实现在线浏览功能. 网站布局参考:PHP网站使用JavaScript和Iframe简单实现部分刷新效果 一. 隐藏/显示table 首先介绍如何通过JavaScript实现点击

合并PDF(Merge PDF)

插件介绍: 想必各位小伙伴们都会遇到这样的情况,在网上下载资料的时候,本来是完整的,下载完成后却被分成了几个部分,如果把这几个部分合成一个PDF文件,那么不管是阅读还是管理都会更方便,今天就给大家介绍这个合成PDF的插件.Smallpdf的PDF合并工具运行您免费在线合并PDF文件. 拖放或上传多个PDF文件,当文件正上传中,您可预备工作.一旦您满意该效果,即可生成PDF,然后该文件将自动下载至您的硬件. 使用说明: 将合并PDF(Merge PDF)添加至chrome,并在扩展器中启动它. 功

如何用pdf转换器压缩pdf文件大小

在学习或办公过程中,常会遇到一些较大的PDF文件需要转换成Word文档的问题,没有经验的朋友常常不知道该怎么把PDF文件转换成Word而烦恼不已,但事实上我们可以通过一个简单PDF压缩工具将文本体积进行减少,然后再转成Word格式文档.今天就给大家分享一个全功能为一体的PDF转换器,支持PDF文档压缩,同时也附带PDF转Office文档转换功能,操作十分简单,处理的速度也快,大家可以用来参考一下. 这个迅捷PDF转换器使用的是软件自带的压缩功能,可以大大减少PDF的大小,这个非常实用的技巧,可以

C#写PDF文件类库PDF File Writer介绍

.NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍 阅读目录 1.PDF File Writer基本介绍 2.一个简单的使用案例 3.资源 1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过,用过简单的例子,不过代码没有写成专门的文章.最近在查找资料的时候,又发现一款小巧的写PDF文件的C#组件:PDF File