• 仿百度文库解决方案(二)——利用Jacob调用MS Office转换文档为PDF


    目录

    仿百度文库解决方案(一)——总体思路

    仿百度文库解决方案(二)——利用Jacob调用MS Office转换文档为PDF

    仿百度文库解决方案(三)——利用JCom调用MS Office或者Acrobat API转换文档为PDF

    仿百度文库解决方案(四)——利用JODConverter调用OpenOffice.org服务转换文档为PDF

    仿百度文库解决方案(五)——利用SWFTools转换PDF文档为SWF

    仿百度文库解决方案(六)——利用FlexPaper显示Flash(SWF)

     

    Jacob简介

      Jacob是Java与COM组件桥接的缩写,即JAVA-COM Bridge。通过使用Jacob类库,我们可以很方便地在Java程序中调用COM自动化组件。Jacob最初是由美国人Dan Alder在Inventure公司担任CTO时编写的,目的是为了方便众多的程序员在Java2虚拟机上,调用Win32平台上COM自动化服务器中的组件。当Jacob项目以开源的方式在网络上公布以后,越来越多的人开始参与项目的研发与改进中去。

      Jacob类库中只有两个包:com.jacob.activex和com.jacob.com。com.jacob.activex包建立在com.jacob.com基础之上,主要包含了ActiveXComponent类。com.jacob.com中有一个非常基础的类JacobObject,该包中比较常用的两个类Dispatch和Variant便是继承自JacobObject。

      Dispatch类代表COM自动化组件中的对象,提供了访问COM对象的API。Dispatch类中常用的方法有:

    • call( )方法:调用COM对象的方法,返回Variant类型值。
    • invoke( )方法:和call方法作用相同,但是不返回值。
    • get( )方法:获取COM对象属性,返回variant类型值。
    • put( )方法:设置COM对象属性。

      ActiveXComponent类继承自Dispatch类,在内部封装了Dispatch对象,使用该类加载COM组件。 并且提供了访问COM组件对象的属性和方法的接口。ActiveXComponent类提供了比Dispatch类更方便的获取属性和设置属性的方法:getProperty( ),setProperty( )。

      Variant类映射COM对象中的Variant数据结构,提供Java和COM的数据交互。其本质就是一种数据类型,可以被转换成任何数据类型,如int,String,甚至Dispatch对象。

    MS Office COM 对象模型

      Microsoft Office2007之前的Office版本并没有提供转换文档为PDF格式的支持,另外,Office2007还需要安装有Microsoft Save as PDF or XPS插件才支持PDF格式转换,而Office2010不需要安装插件则自带有转换Office文档为PDF格式的API。因此,建议使用Office 2010。

      通过查询MSDN Office 2010开发人员手册,经过分析后得出图2-1所示的Office COM对象模型:

    Office COM对象模型图2-1 Office COM对象模型

      Microsoft Office中每个应用程序中都包含一个Application对象,但是每个应用程序中的文档对象却不一样,Word中Documents对象代表Word应用程序中所有打开的word文档集合,Document对象代表一篇word文档。详细的文档对象结构如图2-1所示。其中Document,Workbook,Presentation中的SaveAs或者ExportAsFixedFormat方法可用于将文档转换为PDF。

    Jacob调用MS Office COM自动化组件转换Office文档为PDF

      算法流程图如2-2所示:

    Jacob调用MS Office转换文档为PDF

    图2-2 Jacob调用MS Office COM组件转换文档为PDF算法流程

      第一步,对于Office文档,不同格式的文档需要加载不同的COM组件,例如Word文件需要加载Word COM组件。Jacob中加载COM组件是利用ActiveXComponent类,例如,加载Word COM自动化组件:

    //Word.Application代表COM OLE编程标识,可查询MSDN得到
    ActiveXComponent app = new ActiveXComponent("Word.Application");
    //设置Word不可见
    app.setProperty("Visible",false);

      第二步,获得文档对象集合,Word中Documents对象代表Word应用程序中所有打开的Word文档,范例如下:

    //调用Application对象的Documents属性,获得Documents对象
    Dispatch docs = app.getProperty("Documents").toDispatch();

       第三步,打开文件,并执行转换。Word范例如下:

    Dispatch doc = Dispatch.call(docs,
                               "Open",//调用Documents对象的Open方法
                                inputFile,// 输入文件路径全名
                                false, //ConfirmConversions,设置为false表示不显示转换框
                                 true//ReadOnly
    ); Dispatch.call(doc,//要转换的文档 "SaveAS", pdfFile,//要保存的PDF文件名 wdFormatPDF//转换后的文件格式宏,值为17,可查询MSDN得到
    );

      第四步,关闭应用程序。Word范例:

    //关闭打开的Word文件
    Dispatch.call(doc,
                  "Close",
                   false//设置不保存改变);
    //关闭Word应用程序
    app.invoke("Quit",0);

      转换Word文档为PDF格式的详细代码如下:

    word2PDF
    public static void word2PDF(String inputFile,String pdfFile){
            //打开word应用程序
            ActiveXComponent app = new ActiveXComponent("Word.Application");
            //设置word不可见
            app.setProperty("Visible", false);
            //获得word中所有打开的文档,返回Documents对象
            Dispatch docs = app.getProperty("Documents").toDispatch();
            //调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
            Dispatch doc = Dispatch.call(docs,
                                        "Open",
                                        inputFile,
                                        false,
                                        true
                                        ).toDispatch();
            //调用Document对象的SaveAs方法,将文档保存为pdf格式
            /*
            Dispatch.call(doc,
                        "SaveAs",
                        pdfFile,
                        wdFormatPDF        //word保存为pdf格式宏,值为17
                        );
                        */
            Dispatch.call(doc,
                    "ExportAsFixedFormat",
                    pdfFile,
                    wdFormatPDF        //word保存为pdf格式宏,值为17
                    );
            //关闭文档
            Dispatch.call(doc, "Close",false);
            //关闭word应用程序
            app.invoke("Quit", 0);
            
        }

    注:

      源代码下载地址:DocConverter

       转载说明本文系作者原创,转载时请注明文章出处:肖恩也有梦想 博客园,请尊重作者的劳动成果,谢谢!

  • 相关阅读:
    dom4j解析带命名空间的xml文件
    Spring使用facotry-method创建单例Bean总结<转>
    代码审查工具StyleCop
    ReSharper 配置及用法(二)
    ReSharper 配置及用法(一)
    linqPad快速学习LINQ(含视频)
    评估期已过。有关如何升级的测试版软件的信息
    SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
    SQL SERVER获取数据库中所有表名 XTYPE类型
    sqlserver中创建链接服务器
  • 原文地址:https://www.cnblogs.com/luckyxiaoxuan/p/2548355.html
Copyright © 2020-2023  润新知