﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-kevinyao</title><link>http://www.blogjava.net/kevinyao/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 01:00:01 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 01:00:01 GMT</pubDate><ttl>60</ttl><item><title>WEB开发中水晶报表的使用心得</title><link>http://www.blogjava.net/kevinyao/archive/2005/01/18/414.html</link><dc:creator>Kevin Yao</dc:creator><author>Kevin Yao</author><pubDate>Tue, 18 Jan 2005 00:48:00 GMT</pubDate><guid>http://www.blogjava.net/kevinyao/archive/2005/01/18/414.html</guid><wfw:comment>http://www.blogjava.net/kevinyao/comments/414.html</wfw:comment><comments>http://www.blogjava.net/kevinyao/archive/2005/01/18/414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kevinyao/comments/commentRss/414.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kevinyao/services/trackbacks/414.html</trackback:ping><description><![CDATA[<P><STRONG><FONT size=1>[需求]</FONT></STRONG></P>
<P><FONT size=1>最近在项目开发过程中，客户要求用Crystal Reports生成pdf格式的报表，并实现自动打印功能。</FONT></P>
<P><STRONG><FONT size=1>[实施索引]</FONT></STRONG></P>
<P><FONT size=1>1、创建水晶报表；</FONT></P>
<P><FONT size=1>2、Java中利用报表组件包将报表结果生成pdf；</FONT></P>
<P><FONT size=1>3、完成自动打印功能。</FONT></P>
<P><STRONG><FONT size=1>[详细步骤]</FONT></STRONG></P>
<P><FONT size=1>1、创建水晶报表</FONT></P>
<P><FONT size=1>如果业务要求比较复杂，要先创建临时表和存储过程，假设DB是ORACLE。</FONT></P>
<P><FONT size=1>1.1、创建临时表</FONT></P>
<P><FONT size=1>CREATE&nbsp; global TEMPORARY TABLE&nbsp; <EM>table_name_temporary</EM><BR>(&nbsp; .........&nbsp;) on commit preserve rows;</FONT></P>
<P><FONT size=1>注：这种方式确保session之间，数据互不干扰。</FONT></P>
<P><FONT size=1>1.2、创建存储过程</FONT></P>
<P><FONT size=1>创建包体，包体内声明游标。</FONT></P>
<P><FONT size=1>根据业务逻辑，将数据保存在临时表中，返回水晶报表所需要的结果集。</FONT></P>
<P><FONT size=1>1.3、创建水晶报表</FONT></P>
<P><FONT size=1>以存储过程做为数据源，创建水晶报表。</FONT></P>
<P><FONT size=1>2、Java中利用报表组件包将报表结果生成pdf</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要步骤如下：</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）登录CrystalEnterprise；</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）设置report参数，检索report；</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）登录DB Server；</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （4）输出结果到pdf。</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要代码如下：</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IEnterpriseSession enterpriseSession = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;ReportClientDocument clientDoc = null;</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISessionMgr sessionMgr = CrystalEnterprise.getSessionMgr();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enterpriseSession = sessionMgr.logon(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAS_ADMINISTRATOR,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAS_ADMIN_PWD, RASServer,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAS_SEC);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IInfoStore iStore = (IInfoStore) enterpriseSession<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getService(EAPTPrintConstants.RAS_INFOSTORE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IReportAppFactory reportAppFactory = (IReportAppFactory) enterpriseSession<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getService(EAPTPrintConstants.RAS_REPORT_FACTORY);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String query = "Select SI_ID From CI_INFOOBJECTS Where SI_NAME = '"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + reportname + "' And SI_INSTANCE = 0 ";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IInfoObjects result = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = iStore.query(query);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SDKException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IInfoObject firstResult = (IInfoObject) result.get(0);</FONT></P>
<P><FONT size=1></FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientDoc = reportAppFactory.openDocument(firstResult, 0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Locale.ENGLISH);</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //logon to DataBase<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DatabaseController db = clientDoc.getDatabaseController();</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // need to transfer arguments</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.logonEx(dbServer, sid, username,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password);</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientDoc.refreshReportDocument();</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setParameters(clientDoc, map);&nbsp;</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayInputStream byteIS = (ByteArrayInputStream) clientDoc<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getPrintOutputController().export(ReportExportFormat.PDF);</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte byteArray[] = new byte[byteIS.available()];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream fileOS = new FileOutputStream(filename);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayOutputStream byteOS = new ByteArrayOutputStream(byteIS<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .available());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = byteIS.read(byteArray, 0, byteIS.available());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byteOS.write(byteArray, 0, x);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byteOS.writeTo(fileOS);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byteOS.close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileOS.close();</FONT></P>
<P><FONT size=1>3、完成自动打印功能</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)&nbsp;利用Itext技术重新处理pdf，在已生成的pdf里加上以下代码：</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String js = "var pp = this.getPrintParams();\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; js = js + "var fv = pp.constants.flagValues;\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; js = js + "pp.flags = fv.setPageSize;\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; js = js + "pp.interactive = pp.constants.interactionLevel.automatic;\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; js = js + "pp.printerName = \"" + printer + "\";\n";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; js = js + "this.print(pp);\n";</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)jsp中需要IFrame标签，然后自动调用Servlet，在servlet里将pdf输出来，直接输出到打印机上。</FONT></P><img src ="http://www.blogjava.net/kevinyao/aggbug/414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kevinyao/" target="_blank">Kevin Yao</a> 2005-01-18 08:48 <a href="http://www.blogjava.net/kevinyao/archive/2005/01/18/414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>