您的当前位置:首页正文

如何使用jacob将word转换为PDF 收藏

2023-12-17 来源:V品旅游网
 如何使用jacob将word转换为PDF 收藏 一、代码实现功能介绍:

word文档转换为PDF文件的功能。

二、使用的环境条件:

正是由于jacob的jni这种特性,所以运行jacob的机器上必须要有jacob.dll在系统的path中,而且还要有相应的被调用的com组件存在。

下面列表说明了本项目使用的软件环境和一些注意事项:

1.Word2003、Adobe Acrobat 8.0 Professional(注:也可以使用7.5以上版本,我在做的时候,7.0版本有一些BUG,后又重新安装了8.0版本,安装地址及破解地址分别为: http://down1.greendown.cn//200611/AcroPro80_efg.rar http://soft.greendown.cn//200611/AcroPro80_Crack.rar);

2.并且关闭了Adobe PDF打印机属性->Adobe PDF Setting中的“do not send fonts to PDF”选项(注:此属性在Adobe Reader中的文件->打印的属性中进行设置。如果使用7.5以下版本可能会不好用,无法进行设置);

3.安装了gs811w32.rar(PDF转换时所需要的脚本ps),地址为: http://www.allmail.com.cn/gs811w32.rar

4.安装了postscript.rar(PDF虚拟打印机的驱动),地址为:

http://www.pdfhome.com.cn/Resource/DownLoad/postscript.rar

虚拟打印机安装完成之后,控制面板》打印机及其他硬件》打印机和传真》添加打印机(如果添加时显示“操作无法完成。打印后台程序服务没有运行。”请打开控制面板》性能和维护》管理工具》服务》找到“Print Spooler”》右击属性》启动)》选择本地打印机(如果没有打印机请将“检测并安装即插打印机”的钩去掉)》下一步》选择“使用以下端口”(My Document/*.pdf (Adobe PDF Port))》下一步,记住打印机的名字:Adobe PDF)》下一步(打印机请选择:不测试)

5.下载得到了jacob.jar。地址为:

http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368 将解压后的源代码包中jacob.dll存放到system32目录下。(注:目前比较稳定的版本分别为1.7、1.8、1.9,我用的是1.8版本)

注意:

第1、2个条件是必须的。不然会可能出现下面的错误:

三、原理:

doc -> ps ->pdf >>>> office 2003 ->gs811w32->Adobe Acrobat 8->postscript->打印机

四、源代码:

package com.bjinfotech.practice.jacob;

import com.jacob.com.*; import com.jacob.activeX.*;

public class Dispatch_MSWord {

private ActiveXComponent wordCom=null; private Object wordDoc=null;

private final Variant False=new Variant(false); private final Variant True=new Variant(true);

/**

* 打开word文档

* @param filePath word文档 * @return 返回word文档对象 */

public boolean openWord(String filePath){ //建立ActiveX部件

wordCom=new ActiveXComponent(\"Word.Application\"); try{

//返回wrdCom.Documents的Dispatch Object

wrdDocs=wordCom.getProperty(\"Documents\").toDispatch();

//调用wrdCom.Documents.Open方法打开指定的word文档,返回wordDoc

wordDoc=Dispatch.invoke(wrdDocs,\"Open\Object[]{filePath},new int[1]).toDispatch(); return true;

}

catch(Exception ex){

ex.printStackTrace(); }

return false; }

/**

* 关闭word文档 */

public void closeWord(){

//关闭word文件 if (wordCom!=null){ int save = 0;

Variant doNotSaveChanges = new Variant(save); wordCom.invoke(\"Quit\ariant[]{doNotSaveChanges}); wordCom=null;

ComThread.Release();

}

} /**

* 将word文档打印为PS文件后,使用Distiller将PS文件转换为PDF文件 * @param sourceFilePath 源文件路径

* @param destinPSFilePath 首先生成的PS文件路径 * @param destinPDFFilePath 生成PDF文件路径 */ public void destinPDFFilePath){

docToPDF(String

sourceFilePath,String

destinPSFilePath,String

if (!openWord(sourceFilePath)){ closeWord();

return; }

//建立Adobe Distiller的com对象 ActiveXComponent

ActiveXComponent(\"PDFDistiller.PDFDistiller.1\");

distiller=new

try{

//设置当前使用的打印机,我的Adobe Distiller打印机名字为\"Adobe PDF\"

wordCom.setProperty(\"ActivePrinter\ariant(\"Adobe PDF\"));

//是否在后台运行 Variant Background=False; //是否追加打印 Variant Append =False; //打印所有文档

int wdPrintAllDocument=0; Variant Range =new Variant(wdPrintAllDocument); //输出的postscript文件的路径

Variant OutputFileName =new Variant(destinPSFilePath); //调用word文档对象的PrintOut方法:将word文档打印为postscript文档,简称ps文档

Dispatch.callN(wordDoc, \"PrintOut\Variant[]{Background,Append,Range,OutputFileName}) ;

System.out.println(\"由word文档打印为ps文档成功!\");

new

//调用Distiller对象的FileToPDF方法所用的参数,详细内容参考Distiller Api手册

//作为输入的ps文档路径

Variant inputPostScriptFilePath=new Variant(destinPSFilePath); //作为输出的pdf文档的路径

Variant outputPDFFilePath=new Variant(destinPDFFilePath);

//定义FileToPDF方法要使用adobe pdf设置文件的路径,在这里没有赋值表示并不使用pdf配置文件

Variant PDFOption=new Variant(\"\");

//调用FileToPDF方法将ps文档转换为pdf文档 Dispatch.callN(distiller,\"FileToPDF\

Variant[]{inputPostScriptFilePath,outputPDFFilePath,PDFOption});

System.out.println(\"由ps文档转换为pdf文档成功!\"); }

catch(Exception ex){

ex.printStackTrace(); }

finally{

closeWord(); } }

public static void main(String[] argv){

Dispatch_MSWord d=new Dispatch_MSWord();

d.docToPDF(\"c:/MacroTest.doc\ } }

摘要:

了解jacob的程序员都知道,jacob是在java与微软的com组件之间的桥梁,通过使用jacob自带的dll动态链接库通过jni的方式实现了在sun java平台上的程序对com调用。本文介绍了如何使用jacob实现以下功能:写word文件;调用word文件中的宏;word文档转换为PDF文件的功能

如何使用jacob将word转换为PDF

作者cleverpig

版权声明:任何获得Matrix授权的网站,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

作者:cleverpig(http://www.matrix.org.cn/blog/cleverpig)

原文:http://www.matrix.org.cn/resource/article/43/43923_jacob_word_PDF.html 关键字:jacob,word,pdf,com组件

前言:

了解jacob的程序员都知道,jacob是在java与微软的com组件之间的桥梁,通过使用jacob

自带的dll动态链接库通过jni的方式实现了在sun java平台上的程序对com调用。jacob的作者照搬了微软java开发包中调用com组件的模式,并将它在sun java平台上实现,可谓是用心良苦啊。

在这里,我们要向jacob的开发者-Dan Adler致敬,感谢他的开源精神和其团队的伟大贡献!

一、代码实现功能介绍:

1.写word文件;

2.调用word文件中的宏;

3.word文档转换为PDF文件的功能。

二、使用的环境条件:

正是由于jacob的jni这种特性,所以运行jacob的机器上必须要有jacob.dll在系统的path中,而且还要有相应的被调用的com组件存在。

下面列表说明了本项目使用的软件环境和一些注意事项: 1.Word2003、Adobe Acrobat 7.0.5 Professional(由7.0版在线升级获得,因为7.0版存在bug); 2.并且关闭了Adobe PDF打印机属性->Adobe PDF Setting中的“do not send fonts to PDF”选项;

3.设置了Adobe PDF打印机属性->常规->打印首选项->布局->高级->文档选项->postscript options->TrueType font download option为Native TrueType。

第3个条件是可选的,第1、2个条件是必须的。不然会可能出现下面的错误:

1》要用到的软件:

(1)Adobe Acrobat 8 Professional (最低版本7.03) (个人非商业使用)8.0破解版下载地址: http://green.crsky.com/soft/2205.html (记得下载补丁) 安http://down1.greendown.cn//200611/AcroPro80_efg.rar 破

http://soft.greendown.cn//200611/AcroPro80_Crack.rar (2)gs811w32.rar (PDF转换时所需要的脚本ps) http://www.allmail.com.cn/gs811w32.rar (3)postscript.rar (PDF虚拟打印机的驱动)

http://www.pdfhome.com.cn/Resource/DownLoad/postscript.rar (4)jacob.jar jacob_1.9.zip (5)office 2003

2》原理:

jacob.jar

doc -> ps ->pdf >>>> office 2003 ->gs811w32->Adobe Acrobat 8->postscript->打印机

(其中关于jacob,jar的安装请看:jacob使用入门及问题解析)

3》安装运行:

(1)安装 Adobe Acrobat 8 Professional 添加打印机

服务没有运行。”

务》找到“Print Spooler”

有打印机请将“检测并安装

以下端口”

选择打印机》我选择

有钱一定要买个Apple hp) LaserWriter 12/600)

设置相关的选项)

右击打开方式选择

Print Setup...》打印选项

三、源代码:

(2)安装 gs811w32.rar

(3)配置打印机(这里不需要真实的打印机) 控制面板》 打印机及其他硬件》打印机和传真》 (如果添加时显示“操作无法完成。打印后台程序 请打开控制面板》性能和维护》管理工具》服 》右击属性》启动)》选择本地打印机(如果没 即插打印机”的钩去掉)》下一步》选择“使用 (My Document/*.pdf (Adobe PDF Port))》下一步 的是Apple的 Color LaserWriter 12/600(工作后, 》下一步(记住打印机的名字:Apple Color 》下一步(没有打印机的朋友请选择:不测试)

4)安装 postscript.rar (安装时,注意每一步,选择与前面

5)设置Adobe Acrobat 8 Professional:选择一个pdf文件, 使用 打开Adobe Acrobat 8 Professional》选择file菜单》 属性“Apple Color LaserWriter 12/600”》确定

6)运行下面的代码:

( ( (Dispatch_MSWord.java:

package com.bjinfotech.practice.jacob;import com.jacob.com.*;import com.jacob.activeX.*;/** * 使用jacob实现以下功能: * 写word文件; * 调用word文件中的宏; * word文档转换为PDF文件的功能。 * * 注意——使用的环境条件: * 1.Word2003、Adobe Acrobat 7.0.5 Professional(由7.0版在线升级获得,因为7.0版存在bug); * 2.并且关闭了Adobe PDF打印机属性->Adobe PDF Setting中的“do not send fonts to PDF”选项; * 3.设置了Adobe PDF打印机属性->常规->打印首选项->布局->高级->文档选项->postscript options->TrueType font download option为Native TrueType。 * 第3个条件是可选的,第1、2个条件是必须的。不然会可能出现错误。 * * 参考资源: * Create PDF files from Microsoft

Excel

using

Acrobat

(6.0

and

7.0

on

Windows)

*

http://www.adobe.com/support/techdocs/328398.html * Article-Word Doc to PDF Conversion * http://www.suodenjoki.dk/us/productions/articles/word2pdf.htm * 微软的javasdk文档和adobe的Distiller api文档(在项目的dependencies目录中) * @author 聪明的猪 * */public class Dispatch_MSWord { private ActiveXComponent wordCom=null; private

Object wordDoc=null; private final Variant False=new Variant(false); private final Variant True=new Variant(true); /** * 打开word文档 * @param filePath word文档 * @return 返回word文档对象 */

public boolean openWord(String filePath){ //建立ActiveX部件

wordCom=new ActiveXComponent(\"Word.Application\"); try{ //返回wrdCom.Documents的Dispatch

Object wrdDocs=wordCom.getProperty(\"Documents\").toDispatch(); //调用wrdCom.Documents.Open方法打开指定的word文档,返回wordDoc wordDoc=Dispatch.invoke(wrdDocs,\"Open\

Object[]{filePath},new

int[1]).toDispatch(); return true; } catch(Exception ex){ ex.printStackTrace(); } return false; } /** * 关闭word文档 */

public void closeWord(){ //关闭word文件 wordCom.invoke(\"Quit\Variant[]{}); } /** * 打开word,调用word中的宏 * @param filePath word文件路径 * @param

macroName 被调用的宏名字 * @param parameter 调用宏的参数数组 */ public void parameter[]){

callWordMacro(String

filePath,String

macroName,Object

if

(!openWord(filePath)){ closeWord();

return; } else{ //使用方法传入

parameter

word

MyWordMacro

Dispatch.invoke(wordDoc,macroName,Dispatch.Method,parameter,new int[1]); closeWord(); } } /** * 打开word,替换其中的文字 * @param filePath word文件路径 *

@param sourceStr 源文字 * @param replaceStr 替换后的文字 */

public void callReplaceWord(String filePath,String sourceStr,String replaceStr){ if

(!openWord(filePath)){ closeWord();

return; } try{ //获得Selection对象 Dispatch selectDoc=wordCom.getProperty(\"Selection\").toDispatch(); //获得Find对象 Dispatch find =

Dispatch.call(selectDoc,\"Find\").toDispatch(); //设置替换的方法属性,但是不支持ReplaceWith的属性,而且使用Replancement.Text属性

也无济于事。 Dispatch.put(find,\"Text\

//所以使用Find对象的Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace, MatchKashida, MatchDiacritics, MatchAlefHamza, MatchControl)方法 //详细内容见MSDN的office2000开发文档 Variant True=new

Variant FindText=new Variant(sourceStr); Variant ReplaceWith=new Variant(replaceStr); Variant Format=False;

Variant(true); Variant False=new Variant(false);

Variant Forward=True; Variant MatchCase=True; Variant MatchWholeWord=True; Variant MatchWildcards=False;

Variant MatchSoundsLike=False; Variant

MatchAllWordForms=False; int wdFindWrap_FindContinue=1; Variant Wrap=new Variant(wdFindWrap_FindContinue); int wdReplace_ReplaceAll=2; Variant Replace=new Variant(wdReplace_ReplaceAll); //使用callN方法调用execute方法 Dispatch.callN(find,\"Execute\

Variant[]{ FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap,

Format, ReplaceWith, Replace }); Dispatch.invoke(wordDoc,\"SaveAs\Object[]{\"c:\\\\111.doc\int[1]); closeWord(); } catch(Exception

ex){ ex.printStackTrace(); } finally{ closeWord(); } } /** * 将word文档打印为PS文件后,使用Distiller将PS文件转换为PDF文件 * @param sourceFilePath 源文件路径 * @param destinPSFilePath 首先生成的PS文件路径 * @param destinPDFFilePath 生成PDF文件路径 */ public void docToPDF(String sourceFilePath,String destinPSFilePath,String

destinPDFFilePath){ if

(!openWord(sourceFilePath)){ closeWord(); return; } //建立Adobe Distiller的com对象 ActiveXComponent distiller=new ActiveXComponent(\"PDFDistiller.PDFDistiller.1\"); try{ //设置当前使用的打印机,我的Adobe Distiller打印机名字为\"Adobe PDF\" wordCom.setProperty(\"ActivePrinter\Variant(\"Adobe PDF\")); //设置

printout的参数,将word文档打印为postscript文档。目前只使用了前5个参数,如果要使用更多的话可以参考MSDN的office开发相关api //是否在后台运行 Variant Background=False; //是否追加打印

Variant Append =False; //打印所有文档 int

wdPrintAllDocument=0; Variant Range =new Variant(wdPrintAllDocument); //输出的postscript文件的路径 Variant OutputFileName =new Variant(destinPSFilePath);// Variant From =new Variant(1);// Variant To =new Variant(1);// int wdPrintDocumentContent=2;// Variant Item =new Variant(wdPrintDocumentContent);// Variant Copies =new Variant(1);// Variant Pages =new Variant();// int

wdPrintAllPages=0;// Variant PageType =new Variant(wdPrintAllPages);// Variant PrintToFile =True;// Variant Collate =True;// Variant FileName =new Variant(sourceFilePath);// Variant

ActivePrinterMacGX =new Variant();// Variant ManualDuplexPrint =False;// Variant PrintZoomColumn =new Variant();// Variant PrintZoomRow =new Variant();// Variant PrintZoomPaperWidth =new Variant();// Variant PrintZoomPaperHeight =new Variant();// // Variant[]

args=new

Variant[]{Background,Append,Range,OutputFileName,From,To,Item,Copies,Pages,PageType,// PrintToFile,Collate,FileName,ActivePrinterMacGX,ManualDuplexPrint,PrintZoomColumn,PrintZoomRow,//

PrintZoomPaperWidth,PrintZoomPaperHeight}; //调用

word文档对象的PrintOut方法:将word文档打印为postscript文档,简称ps文档 Dispatch.callN(wordDoc,

\"PrintOut\

new

Variant[]{Background,Append,Range,OutputFileName}) ; System.out.println(\"由word文档打印为ps文档成功!\"); //调用Distiller对象的FileToPDF方法所用的参数,详细内容参考Distiller Api手册 //作为输入的ps文档路径 Variant inputPostScriptFilePath=new Variant(destinPSFilePath); //作为输出的pdf文档的路径 Variant outputPDFFilePath=new Variant(destinPDFFilePath); //定义FileToPDF方法要使用adobe pdf设置文件的路径,在这里没有赋值表示并不使用pdf配置文件 Variant PDFOption=new Variant(\"\"); //调用FileToPDF方法将ps文档转换为pdf文档 Dispatch.callN(distiller,\"FileToPDF\

Variant[]{inputPostScriptFilePath,outputPDFFilePath,PDFOption}); System.out.println(\"由ps文档转换为pdf文档成功!\"); } catch(Exception ex){ ex.printStackTrace(); } finally{ closeWord(); } } public static void main(String[] argv){ Dispatch_MSWord d=new Dispatch_MSWord();//

d.callWordMacro(\"E:/eclipse3.1RC3/workspace/jacobPractice/src/com/bjinfotech/practice/jacob/

MacroTest.doc\String[]{\"这是调用word宏的测试程序\ d.callReplaceWord(\"E:/eclipse3.1RC3/workspace/jacobPractice/src/com/bjinfotech/practice/jacob/MacroTest.doc\文字已经被替换\"); d.docToPDF(\"E:/eclipse3.1RC3/workspace/jacobPractice/src/com/bjinfotech/practice/jacob/MacroTest.doc\ }}

因篇幅问题不能全部显示,请点此查看更多更全内容