使用jacob将word转换为PDF,转换前如何接受所有修订?

知道就是你 2019-05-17 09:17:47
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;

/**
*
* Function: word转换pdf. <br/>
* date: 2017年5月15日 下午4:53:16 <br/>
*
* @author Qin-Haojun
* @version
* @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);
}
}
...全文
375 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36492588 2019-05-17
  • 打赏
  • 举报
回复
Free Spire.Doc for Java里面有个方法acceptChanges(),可以设置接受所有修订后直接将Word转为PDF,参考代码:

import com.spire.doc.*;

public class Main {
    public static void main(String[] args) {
        //加载word示例文档
        Document doc = new Document();
        doc.loadFromFile("sample.docx");

        //启用修订功能
        doc.setTrackChanges(true);
        
        //判断文档是否有修改
        if (doc.hasChanges())

            //接受修订
            doc.acceptChanges();

        //保存结果文件
        doc.saveToFile("Word转PDF.pdf", FileFormat.PDF);
        doc.close();
    }
}

知道就是你 2019-05-17
  • 打赏
  • 举报
回复
如果注释掉,效果不尽人意! 参考转换结果如下:
ninuxGithub 2019-05-17
  • 打赏
  • 举报
回复
Dispatch.put(doc, "AcceptAllRevisions", true) ;注释掉就ok了

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