调用jacob服务时注意事项

需求有一个将office文件转成PDF并添加水印的功能,office转PDF需要用到jacob功能

转化代码

   private static final int wdFormatPDF = 17;
    private static final int xlTypePDF = 0;
    private static final int ppSaveAsPDF = 32;
    private static final int msoTrue = -1;
    private static final int msofalse = 0;
    public static boolean word2PDF(String inputFile,String pdfFile){
        try{
            ComThread.InitSTA();
        //打开word应用程序
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        //设置word不可见
        app.setProperty("Visible", false);
        //获得word中所有打开的文档,返回Documents对象
        Dispatch docs = app.getProperty("Documents").toDispatch();
        //调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
        Dispatch doc = Dispatch.call(docs,
                                    "Open",
                                    inputFile,
                                    false,
                                    true
                                    ).toDispatch();
        //调用Document对象的SaveAs方法,将文档保存为pdf格式
        /*
        Dispatch.call(doc,
                    "SaveAs",
                    pdfFile,
                    wdFormatPDF     //word保存为pdf格式宏,值为17
                    );
                    */
        Dispatch.call(doc,
                "ExportAsFixedFormat",
                pdfFile,
                wdFormatPDF     //word保存为pdf格式宏,值为17
                );
        //关闭文档
        Dispatch.call(doc, "Close",false);
        //关闭word应用程序
        app.invoke("Quit", 0);
        return true;
    }catch(Exception e){
        e.printStackTrace();
        return false;
    }finally{
        ComThread.Release();
    }
    }
    public static boolean excel2PDF(String inputFile,String pdfFile){
        try{
            ComThread.InitSTA();
            ActiveXComponent app = new ActiveXComponent("Excel.Application");
            app.setProperty("DisplayAlerts", "False");
        app.setProperty("Visible", false);
        Dispatch excels = app.getProperty("Workbooks").toDispatch();
        Dispatch excel = Dispatch.call(excels,
                                    "Open",
                                    inputFile,
                                    false,
                                    true
                                    ).toDispatch();
        Dispatch.call(excel,
                    "ExportAsFixedFormat",
                    xlTypePDF,
                    pdfFile
                    );
        Dispatch.call(excel, "Close",false);
        app.invoke("Quit");
        return true;
    }catch(Exception e){
        e.printStackTrace();
        return false;
    }finally{

        ComThread.Release();
    }

    }
    public static boolean ppt2PDF(String inputFile,String pdfFile){
        try{
            ComThread.InitSTA();
        ActiveXComponent app = new ActiveXComponent("PowerPoint.Application");
        //app.setProperty("Visible", msofalse);
        Dispatch ppts = app.getProperty("Presentations").toDispatch();

        Dispatch ppt = Dispatch.call(ppts,
                                    "Open",
                                    inputFile,
                                    true,//ReadOnly
                                    true,//Untitled指定文件是否有标题
                                    false//WithWindow指定文件是否可见
                                    ).toDispatch();

        Dispatch.call(ppt,
                    "SaveAs",
                    pdfFile,
                    ppSaveAsPDF
                    );

        Dispatch.call(ppt, "Close");

        app.invoke("Quit");
        return true;
        }catch(Exception e){
            return false;
        }finally{
            ComThread.Release();
        }

    }

这个是网上找到的功能,的确可以实现需求,但是有很明显的缺陷。

代码转化完后会打开一个进程,但是结束时却不会主动开闭,导致内存占用最终崩溃。

所以要在 每个方法前   加上

 ComThread.InitSTA();结束加上
 ComThread.Release(); //释放进程

1.         注意事项

2.1 注意使用高版本的ofiice,建议office2010.

2.2启动office的打印服务

office打印设置为系统默认

2.3 由于高本版的office经常将excel自动设置为受保护的视图,需要解除文件状态

  Excel文件  文件--选项信任中心信任中心设置受信任的位置-添加新位置(可能涉及到需要用到的文件的地方,例如tomcat文件夹和文件上传目录)

2.4 服务启动的tomcat使用jacob组件时要设置 DOCM权限,否则用不了。Tomcat catalina方式启动或者main方式启动不会有这个问题。

 

 运行输入   comexp.msc -32

