关于jacob使用问题?

新手上路,请多包涵

问题描述

利用jacob将PPT转为PDF,Windows server 上总是过一段时间会卡死

问题出现的环境背景及自己尝试过哪些方法

目前仅仅是自己手写一个demo无限跑,看看能不能复现问题

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

try {

            
            /*int ppt2Pdf = PPT2PDFUtil.ppt2Pdf(filePath, tempPath+pdfName+".pdf");*/
            PPT2PDFUtil tempPPT2PDFUtil = new PPT2PDFUtil(filePath, 
                    tempPath+pdfName+".pdf");
            /*int ppt2Pdf = PPT2PDFUtil.ppt2Pdf(extractFile.getAbsolutePath()+NMSCUtil.SEPARATOR+pptName, 
                                            extractFile.getAbsolutePath()+NMSCUtil.SEPARATOR+pdfName+".pdf");*/
            Future<Boolean> submitPPT2PDFUtil = exec.submit(tempPPT2PDFUtil);
            Boolean rstPPT2PDFUtil = false;
             try {  
                 
                 rstPPT2PDFUtil = submitPPT2PDFUtil.get(10, TimeUnit.MINUTES);
                 
                } catch (TimeoutException ex) {  
                    
                    // 关闭线程池  
                    exec.shutdown();
                    ex.printStackTrace(); 
                    logger.info("ppt转pdf失败");
                    //被注释
                    String result = modifyStatus(id);
                    logger.info("ppt转pdf失败["+result+"]");
                    // 手动kill调PPT进程
                    Runtime.getRuntime().exec("Taskkill /IM POWERPNT.EXE /F");
                    return Action.CommitMessage;
                    
                } catch (Exception e) {  
                    e.printStackTrace();  
                } 
            
            
            if(!NMSCUtil.judageFileExist(tempPath+pdfName+".pdf")){
                //被注释
                String result = modifyStatus(id);
                logger.info("ppt转pdf失败["+result+"]");
                return Action.CommitMessage;
                
            }

// PPT转PDF的部分代码如下
public int ppt2Pdf() throws IOException{

    File file = new File(srcFilePath);
    if (file.exists()) {
        ComThread.InitMTA(true);
        ActiveXComponent ppt = null;
        try {
            ppt = new ActiveXComponent("Powerpoint.Application");
            //ppt.setProperty("Visible", new Variant(false));
            ppt.setProperty("DisplayAlerts", DISPLAY_ALERTS);
            Dispatch presentations = ppt.getProperty("Presentations")
                    .toDispatch();

            String absSrcFilePath = file.getAbsolutePath();
            logger.info("open document with MS Powerpoint "
                    + absSrcFilePath);
            
            
            Dispatch presentation = Dispatch.call(presentations, "Open",
                    absSrcFilePath,
                    true,true,false).toDispatch();

            File toFile = new File(destFilePath);
            String absDestFilePath = toFile.getAbsolutePath();
            logger.info("convert pdf document to " + absDestFilePath);
            if (toFile.isDirectory()) {
                logger.error("destination path must be a file path.");
                return TRANSFER_FAILURE;
            }
            
            Dispatch.call(presentation, "SaveAs", absDestFilePath,new Variant(32));
            Dispatch.call(presentation, "Close");
            logger.info("convert ppt to pdf complete.");
            return TRANSFER_SUCCEED;
            
        } catch (Exception e) {
            
            logger.error("call MS Powerpoint fail.", e);
            return TRANSFER_FAILURE;
            
        } finally {
            
            if (ppt != null) {
                
                logger.info("exit Powerpoint.");
                ppt.invoke("Quit");
            }
            
            ComThread.Release();
            
        }
    }
    logger.error("document does not exist.");
    return TRANSFER_FAILURE;
    
}

你期待的结果是什么?实际看到的错误信息又是什么?

是否是因为kill的时候没有destory相关子进程引起的?为什么会导致卡死呢?实际错误信息看不到

阅读 1.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题