用jacob实现 word to pdf ~~~~~~~~~~~ 谢谢网友帮助
大家晚上好啊! 我是寻觅!
前几天,网友遇到一个用Java实现 word 转换成 pdf 的问题。悲哀,本人解决不了!
后来网友解决了问题,找到本人,本人在这里谢谢那个网友!下面会介绍他的blog希望
大家没事去看看,支持支持!谢谢!
匿名网友的blog: http://blog.csdn.net/gavin_sw/archive/2007/04/11/1561254.aspx
好了,进入正题 :
其实,本人之所以失败,和代码没关系;问题出在下面的设置上,本人因为没有
仔细阅读方法中的设置部分,导致失败!希望大家看完这个文,能避免我的错误 ;
本人把问题的解决分成多步,用最详细的内容让大家一步成功!!!祝大家好运!!!!!
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
(2)安装 gs811w32.rar
(3)配置打印机(这里不需要真实的打印机)
控制面板》 打印机及其他硬件》打印机和传真》添加打印机
(如果添加时显示“操作无法完成。打印后台程序服务没有运行。”
请打开控制面板》性能和维护》管理工具》服务》找到“Print Spooler”
》右击属性》启动)》选择本地打印机(如果没有打印机请将“检测并安装
即插打印机”的钩去掉)》下一步》选择“使用以下端口”
(My Document/*.pdf (Adobe PDF Port))》下一步 选择打印机》我选择
的是Apple的 Color LaserWriter 12/600(工作后,有钱一定要买个Apple hp)
》下一步(记住打印机的名字:Apple Color LaserWriter 12/600)
》下一步(没有打印机的朋友请选择:不测试)
(4)安装 postscript.rar (安装时,注意每一步,选择与前面设置相关的选项)
(5)设置Adobe Acrobat 8 Professional:选择一个pdf文件,右击打开方式选择
使用 打开Adobe Acrobat 8 Professional》选择file菜单》Print Setup...》打印选项
属性“Apple Color LaserWriter 12/600”》确定
(6)运行下面的代码:
代码:(相信大家已经看到成功的曙光了 ,有问题请留言,或找本人,QQ:492006004
欢迎加入我管理的群:37486623)
/** */
/**
* @author XuMing Li
*
* @version 1.00, 2007-4-9
*
*/
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class D2P {
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
Dispatch wrdDocs = wordCom.getProperty("Documents").toDispatch();
//调用wrdCom.Documents.Open方法打开指定的word文档,返回wordDoc
wordDoc = Dispatch.invoke(wrdDocs, "Open", Dispatch.Method,
new Object[] { filePath }, new int[1]).toDispatch();
return true;
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
/** *//** *//** *//**
* 关闭word文档
*/
public void closeWord() {
//关闭word文件
wordCom.invoke("Quit", new Variant[] {});
}
/** *//** *//** *//**
* * 将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", new Variant("MS Publisher Color Printer"));
//设置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);
Dispatch.callN((Dispatch) 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", new Variant[] {
inputPostScriptFilePath, outputPDFFilePath, PDFOption });
System.out.println("由ps文档转换为pdf文档成功!");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
closeWord();
wordCom=null;
//释放在程序线程中引用的其它com,比如Adobe PDFDistiller
ComThread.Release();
}
}
public static void main(String[] argv) {
D2P d2p = new D2P();
d2p.docToPDF("d:/12.doc", "d:/1p.ps", "d:/1p.pdf");
//这里是你建一个叫12.doc的word文档,生成的文档将在D盘下
//1p.ps和1p.pdf(这是我们要的)
}
}
* @author XuMing Li
*
* @version 1.00, 2007-4-9
*
*/
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class D2P {
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
Dispatch wrdDocs = wordCom.getProperty("Documents").toDispatch();
//调用wrdCom.Documents.Open方法打开指定的word文档,返回wordDoc
wordDoc = Dispatch.invoke(wrdDocs, "Open", Dispatch.Method,
new Object[] { filePath }, new int[1]).toDispatch();
return true;
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
/** *//** *//** *//**
* 关闭word文档
*/
public void closeWord() {
//关闭word文件
wordCom.invoke("Quit", new Variant[] {});
}
/** *//** *//** *//**
* * 将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", new Variant("MS Publisher Color Printer"));
//设置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);
Dispatch.callN((Dispatch) 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", new Variant[] {
inputPostScriptFilePath, outputPDFFilePath, PDFOption });
System.out.println("由ps文档转换为pdf文档成功!");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
closeWord();
wordCom=null;
//释放在程序线程中引用的其它com,比如Adobe PDFDistiller
ComThread.Release();
}
}
public static void main(String[] argv) {
D2P d2p = new D2P();
d2p.docToPDF("d:/12.doc", "d:/1p.ps", "d:/1p.pdf");
//这里是你建一个叫12.doc的word文档,生成的文档将在D盘下
//1p.ps和1p.pdf(这是我们要的)
}
}
地震让大伙知道:居安思危,才是生存之道。