最近单位有个项目的需求是要求将上传到文档转换成PDF。想来N个方法。
一是用java通过jacob来调用dll实现。dll是用vc写的调用office实现文档读入和转换,在用vc做到时候,发现如果做成是和office版本无关的很麻烦,因为office2003和office2007的格式差很多,一个是二进制,一个是xml。无奈另寻他路。
二是用jacob来调用虚拟的pdf打印机来打印office。发现这样的速度很难接受,一个50多M 的文档需要可能不下10分钟。
三是在我仔细阅读了office的文档msdn的时候发现了一句话,很小的字,写的是在saveas相类似的方法可以用exportAsFixedFormat方法来实现。这个方法我在msdn中查阅后,发现可行,所以进行研究。
先是下载微软官方的pdf插件,这个插件支持office文档(word,excel,powerpoint)另存为PDF。另存到速度令人吃惊。
编写的代码如下:其中调用的变量参阅了录制的office宏。
word的另存如下:
public class OfficeToPdf{
private ActiveXComponent wordCom=null;
public boolean saveWordAsPDF(String filePath,String outFile){
ComThread.InitSTA();
wordCom=new ActiveXComponent("Word.Application");
try{
Dispatch wrdDocs=Dispatch.get(wordCom,"Documents").toDispatch();
Dispatch wordDoc=Dispatch.call(wrdDocs,"Open",filePath,
new Variant(true),new Variant(false)).toDispatch();
Dispatch.invoke(wordDoc,"ExportAsFixedFormat",Dispatch.Method,new Object[]{
outFile,new Variant(17),new Variant(false),new Variant(0),new Variant(0),
new Variant(0),new Variant(0),new Variant(false),new Variant(true),
new Variant(0),new Variant(false),new Variant(true),new Variant(false)},new int[0]);
return true;
}catch(Exception es){
es.printStackTrace();
return false;
}finally{
closeWord(false);
}
}
public void closeWord(boolean saveOnExit){
if(excelCom!=null){
excelCom.invoke("Quit",new Variant[]{});
excelCom=null;
ComThread.Release();
}
}
//调用
public static void main(String[] args){
OfficeToPdf o2p=new OfficeToPdf();
o2p.saveWordAsPDF("c://x.doc","c://xx.pdf");
o2p.saveWordAsPDF("c://x.docx","c://xxe.pdf");
}
}
下班啦,excel和powerpoint的转换下回接着说。