在页面和请求中分别使用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。

时间: 2024-12-26 12:49:31

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

OAF 中下载使用XML Publisher下载PDF附件

OAF doesn't readily expose the Controller Servlet's HttpRequest and HttpResponse objects so you need to extract it from the OAPageContext object via: HttpServletResponse response = (HttpServletResponse) pageContext.getRenderingContext().getServletRes

使用XML Publisher导出PDF报表

生成XML数据源有两种方式. 一种是使用存储过程,返回一个clob作为xml数据源. 另一种是直接使用VO中的数据生成xml数据源. 方法一参考: Oracle XML Publisher技巧集锦 OAF与XML Pulisher集成 方式二: CO if ( "PrintDis".equals(l_enent)) { String DistributionId = pageContext.getParameter("DistributionId"); parame

修改eclipse中java和xml页面的字体的样式

代码编辑界面默认颜色为白色.对于长期使用电脑编程的人来说,白色很刺激我们的眼睛,所以改变workspace的背景色,可以使眼睛舒服一些.设置方法如下: 1.打开window / Preference,弹出Preference面板  2.展开General标签,选中Editors选项,展开.  3.选中 Text Editors,右边出现TestEditors面板. 面板中有这样一个选项:Appearance color options:其中是各种板块颜色的设置,其中有一项是background

Json数据如果作为配置文件比较难读懂,XML文件作为配置文件有先天的优势,容易读懂和配置,因此不考虑效率时,在页面中宁可用XML文件作为配置文件再用JS做一次转化把XML转成JSON使用

比如如下相对比较复杂的XML <myobjects> <!--object 1--> <myobject> <id>yourID_1</id> <name>your name</name> <description> <![CDATA[Merck Biologics Pilot Plant ]]> </description> <locations> <location

HTTP请求中POST与GET的区别

本文章已收录于: 一.原理区别 一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式. HTTP定义了与服务器交互的不同方法,其中最基本的四种:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被称为安全方法,因为使用GET和HEAD的HTTP请求不会产生什么动作.不会产生动作意味着GET和HEAD的HTTP请求不会在服务器上产生任何结果.但是安全方法并不是什么动作都不产生

HTTP请求中POST与GET的差别

一.原理差别 一般我们在浏览器输入一个网址訪问站点都是GET请求;再FORM表单中,能够通过设置Method指定提交方式为GET或者POST提交方式,默觉得GET提交方式. HTTP定义了与server交互的不同方法,当中最主要的四种:GET.POST,PUT,DELETE.HEAD,当中GET和HEAD被称为安全方法,由于使用GET和HEAD的HTTP请求不会产生什么动作.不会产生动作意味着GET和HEAD的HTTP请求不会在server上产生不论什么结果. 可是安全方法并非什么动作都不产生.

Struts2框架action路径问题心得----》页面url请求怎么找action

Struts2 页面url请求怎么找action Struts2 页面url请求如何找action 1.我们使用最原始的方法去查找action,不同注解. struts.xml文件先配置 <!-- 新闻信息action --><action name="newsInfoAction" class="com.xxx.NewsInfoAction"><result name="add">news/addNewsIn

详解Struts1中的struts-config.xml配置文件【一】

搞清楚struts-config.xml中各项元素的作用,对于我们构建web项目有莫大的好处.<struts-config>是struts的根元素,它主要有8个子元素,DTD定义如下: <!ELEMENT struts-config (data-sources?,form-beans?,global-exceptions?,global-forwards?, action-mappings?,controller?,message-resources*,plug-in*)> 以上8

HTTP请求中浏览器缓存

本文导读:浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制.客户端缓存是否需要是可以在服务端代码上控制的.那就是响应头.响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容:如果请求信息是需要认证或者安全加密的,相应内容也不会被缓存.那么,HTTP请求中浏览器是如何缓存数据呢? 一.HTTP请求中浏览器缓存流程图 1.浏览器第一次请求 2.浏览器再次请求时 二.HTTP请求中浏览器缓存流程的文字描述 1.当资源第一次被访问的时候,HTTP头部如下 (Request-Line) GET /