javaintegar的简单介绍

博主:adminadmin 2022-12-06 15:57:05 65

本篇文章给大家谈谈javaintegar,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何在java中用javascript来打印pdf

纯Java的解决方案:

我们首先想到的自然就是JDK1.4提供的JPS(Java Printing Service)啦,不过,这东西虽然说支持PDF的Flavor,但是,不管是个人实验还是网上他人的评论,好像根本就是useless,可能如果说你 的打印机Driver支持PDF的Flavor的话,JPS会检测到你的driver的这个特性,能够成功的打印PDF文档出来,但是,大部分情况下,这 种情形是不成立的,故此JPS死路一条啦!

让我们看看PDF的老家Adobe那里有没有什么法宝,我们发现一个Viewer Bean的组件,说是可以将PDF以Bean组件的方式潜入到Swing中,哇,太爽了,不过慢着,协议上说不提供任何支持,也不保证不出任何问题,管那 么些,试过再说,一实验才知道,靠,Exception频发,而且这个组件较为陈旧,还是扔一边吧!

还有一个PDFBox,Open Source的,不过对中文支持不好,而且好像开发进度也不是很好,没有发布一个正式的版本,基本上不能用于生产环境;

最后,求助于Commercial的产品吧,实验了一下ActiveTree的JPrint,感觉不错,完全可以胜任我们的需求而且恰到好处,不过授权费 很贵,Email问过之后的答复是2000USD的最低购买,呵呵,虽然日本人很有钱,但也心疼这个银子啊,所以最终也得作罢!(ActiveTree的 授权其实挺令我ft的,他其实在2003年的时候是可以免费使用的,但之后就变卦了,呵呵,当时记得我还给提过一些bug之类,算了,人家做出这个东西也 不容易)

其他商业产品也是价格不菲,所以,基本上纯Java的solution到这里就否决了,让我们看Java-Com的解决方案吧!

Java-Com 的解决方案:

在前一条路走不通之后,我痛定思痛,决定转向自己不熟悉的领域,ms的领地,我打算从Java中调用Com组件,由Com组件来帮助我们实现PDF的打印 工作,不够这条路也不是一帆风顺那!

我们知道,Acrobat Reader在发布的时候会随同发布一个支持浏览器的com组件用来manipulate他的这个PDF文档格式,所以,我们想要本地调用这个随同发布的 Com组件来实现PDF打印。虽然Version5,6,7的这个组件格式不一样(5,6是以ocx的格式发布,7是以dll的格式发布),但是,不管那 么些,先从7开始吧!

要调用com,那么我们需要一个从java到com的Bridge,所以,jacob第一个跃入我的脑海,因为之前就用过嘛!但是麻烦来了,我们并不知道 这个com组件提供了那些调用接口啊!哎,没办法,回学校求教熟悉.net的同学,给好不容易弄出几个需要的调用方法(哎,可怜我的周末啊),星期一就回 来用jacob调用啦,可是左试右试就是一直抛异常,我那个气啊!难道是jacob的为问题?!我就又找了jcom和jcom2等类似的产品,但jcom 全是日文文档,没有办法,而jcom2估计也是一个德行(我忘了为什么当初否决了这个),所以就决定试一试商业产品吧!

这方面的商业产品主要有J-Integra,JPanel(好像叫这个名字)以及一个叫JNIWrapper的产品(这个是一个人用用来演示在java中 使用Acrobat5打印PDF的时候提到的)。这些商业产品好的地方就是他可以根据某个你要调用的com组件为你自动生成相应的Proxy对象java 代码,这样你就可以直接调用你熟悉的java代码了。像jacob等开源项目,如果给出一个类似的code generation工具的话,就完全不逊于这些商业产品啦。鉴于商业产品的价格,我最终还是否决了这些(日本人其实也听抠门的)。

这样,Java-com也对这个问题没辙了。

不过,最后在我的解决方案中,我还是使用了Jacob,这是后话,暂且不提...