找到 office Excel word ,右键属性

标识---交互式用户

 

安全-配置权限编辑

将所有权限勾上

 
 
时间: 2024-11-07 16:10:12

调用jacob服务时注意事项的相关文章

实现在GET请求下调用WCF服务时传递对象(复合类型)参数

WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法>.<实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法>,在此就不作重述. 实现WCF支持HTTP请求调用容易,但要实现类似MVC的ACTION及WEB API那样的灵活,那就得花费点功夫,为什么这样说

解决android调用IIS Express中的WCF服务时,出现错误400问题

IIS Express仅支持localhost主机名地址访问. 找到IIS Express Config文件下的 applicationhost.confi   修改配置 再来调试android应用,发下已经成功调用 解决android调用IIS Express中的WCF服务时,出现错误400问题,布布扣,bubuko.com

绑定服务时什么时候调用onRebind

Serivce中onRebind被调用的时机很特别,想知道什么时候onRebind被调用,可以接下面的次序来学习,最后自然就明白了! 1. 首先要知道,同一个服务既可能被启动也可以被绑定; 2. Service中onRebind方法被调用,只要符合两个必要条件就行 (1)服务中onUnBind方法返回值为true (2)服务对象被解绑后没有被销毁,之后再次被绑定 .下面举例说明: 例1:同一个Activity对象 先自启动服务(onCreate, onStartCommand):再绑定服务(on

ajax调用WebServices服务方法和传参调用WebServices注意事项

先演示下ajax是如何调用WebServices中的方法    1.新建一个页面default.aspx,一个Web服务    在页面中引用jQuery文件. <script src="../Scripts/jquery-1.4.1.js" type="text/javascript"></script> web服务里给Helloworld方法里加个参数 using System; using System.Collections.Gener

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立.发布.测试 第一篇.GP降雨量等值线建模.发布及测试 在水利.气象等行业中,要在WebGIS中实现空间分析功能,如绘制等值线.等高线.等直面.缓冲区等都是经常遇到,经过一段时间的学习和研究,查阅ESRI文档,请教他人,终于可以说是初步实现了等值线功能,这里记录下来详细的操作步骤和图片说明,一方面是对此次努力的总结,另一方面希望也能给后来用到这方面的其他同志们,起个抛砖引玉的作用. 下一篇是关于Silv

ArcGIS API for Silverlight 调用GP服务加载等值线图层

原文:ArcGIS API for Silverlight 调用GP服务加载等值线图层 第二篇.Silverlight客户端调用GP服务 利用ArcGIS API for Silverlight实现GP服务调用,这里的雨量数据是通过一个WebService获取而来,主要信息是雨量站点的经纬度坐标值和某个时间段内的降雨量值三个主要字段. 以下是核心代码部分: <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pr

绑定服务调用本地服务中的方法

如果想调用服务中的方法, 通过startService()是做不到的, 这时需要用bindService来解决. 下面的demo是在Activity中调用Service中的自定义方法---methodInService 这个demo可以解决在项目开发中调用service里的数据. 这里在service中使用到了代理模式.这是为了,给service组件和activity组件中间添加一个中间人. 通过代理来传递数据.也就是binder对象.这个代理就是接口IService Service中的代码如下

用jQuery的Ajax调用WCF服务编程心得

这两天在写基于WCF服务的后台框架,过程中遇到了一些挫折,经过努力全部解决了,在此分享给大家,使用的工具是Visual Studio 2013. 该后台需要支持通过json来传递和接收数据. 首先,说说搭建过程. 第一步:创建WCF服务应用程序项目WCF. 第二步,创建服务使用的数据类 using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Sch

【课程分享】深入浅出微信公众平台实战开发(微网站、LBS云、Api接口调用、服务号高级接口)

深入浅出微信公众平台实战开发(微网站.LBS云.Api接口调用.服务号高级接口) 课程下载地址:链接:http://pan.baidu.com/share/link?shareid=2214724072&uk=3611155194 密码:glvc 一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 微信公众平台的火热程度已经不用多言,无论是个人还是企业,政府还是商家,都已经开始搭建微信公众平台,微信的作用已经被各界人士认可.微信公众平台的技术需求市场缺口巨大. 1.2.课程内容简介 本