XPI的POI – 在富文本字段中将Word文档另存为附件

我正在使用OpenNTF POI 4 XPages插件。 这非常适合生成Word文档。 现在,在生成Word文档之后,我想创建一个新的响应文档,并将word文档作为附件存储在此响应文档的富文本字段中。 这是我的代码(在POI 4 XPages小部件的poi postGenerationProcess属性中):

var doc:NotesDocument = currentDocument.getDocument(); var rdoc:NotesDocument = database.createDocument(); rdoc.appendItemValue("Form", "frmRespTempl"); rdoc.appendItemValue("Subject", "Embedded Word Document"); var rtitem:NotesRichTextItem = rdoc.createRichTextItem("Body"); rtitem.embedObject(xwpfdocument); rdoc.makeResponse(doc); rdoc.save(); 

不幸的是,这给了我错误:

 com.ibm.jscript.InterpretException: Script interpreter error, line=13, col=8: [TypeError] Method NotesRichTextItem.embedObject(org.apache.poi.xwpf.usermodel.XWPFDocument) not found, or illegal parameters 

我有什么技巧可以达到这个目的吗?

实施Knut Hermann下面提出的建议,我得到:

POI 4 XPages – >错误

错误:Documentgeneration POI LIB期间出错:1.2.6.201312211419 StackTrace:com.ibm.xsp.exception.EvaluationExceptionEx:在com.ibm.xsp.binding.javascript.JavaScriptMethodBinding.invoke(JavaScriptMethodBinding.java:126)执行JavaScript动作表达式时出错at biz.webgate.dominoext.poi.component.containers.UIDocument $ 1.run(UIDocument.java:300)at java.webgate.dominoext.poi.component.containers.UIDocument $ 1.run(UIDocument.java:1)at java .security.AccessController.doPrivileged(AccessController.java:251)at biz.webgate.dominoext.poi.component.containers.UIDocument.doPostGenerationProcessPrivileged(UIDocument.java:298)at biz.webgate.dominoext.poi.component.containers.UIDocument .postGenerationProcess(UIDocument.java:290)位于biz.webgate.dominoext.poi.component.kernel.dominext.poi.component.kernel.DocumentProcessor.generateNewFile(DocumentProcessor)的biz.webgate.dominoext.poi.component.kernel.DocumentProcessor.processDocument(DocumentProcessor.java:233) .java:143)在biz.webgate.dominoext.poi.component.c ontainers.UIDocument.processAjaxRequest(UIDocument.java:208)位于com.ibm.xsp.actions.ActionGroup.invoke(ActionGroup)的biz.webgate.dominoext.poi.component.actions.DocumentGenerationServerAction.invoke(DocumentGenerationServerAction.java:48)。 java:135)位于com.ibm.sps.x上的javax.faces.component.UICommand.broadcast(UICommand.java:324)中的com.ibm.xsp.application.ActionListenerImpl.processAction(ActionListenerImpl.java:60)at com.ibm.xsp.component.UIEventHandler .broadcast(UIEventHandler.java:366)位于com.ibm.xsp.component.UIDataPanelBase.broadcast(UIDataPanelBase.java:400)的com.ibm.xsp.component.UIDataPanelBase.broadcast(UIDataPanelBase.java:400)com。位于com.ibm.xsp.component.UIDataPanelBase的com.ibm.xsp.extlib.component.layout.UIVarPublisherBase.broadcast(UIVarPublisherBase.java:183)中的ibm.xsp.component.UIDataPanelBase.broadcast(UIDataPanelBase.java:400)。在com.ibm.xsp.component.UIViewRootEx.broadcast(UIViewRootEx.java:1535)的javax.faces.component.UIViewRoot.broadcast广播(UIDataPanelBase.java:400) 事件(UIViewRoot.java:307)位于com.sun.faces上的com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:94)的javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:428) .lifecycle.LifecycleImpl.phase(LifecycleImpl.java:210)位于com.ibm.xsp.controller.FacesControllerImpl.execute(FacesControllerImpl.java:250)的com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:96) )com.ibm.xsp.webapp.FacesServlet.serviceView(FacesServlet.java:223)位于com.ibm.xsp.webapp.FacesServlet的com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:204)。 com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:138)上的com.ibm.xsp.webapp.DesignerFacesServlet.service(DesignerFacesServlet.java:103)中的service(FacesServlet.java:160) .designer.runtime.domino.adapter.ComponentModule.invokeServlet(ComponentModule.java:576)at com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet(NSFComponentModule.java:1281)at com.ibm.designer.ru ntime.domino.adapter.ComponentModule $ AdapterInvoker.invokeServlet(ComponentModule.java:847)位于com.ibm.designer的com.ibm.designer.runtime.domino.adapter.ComponentModule $ ServletInvoker.doService(ComponentModule.java:796)。 run.domino.adapter.ComponentModule.doService(ComponentModule.java:565)位于com.ibm.domino.xsp.module的com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService(NSFComponentModule.java:1265)。 nsf.NSFService.doServiceInternal(NSFService.java:653)位于com.ibm.designer.runtime.domino.adapter.LCDEnvironment的com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:476)。 doService(LCDEnvironment.java:341)at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:297)at com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service( XspCmdManager.java:272)引起:com.ibm.jscript.InterpretException:脚本解释器错误,line = 10,col = 14:在java类’org.apache上调用方法’write(java.io.FileOutputStream)’时出错。 poi.xwpf.us com.ibm.jscript.js上的com.ibm.jscript.types.FavaObject.call(FBSObject.java:161)中的com.ibm.jscript.types.JavaAccessObject.call(JavaAccessObject.java:334)上的ermodel.XWPFDocument’,位于com.ibm.jscript.ASTTree .ASTCall.interpret(ASTCall.java:175)at com.ibm.jscript.ASTTree.ASTProgram.interpret(ASTProgram.java:119)at com.ibm.jscript.ASTTree.ASTProgram.interpretEx(ASTProgram.java:139)at at com.ibm.jscript.JSExpression._interpretExpression(JSExpression.java:435)at com.ibm.jscript.JSExpression.access $ 1(JSExpression.java:424)at com.ibm.jscript.JSExpression $ 2.run(JSExpression.java: 414)在com.ibm.jscript.JSExpression.evaluateValue(JSExpression.java:251)的com.ibm.jscript.JSExpression.interpretExpression(JSExpression.java:410)上的java.security.AccessController.doPrivileged(AccessController.java:284) )com.ibm.jscript.JSExpression.evaluateValue(JSExpression.java:234)位于com.ibm.xsp.binding.javascript.JavaScriptMethodBinding的com.ibm.xsp.javascript.JavaScriptInterpreter.interpret(JavaScriptInterpreter.java:221)中。 invok e(JavaScriptMethodBinding.java:111)… 41更多引起:org.apache.poi.POIXMLException:java.lang.IllegalStateException:org.apache.poi.POIXMLDocument.getProperties中的访问被拒绝(java.lang.RuntimePermission getClassLoader) (POIXMLDocument.java:141)org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:177)at sun.reflect.GeneratedMethodAccessor163.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37 )在com.ibm.jscript.types.JavaAccessObject.call(JavaAccessObject.java:321)的java.lang.reflect.Method.invoke(Method.java:611)中… 54更多引起:java.lang.IllegalStateException :访问被拒绝(java.lang.RuntimePermission getClassLoader)org.apachexbeans.XmlBeans.getContextTypeLoader(XmlBeans.java:336)org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.PropertiesDocument $ Factory.parse(Unknown Source)在org.apache.poi.POIXML文档中的org.apache.poi.POIXMLProperties。(POIXMLProperties.java:75)。 getProperties(POIXMLDocument.java:139)… 59更多引起:java.security.AccessControlException:在java的java.security.AccessController.checkPermission(AccessController.java:108)中拒绝访问(java.lang.RuntimePermission getClassLoader)。 lang.SecurityManager.checkPermission(SecurityManager.java:544)位于太阳下的org.apache.xmlbeans.impl.schema.SchemaTypeLoaderImpl.getContextTypeLoader(SchemaTypeLoaderImpl.java:131)的java.lang.Thread.getContextClassLoader(Thread.java:456)位于org.apache.xmlbeans.XmlBeans的java.lang.reflect.Method.invoke(Method.java:611)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)的.reflect.GeneratedMethodAccessor128.invoke(未知来源) .getContextTypeLoader(XmlBeans.java:327)… 62更多

将Word文档保存到临时文件夹中的文件系统,然后使用rtitem.embedObject将其附加到RichTextItem:

 var temp = java.lang.System.getProperty("java.io.tmpdir"); var file = new java.io.File(temp + "YourFile.docx"); var fileOutputStream = new java.io.FileOutputStream(file); xwpfdocument.write(fileOutputStream); fileOutputStream.close(); var doc:NotesDocument = currentDocument.getDocument(); var rdoc:NotesDocument = database.createDocument(); rdoc.appendItemValue("Form", "frmRespTempl"); rdoc.appendItemValue("Subject", "Embedded Word Document"); var rtitem:RichTextItem = rdoc.createRichTextItem("Body"); rtitem.embedObject(lotus.domino.local.EmbeddedObject.EMBED_ATTACHMENT, "", file.getAbsolutePath(), null); rdoc.makeResponse(doc); rdoc.save(); 

如果您不想将文件保存到文件系统中,请改为创建MIMEEntity,并将Word内容直接流式传输到Notes文档( Java代码段作为起点)。

Notes API需要一个文件,而不是Java对象。 我建议您使用MIME文档方法,将Base64 Doc作为mime部分