文档章节

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

sundy_ly
 sundy_ly
发布于 2013/10/26 22:12
字数 1351
阅读 673
收藏 59

目录

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

仿百度文库解决方案(二)——利用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。

office2010自动集成PDF/XPS组件,主菜单下选择SaveAs,我们可以在Saveastype下拉列表框中发现PDF,XPS的身影,也可以在Share子菜单下发现CreatePDF/XPSDocument。

  通过查询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格式的详细代码如下:

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

 

本文转载自:http://www.cnblogs.com/luckyxiaoxuan/archive/2012/06/13/2548355.html

上一篇: jbpm4.4与Spring整合
下一篇: 文档在线预览
sundy_ly
粉丝 5
博文 20
码字总数 34108
作品 0
朝阳
程序员
私信 提问
加载中

评论(3)

jacket
jacket
好东西 马克
汤晓冬
汤晓冬
owa2013,如果不差钱或者不考虑许可
m
mzllon
果断 mark
仿百度文库word文档在线阅读

第一种实现方案:openoffice+swftools+flexpaper 用户上传一个文档,格式有可能是doc、docx、xls、ppt、pdf 等。其他用户在前台查看的却是一个swf格式的flash文档。 flash文档可以起到防止用...

JellyFlower
2014/01/18
0
1
swf-docs-generator

这是一个类百度文库 swf 格式在线浏览的完整解决方案:支持 office/pdf/txt/html 等多格式文档上传。本解决方案全程采用开源免费软件,零成本。项目目前实现了简单上传和自动转换,若要用在实...

chekun
2013/05/16
3.1K
2
office转PDF文档

最近项目上面有个需求,将用户上传的office格式转换成pdf格式。下面记录下我走过的一些弯路,和得到的一些收获 1 使用java第三方api转换。 这个是我最开始的想法,因为java毕竟比较熟悉,学习...

冰暝
2016/12/05
33
0
DocHub v2.3 发布,构建你自己的百度文库

DocHub 文库系统是使用Go语言的Beego框架开发实现的类百度文库解决方案,使用对商业友好的 Apache2.0 开源协议进行开源,支持office(全部类型)、PDF、TXT、EPUB、MOBI等多种文档格式的在线阅...

皇虫
04/15
0
0
Beego 开发的类百度文库 - DocHub

起初开发这套程序,是想自己做一个IT行业的文库站点,也就是现在的IT文库(http://wenku.it),当初给文库起名就叫,但是决定开源出来之后,觉得这样不妥,于是起了个叫的名字。 毕竟,有个Git...

皇虫
2018/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

lua字符串和时间戳相互转换

1. 时间戳转成格式化字符串 直接利用函数os.date()将时间戳转化成格式化字符串.```local timestamp = 1561636137;local strDate = os.date("%Y/%m/%d %H:%M:%S", timestamp)print("strD......

书香神
14分钟前
0
0
代码规范

代码格式化 安装vscode插件:Prettier - Code formatter 格式化配置:将下列配置写入到vscode的settings.json文件 (遵照代码格式化) "prettier.disableLanguages": ["vue"], "prettier.......

TreeZhou0511
59分钟前
3
0
python实现人工神经网络的一个例子

人工神经网络已经有无数的开源框架,比如tensorflow,caffe等,可以直接用。但最近需要做一个小样例,把基本思想讲一讲,因此自己写了一个demo,以供参考。 下面直接上代码,代码中有注释,比...

propagator
今天
4
0
远程dubugger

1、在tomcat的bin下/data/project/XXX/apache-tomcat-8.5.23/bin 在catalina.bat文件中新增如下即可 JAVA_OPTS="-Xmx1024m -Xms1024m -agentlib:jdwp=transport=dt_socket,server=y,suspend......

一只小青蛙
今天
1
0
jemter 连接MySQL

jemter 连接MySQL 点击测试计划,测试计划最后”添加目录或jar包到ClassPath“,点击浏览,添加mysql-connector.jar mysql-connector.jar的下载地址: https://mvnrepository.com/artifact/my...

xiaobai1315
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部