那我们考虑一下,如果PDF打印不行,打印其他格式行不行?!比如图片,这个JPS可以完全打印,所以,我们找一下有没有将PDF格式转换为其他格式的工 具吧!

PDF格式转换的解决方案:

在这个领域,主要的就是有GhostScript/GView和ImageMagick,前者可以将PDF格式转换为PostScript格式,但是好像 GhostScript也不能用JPS完全打印出来;而后者是一个将PDF转换为Image的API工具,他的Java实现叫JMagick,但他有一个 跟GhostScript同样的问题,就是要转换,就必须在本地安装,然后通过命令行的方式调用,这个显然也不是很好,而且集成性很差,还是作罢!

剩下的一个是命令行调用啦,这是从itext网站找到的,你可以通过在命令行运行AcroRd32 /p /h "path to PDF file"这样的命令来打印你要打印的PDF文件,当然,你可以在PDF文件生成后就将他们依次放入一个批处理文件来执行这些打印命令,但是这个方案唯一 的问题就是,每打印一个文件都会启动一个Acrobat Reader窗口而且必须手动关闭,这现在不能满足目前的系统要求。

好了,所有的方案基本上都罗列完了,也没有找到一个可行的方案:-(

(没有银子嘛,不然Activetree的JPrint不错的说)

这些东西差不多郁闷了我3,4天吧,那几天简直就是bored to death.

不过,在郁闷的这几天的结尾,却有一道灵光闪过我的脑海...

能不能说启动一个打印service,当文档要打印的时候,直接发送给它就行了那?!而恰好我发现一段在网页中加载PDF文档的Javascript代 码,而且完全可以使用js来控制PDF的打印,所以,最终的这个方案就浮出水面了 ...

1-使用jacob启动一个IE进程,并隐藏IE窗口;

if(ieAutomation == null)

ieAutomation = new ActiveXComponent("InternetExplorer.Application");

ieAutomation.setProperty("Visible",new Variant(false));

2-PDF前端在生成PDF文件之后发送生成后的文件到JacobPDFPrinter,JacobPDFPrinter根据出入的PDF文件的全路径使 用Velocity模板引擎动态生成一个包含使用Javascript代码实现的PDF打印逻辑的HTML文档(当然,使用Velocity生成文档这部 分逻辑我们单独抽出到VeloIEPrinterGenerator类中);

3-在HTML生成之后,在JacobPDFPrinter中就可以使用jacob调用IE的Navigate2,将IE重定向到刚才生成的这个HTML 文件啦,这样,IE就会在后台调用JS代码将PDF打印到默认打印机;

4-打印成功之后,清除临时动态生成的HTML文件;

5-当主程序退出之前,Quit后台IE进程。

以上就是我能给出的一个solution,并不完美,但it works.

需要注意的几个问题是:

(1)需要设置IE的一个高级选项,运行本地脚本运行;

(2)因为Java和Com线程模型的不一致,导致在最终Quit后台IE进程的时候会抛出Com调用异常,因为对于Win平台API以及相关编程模型不 是很熟悉,所以,这个问题需要求助于别人帮忙解决;

(3)IE在执行JS打印PDF的时候,同样会后台启动Acrobat的一个进程,而这个进程我们程序中无法控制其生命周期,所以,主程序退出后,我们没 有办法同时kill这个进程,好在不管我们运行多少次,这个进程在后台只有一个,所以,性能负担不是很大;

转载

java j-interop 怎么调用wmi

有关WMI的小知识

Windows管理规范(WMI)是微软对来自分布式管理任务组(DMTF)的基于Web的企业管理(WBEM)和通用信息模型(CIM)标准的实现。WMI用于访问Windows系统、应用、网络、设备等组件,并管理它们。连接到一台机器通过DCOM进行管理。因此,有关DCOM的小知识将有助于本文的理解。你可以到MSDN了解有关WMI的更多细节。

J-Interop

市场上有一些在使用 JAVA 调用 WMI 的好库,包括 J-Interop、JACOB-Project 和 J-Integra。其中,我更喜欢J-Interop,因为它是完全免费和开源的API。它提供了没有任何依赖的纯DCOM桥,完全用Java编写的没有任何JNI代码。

使用WMI管理Windows服务

现在,来看一个使用JAVA调用WMI的例子。这个例子利用J-Interop的API使用Win32_Service类解释WMI操作,将启动和停止在这个例子中的窗口服务。

步骤1:连接到WBEM服务

下面的代码示例显示了使用J-Interop如何初始化DCOM会话,并连接到远程DCOM服务使。它使用SWbemLocator对象连接到SWbemServices,SWbemServices对象提供对本地或远程计算机WMI的访问,它调用“ConnectServer”方法连接到SWbemServices。在本例中,提供管理员级别的用户连接到远程计算机。

JISessiondcomSession=JISession.createSession(domainName,userName,password);

dcomSession.useSessionSecurity(false);

JIComServercomServer=newJIComServer(valueOf("WbemScripting.SWbemLocator"),hostIP,dcomSession);

IJIDispatchwbemLocator=(IJIDispatch)narrowObject(comServer.createInstance().queryInterface(IID));

//parameterstoconnecttoWbemScripting.SWbemLocator

Object[]params=newObject[]{

newJIString(hostIP),//strServer

newJIString(win32_namespace),//strNamespace

JIVariant.OPTIONAL_PARAM(),//strUser

JIVariant.OPTIONAL_PARAM(),//strPassword

JIVariant.OPTIONAL_PARAM(),//strLocale

JIVariant.OPTIONAL_PARAM(),//strAuthority

newInteger(0),//iSecurityFlags

JIVariant.OPTIONAL_PARAM()//objwbemNamedValueSet

};

JIVariantresults[]=wbemLocator.callMethodA("ConnectServer",params);

IJIDispatchwbemServices=(IJIDispatch)narrowObject(results[0].getObjectAsComObject());

(domainName=远程计算机域名,hostIP=远程计算机IP地址,用户名=管理员级别的用户,密码=密码)

第2步:获取Win32_Service实例

一旦你获得对SWbemServices对象的引用,就可以调用这个类的任何方法。其中WbemServices.InstancesOf方法获得任何Win32类的实例。

也可以使用WMI查询语言(WQL)达到同样的目的,如下所示:

finalintRETURN_IMMEDIATE=0x10;

finalintFORWARD_ONLY=0x20;

Object[]params=newObject[]{

newJIString("SELECT*FROMWin32_Service"),

JIVariant.OPTIONAL_PARAM(),

newJIVariant(newInteger(RETURN_IMMEDIATE+FORWARD_ONLY))

};

JIVariant[]servicesSet=wbemServices.callMethodA("ExecQuery",params);

IJIDispatchwbemObjectSet=(IJIDispatch)narrowObject(servicesSet[0].getObjectAsComObject());

第三步:执行方法

现在,已得到Win32_Service类的实例,可采用下述代码来调用同一类的方法,因为,它返回多个服务实例,要列举它们以便获取IJIDispatcher服务。

JIVariant newEnumvariant = wbemObjectSet.get("_NewEnum");

IJIComObject enumComObject = newEnumvariant.getObjectAsComObject();

IJIEnumVariant enumVariant = (IJIEnumVariant) narrowObject(enumComObject.queryInterface(IJIEnumVariant.IID));

Object[] elements = enumVariant.next(1);

JIArray aJIArray = (JIArray) elements[0];

JIVariant[] array = (JIVariant[]) aJIArray.getArrayInstance();

for (JIVariant variant : array) {

IJIDispatch wbemObjectDispatch = (IJIDispatch) narrowObject(variant.getObjectAsComObject());

JIVariant returnStatus = wbemObjectDispatch.callMethodA("StopService");

System.out.println(returnStatus.getObjectAsInt());

}

现在,下面的代码显示了一个使用WMI启动和停止Windows服务的完整Java类。

packagecom.wmi.windows;

importstaticorg.jinterop.dcom.core.JIProgId.valueOf;

importstaticorg.jinterop.dcom.impls.JIObjectFactory.narrowObject;

importstaticorg.jinterop.dcom.impls.automation.IJIDispatch.IID;

importjava.util.logging.Level;

importorg.jinterop.dcom.common.JIException;

importorg.jinterop.dcom.common.JIRuntimeException;

importorg.jinterop.dcom.common.JISystem;

importorg.jinterop.dcom.core.IJIComObject;

importorg.jinterop.dcom.core.JIArray;

importorg.jinterop.dcom.core.JIComServer;

importorg.jinterop.dcom.core.JISession;

importorg.jinterop.dcom.core.JIString;

importorg.jinterop.dcom.core.JIVariant;

importorg.jinterop.dcom.impls.automation.IJIDispatch;

importorg.jinterop.dcom.impls.automation.IJIEnumVariant;

publicclassServiceManager{

privatestaticStringdomainName="";

privatestaticStringuserName="administrator";

privatestaticStringpassword="";

privatestaticStringhostIP="127.0.0.1";

privatestaticfinalStringwin32_namespace="ROOT\\CIMV2";

privatestaticfinalintSTOP_SERVICE=0;

privatestaticfinalintSTART_SERVICE=1;

privateJISessiondcomSession=null;

publicstaticvoidmain(String[]args){

ServiceManagermanager=newServiceManager();

manager.stopService(domainName,hostIP,userName,password,"MySql");//stopsaservicenamedMySql

}

publicvoidstartService(StringdomainName,Stringhostname,Stringusername,Stringpassword,StringserviceName){

execute(domainName,hostname,username,password,serviceName,START_SERVICE);

}

publicvoidstopService(StringdomainName,Stringhostname,Stringusername,Stringpassword,StringserviceName){

execute(domainName,hostname,username,password,serviceName,STOP_SERVICE);

}

publicvoidexecute(StringdomainName,Stringhostname,Stringusername,Stringpassword,StringserviceName,intaction){

try{

IJIDispatchwbemServices=createCOMServer();

finalintRETURN_IMMEDIATE=0x10;

finalintFORWARD_ONLY=0x20;

Object[]params=newObject[]{

newJIString("SELECT*FROMWin32_ServiceWHEREName='"+serviceName+"'"),

JIVariant.OPTIONAL_PARAM(),

newJIVariant(newInteger(RETURN_IMMEDIATE+FORWARD_ONLY))

};

JIVariant[]servicesSet=wbemServices.callMethodA("ExecQuery",params);

IJIDispatchwbemObjectSet=(IJIDispatch)narrowObject(servicesSet[0].getObjectAsComObject());

JIVariantnewEnumvariant=wbemObjectSet.get("_NewEnum");

IJIComObjectenumComObject=newEnumvariant.getObjectAsComObject();

IJIEnumVariantenumVariant=(IJIEnumVariant)narrowObject(enumComObject.queryInterface(IJIEnumVariant.IID));

Object[]elements=enumVariant.next(1);

JIArrayaJIArray=(JIArray)elements[0];

JIVariant[]array=(JIVariant[])aJIArray.getArrayInstance();

for(JIVariantvariant:array){

IJIDispatchwbemObjectDispatch=(IJIDispatch)narrowObject(variant.getObjectAsComObject());

//Printobjectastext.

JIVariant[]v=wbemObjectDispatch.callMethodA("GetObjectText_",newObject[]{1});

JSP的语法标识有哪几种?

JSP基础语法有:2中注释类型、3个脚本元素、3个指令元素、8个动作指令、9个内置对象。

补充:JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

关于javaintegar和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-06,除非注明,否则均为首码项目网原创文章,转载请注明出处。