在页面和请求中分别使用XML Publisher生成PDF报表且自动上传至附件服务器

两个技术要点:

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。

原文地址:https://www.cnblogs.com/huanghongbo/p/4922389.html