1.环境: JDK1.6 jacob-1.18
2.接受所有修订,尝试及对应错误信息
(1) Dispatch.call(doc, "AcceptAllRevisions");
(2) Dispatch.put(doc, "AcceptAllRevisions", true);
3.源代码:
import java.io.File;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/**
@since JDK 1.6
*/
public class WordPdfUtil {
private static final Log log = Logs.get();
// 线程池
private static ExecutorService executor = Executors.newFixedThreadPool(5);
public static boolean word2PDFJacob(String inputFile,String pdfFile) {
log.info("Word转PDF开始启动...");
long start = System.currentTimeMillis();
ActiveXComponent app = null;
Dispatch doc = null;
try {
//多线程
ComThread.InitMTA(true);
//单线程
//ComThread.InitSTA();
app = new ActiveXComponent("Word.Application");
// 设置word不可见
app.setProperty("Visible", new Variant(false));
// 打开word文件
Dispatch docs = app.getProperty("Documents").toDispatch();
log.info("打开文档:" + inputFile);
doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] {
inputFile, new Variant(false),new Variant(true),new Variant(false),new Variant("pwd") }, new int[1]).toDispatch();
File tofile = new File(pdfFile);
if (tofile.exists()) {
tofile.delete();
}
Dispatch.put(doc, "AcceptAllRevisions", true); //com.jacob.com.ComFailException: Invoke of: AcceptAllRevisions
// Dispatch.call(doc, "AcceptAllRevisions"); //Invoke of: AcceptAllRevisions Source: Microsoft Word Description: 此方法或属性无效,因为 该命令不可用于读取
// Dispatch.call(doc, "AcceptAllChangesInDoc"); //Can't map name to dispid: AcceptAllChangesInDoc
// Dispatch.call(doc, "AcceptAllRevisions");
//作为html格式保存到临时文件::参数 new Variant(8)其中8表示word转html;7表示word转txt;44表示Excel转html;17表示word转成pdf。。
Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {
pdfFile, new Variant(17) }, new int[1]);
long end = System.currentTimeMillis();
log.info("转换完成..用时:" + (end - start) + "ms.");
return true;
} catch (Exception e) {
e.printStackTrace();
log.info("Error:文档转换失败:" + e.getMessage());
return false;
} finally {
// 关闭word
if (doc != null) {
//false 关闭不保存; true 关闭并保存
Dispatch.call(doc,"Close",new Variant(false));
log.info("关闭文档");
}
if (app != null) {
app.invoke("Quit",0);
}
//如果没有这句话,winword.exe进程将不会关闭
ComThread.Release();
}
}
private static class Word2PDFConvertor implements Callable<Boolean> {
private String inputFilePath;
private String pdfFilePath;
public Word2PDFConvertor(String inputFilePath, String pdfFilePath) {
this.inputFilePath = inputFilePath;
this.pdfFilePath = pdfFilePath;
}
@Override
public Boolean call() throws Exception {
return word2PDFJacob(this.inputFilePath, this.pdfFilePath);
}
}
// 线程池转换方法
public static boolean word2PDF(String inputFile, String pdfFile){
Future<Boolean> success = executor.submit(new Word2PDFConvertor(inputFile, pdfFile));
try{
return success.get(180*1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
return false;
} catch (ExecutionException e) {
e.printStackTrace();
return false;
} catch (TimeoutException e) {
ProcessUtil.killAllFind(inputFile);
return false;
}
}
public static void main(String[] args) {
String fileName="d:/test.docx";
String pdfName="d:/test.pdf";
word2PDF(fileName,pdfName);
}
}
Word接收修订,可以参考:http://www.e-iceblue.cn/spiredocforjavaoperating/word-trackchanges-using-java.html ,接受修订后再转换成PDF, 这里saveToFile方法可以直接保存为PDF格式
import com.spire.doc.*;
public class TrackChanges {
public static void main(String[] args){
//加载测试文档
Document doc = new Document("test.docx");
//判断文档是否有修改
if (doc.hasChanges())
//接受修订
doc.acceptChanges();
//保存文档
doc.saveToFile("result.pdf",FileFormat.PDF);
}
}