两个技术要点:
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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)