zoukankan      html  css  js  c++  java
  • 在页面和请求中分别使用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。

  • 相关阅读:
    Java实现 LeetCode 413 等差数列划分
    Java实现 LeetCode 413 等差数列划分
    Java实现 LeetCode 412 Fizz Buzz
    简单字符设备驱动程序
    fork与vfork的区别
    进程创建函数fork()、vfork() ,以及excel()函数
    区分execl与system——应用程序中执行命令
    CMOS Sensor的调试经验分享
    嵌入式ARM-Linux开发工具下载地址合集
    嵌入式 linux 查看内存
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/4922389.html
Copyright © 2011-2022 走看看