两个技术要点:
1.使用TemplateHelper.processTemplate方法生成目标PDF的InputStream流,再使用ftp中上传流的方法将其上传至附件服务器。
2.在请求中调用AM。
其中最重要的方法便是在请求中调用AM。
SourcingPrintingAMImpl am = (SourcingPrintingAMImpl)getSourcingAppModule(cpContext);
OADBTransaction trans = am.getOADBTransaction();
protected OAApplicationModuleImpl getSourcingAppModule(CpContext cpcontext) { OAApplicationModuleImpl oaapplicationmoduleimpl = (OAApplicationModuleImpl) OAApplicationModuleFactory.createRootOAApplicationModule( cpcontext, sourcingPrintingAmName); return oaapplicationmoduleimpl; }//End of getSourcingAppModule(CpContext)
一、在页面的CO中直接生成XML Publisher生成报表且自动上传至附件服务器
/** * @param pageContext * @param webBean * @return * 此方法中利用TemplateHelper.processTemplate生成了附件的流文件, * Map 函数返回附件流文件,附件名称,以及附件大小 */ public Map generatePreviewPDFFile(OAPageContext pageContext, OAWebBean webBean){ Map map = new java.util.HashMap(); String mappingId = (String)pageContext.getTransactionValue("mappingId"); String suppCateMappingId = pageContext.getParameter("CuxSuppCateMappingId"); LogUtil.of("generatePreviewPDFFile mappingId= "+mappingId+" suppCateMappingId="+suppCateMappingId,pageContext).print(pageContext); CLOB xmlClob =this.getSuppRegXMLClob(pageContext, webBean, mappingId, suppCateMappingId); String fileName = "新供应商注册审核报告_"; try { Reader inputReader = xmlClob.getCharacterStream(); ByteArrayOutputStream pdfFile = new ByteArrayOutputStream(); OADBTransactionImpl oaTrans = (OADBTransactionImpl)pageContext.getApplicationModule(webBean).getOADBTransaction(); String templateName = "CUX_NEW_SUPP_REG_APPR_RPT"; TemplateHelper.processTemplate(oaTrans.getAppsContext(), "CUX", templateName, oaTrans.getUserLocale().getLanguage(), oaTrans.getUserLocale().getCountry(), inputReader, TemplateHelper.OUTPUT_TYPE_PDF, null, pdfFile); byte[] b = pdfFile.toByteArray(); InputStream input = new ByteArrayInputStream(pdfFile.toByteArray()); String ftpFileName = fileName + suppCateMappingId + ".pdf"; map.put("ftpInputStream",input); map.put("ftpFileName",ftpFileName); map.put("ftpFileLength",String.valueOf(b.length)); previewPDFStream = input; previewPDFFileName = ftpFileName; previewPDFFileLength = String.valueOf(b.length); pdfFile.flush(); pdfFile.close(); } catch (Exception e) { throw new OAException("generatePreviewPDFFile Error", OAException.ERROR); } return map; }
只要得到附件的流文件之后,一切的操作就变得简单了,使用ftp上传附件的方法上传此流文件即可。
注意:
// 命名文件,将文件名编码转为标准编码,否则中文文件名上载后为乱码文件名
// TelnetOutputStream os = ftpClient.put(fileName);
TelnetOutputStream os = null;
os = ftpClient.put(new String(fileName.getBytes("GBK"), "ISO-8859-1"));
二、在请求的代码中中直接生成XML Publisher生成报表且自动上传至附件服务器
和页面中的generatePDFFile方法大致相同,唯一不同的就是在请求中不能直接调用AM,需要使用前文的方法初始化一个AM。
时间: 2024-12-26 12:49:31