2005年,在BI Publisher(开始叫XML Publisher)推出不久后,我在项目上面利用Form个性化+OAF+XML Publisher的API来实现了一个即时打印的功能,后面在ITPUB上面发布了一个修剪版,之后据我所知,很多项目中采用了这个解决方案,同时也有其他同事采用了相似的方法进行了其它方式的即时打印。由于最近又有人有这样即时打印的需求而问我索要相关的程序和资料,因此一并整理一个完整的版本供大家参考。
1,实现逻辑
- 在Form上面使用个性化,将需要打印的单据ID(如采购订单界面上的po_header_id,只要能唯一确定界面上记录的值就可以)和对应的XML Publisher的报表模版编号通过参数的形式传给OAF页面。单据ID用来传递给PLSQL程序取出报表的XML数据;模板变化用来给Java程序取得模板的定义信息
- 页面处理根据传入的单据ID,在Java中调用PL/SQL去取出对应的数据,并生成XML格式的XML数据
- 通过XML Publisher API取得需要的报表模版文件定义信息
- 再调用XML Publisher API合并XML数据和报表模版生成PDF
- 将生成的PDF文件以文件流的方式传送给IE浏览器
- 即时在浏览器中打开PDF文件
我当时画了一个简单的流程图:
2,如何使用我提供的即时打印解决方案
- 安装设置附件提供的OAF页面,具体安装请看文档中“安装设置”部分(只需要做一次)
- 编写PLSQL程序来取得报表的数据,需要生成XML格式,然后在HAND_BILL_PRINT_PKG.BILLXMLGEN方法中通过p_document_type参数来区分不同的报表取数,可见附件提供的例子
- 通过rtf格式设计报表模板,然后将其注册到Oracle EBS系统中
- 在需要即时打印的Form界面上面使用个性化功能启用一个菜单项,菜单项调用上面安装好的OAF对应的功能,并提供参数,具体查看文档中的“Form个性化”部分
- 将上面定义的OAF功能添加到需要即时打印职责对应菜单下,菜单项的Prompt/提示为空
- 点击个性化定义的菜单项来打印报表
3,涉及的技术
OAF实现的页面相当于打印的一个框架,如果有新的即时打印需要开发,只需编写对应的PLSQL程序来取得XML数据;同时设计rtf模板就可以进行扩展,因此无需再关注具体打印的技术实现。
整个实现涉及的技术有:
- 在PL/SQL中将查询出来的数据生产XML结构的数据
- Java中怎么调用XML Publisher API 取得模版文件
- Java中怎么根据XML和模版数据通过XML Publisher API 生产PDF
- 如何将生成的PDF作为数据流的方式输出给IE浏览器
- Form个性化
4,附件的内容
- 打印OAF的JDeveloper项目文件
- 打印的OAF程序源代码和Java Class文件
- 取得报表XML数据的PLSQL样例包HAND_BILL_PRINT_PKG
- 将OAF页面导入到Oracle EBS系统的XMLImport导入脚本样例
- 即时打印的技术设计和安装文档
源代码和文档下载(需要先注册):Form个性化+OAF+BIPublisher实现即时打印 (343)