壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2196|回复: 7

[OAF] OAF 导出PDF问题

  [复制链接]
发表于 2011/7/22 09:25:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
      OAF中使用RTF模板导出PDF时,如何把数据库中的HTML标签,在PDF上能够识别出来?
比如<br>换行,在PDF上也同样能起到换行的作用,而不是显示<br>
发表于 2011/7/22 10:34:23 | 显示全部楼层
RTF模板,提供了数据的显示格式,而OAF程序提供数据源。

两项工作是分开来的,所以说,OAF程序又提供数据源又提供显示格式的设计本身就是不合理的。

以下是OAF提供数据源,根据RTF模板显示PDF的代码,提供参考。

1、在点击生成PDF按钮的CO中的代码

import Oracle.cabo.ui.data.DataObject;
import Oracle.jbo.domain.BlobDomain;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletOutputStream;

public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
{
  super.processFormRequest(pageContext, webBean);

  try
  {
    if("print".equals(pageContext.getParameter(EVENT_PARAM)))
    {
      OAApplicationModule am = pageContext.getApplicationModule(webBean);
      Serializable[] serial = new Serializable[]{new Number(pageContext.getParameter("deptno"))};
      BlobDomain blobDomain = (BlobDomain)am.invokeMethod("generatePdfDoc", serial, new Class[]{Number.class});

      DataObject dataobject = pageContext.getNamedDataObject("_SessionParameters");
      HttpServletResponse httpservletresponse = (HttpServletResponse)dataobject.selectValue(null, "HttpServletResponse");
      int i = (int)blobDomain.getLength();
      ServletOutputStream servletoutputstream = httpservletresponse.getOutputStream();
      if (i > 0)
      {
        byte abyte0[] = blobDomain.toByteArray();
        httpservletresponse.setContentType("application/pdf");
        httpservletresponse.setContentLength(i);
        httpservletresponse.setHeader("Content-Disposition", "Attachment;Filename=BillDocument.pdf");
        servletoutputstream.write(abyte0, 0, abyte0.length);
        servletoutputstream.flush();
        servletoutputstream.close();
      }
    }
  }
  catch (Exception e)
  {
    e.printStackTrace();
    throw OAException.wrapperException(e);
  }
}

2、相应AM中的代码
import Oracle.apps.xdo.XDOException;
import Oracle.apps.xdo.template.FOProcessor;
import Oracle.apps.xdo.template.RTFProcessor;
import Oracle.jbo.domain.BlobDomain;
import Oracle.jbo.XMLInterface;
import Oracle.xml.parser.v2.XMLNode;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;

private static final String RTF_FILE = "d:\\BI_file\\15.rtf";

public BlobDomain generatePdfDoc(Number deptNum)
{
  BlobDomain blobDomain = new BlobDomain();
  try
  {
    DeptVOImpl vo = getDeptVO2();
    vo.setWhereClause(null);
    vo.setWhereClauseParams(null);
    vo.setWhereClause(" dept_no = :1 ");
    vo.setWhereClauseParam(0, deptNum);
    vo.executeQuery();

    //created the XSL template by RTF file.
    RTFProcessor rtfP = new RTFProcessor(RTF_FILE);
    ByteArrayOutputStream baosXSL = new ByteArrayOutputStream();
    rtfP.setOutput(baosXSL);
    rtfP.setExtractAttributeSet(RTFProcessor.EXTRACT_DISABLE);
    rtfP.process();

    //created the XML data by VO
    ByteArrayOutputStream baosXML = new ByteArrayOutputStream();
    ((XMLNode)vo.writeXML(4, XMLInterface.XML_OPT_ALL_ROWS)).print(baosXML);
    System.out.println(baosXML.toString());

    //created the PDF file by XSL and XML
    FOProcessor fop = new FOProcessor();
    fop.setData(new ByteArrayInputStream(baosXML.toByteArray()));
    fop.setTemplate(new ByteArrayInputStream(baosXSL.toByteArray()));
    fop.setOutput(blobDomain.getOutputStream());
    fop.setOutputFormat(FOProcessor.FORMAT_PDF);
    fop.generate();
  }
  catch (IOException ioe)
  {
    ioe.printStackTrace();
  }
  catch (XDOException e)
  {
    e.printStackTrace();
  }

  return blobDomain;
}




发表于 2011/7/22 10:36:09 | 显示全部楼层
  
如果希望让PDF文件在一个新弹出的浏览器中打开,需要进行以下的改动
  
  
1.1、在原来CO.processRequest()中追加
  
  
    ((OAImageBean)webBean.findChildRecursive("item1")).setAttributeValue(TARGET_FRAME_ATTR,  "_blank");--item1就是原来点击后,输出PDF文件的按钮
  
  
1.2、删除名叫“item1”的image的fireAction属性,追加它的destination属性值为:
  
  
OA.jsp?page=/companyName/Oracle/apps/name/bi/webui/PDFPG&deptno={@DeptNo}
  
  
1.3、创建一个新的PDFPG.xml和PDFCO.java
  
  
1.4、将原来CO.processFormRequest()中的代码复制到PDFCO.processRequest()中并做如下修改
  
  
httpservletresponse.setHeader("Content-Disposition",  "Attachment;Filename=BillDocument.pdf");
  
  
改为
  
  
httpservletresponse.setHeader("Content-Disposition",  "inline;Filename=BillDocument.pdf");
  

 楼主| 发表于 2011/7/26 10:46:39 | 显示全部楼层
html标签,我用replace替换了,效果也还行。

另外:sumury,想再请教一个问题,就是RTF模板导出PDF里面,如何生成目录?
         
         比如说合同条款里面很多章节及条款,就得需要一个目录
发表于 2011/7/26 12:51:54 | 显示全部楼层
rtf提供模板,OAF可以提供数据源,至于目录,需要你自己来完成了,

比如在rtf模板中先写好,或者由OAF的通过SQL,动态生产目录。
 楼主| 发表于 2011/7/26 13:45:26 | 显示全部楼层
目录的页码怎么动态改变呢
发表于 2011/7/26 14:24:31 | 显示全部楼层
页码应该是pdf全部生成好以后,才能订下来的,这个就跟OAF没有关系了。

你说,是吗?
 楼主| 发表于 2011/7/26 17:35:18 | 显示全部楼层
呵呵。。有没有具体的解决办法呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 00:48 , Processed in 0.018399 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表