解決Jasperreport的web打印另一種方法

          昨天下了jasperreport的最新版本3.7.3看了下。弄了半天還是沒(méi)能習(xí)慣他的報(bào)表制作方式。看了下他的打印是利用applet的來(lái)打印的。而且還需要客戶端安裝 十幾MB的 jre 關(guān)于這個(gè)好壞,每個(gè)人都有自己的看法。今天我這里要說(shuō)的是利用jatoolsprinter控件來(lái)打印jasperreport的報(bào)表。控件大小只有100k左右         關(guān)于jasperreport的報(bào)表制作這里不做說(shuō)明,我是在環(huán)境中跑了下jasperreport的demo運(yùn)行界面如下


          運(yùn)行JSP Example 如下圖

          下面我們對(duì)demo中的html.jsp進(jìn)行修改 用jatoolsprinter來(lái)打印Jasperreport 的報(bào)表
          藍(lán)色部分為控件需要的內(nèi)容
          <%@ page contentType="text/html; charset=gb2312" language="java" %>
          <%@ page errorPage="error.jsp" %>
          <%@ page import="datasource.*" %>
          <%@ page import="net.sf.jasperreports.engine.*" %>
          <%@ page import="net.sf.jasperreports.engine.util.*" %>
          <%@ page import="net.sf.jasperreports.engine.export.*" %>
          <%@ page import="net.sf.jasperreports.j2ee.servlets.*" %>
          <%@ page import="java.util.*" %>
          <%@ page import="java.io.*" %>
          <html>
          <head>

          <!-- 插入打印控件 -->
          <OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D975-4BE2-87FE-057188254255"
          codebase="jatoolsPrinter.cab#version=5,3,0,0"></OBJECT>
          </head>
          <script type="text/javascript">
          function doPrint(how)
          {
             
          //打印文檔對(duì)象
              var myDoc ={
                  documents: document,    // 打印頁(yè)面(div)們?cè)诒疚臋n中
                  copyrights :    '杰創(chuàng)軟件擁有版權(quán)
          [url=]www.jatools.com'[/url]              // 版權(quán)聲明,必須

                 };
                   
              // 調(diào)用打印方法
              if(how == '打印預(yù)覽...')
              jatoolsPrinter.printPreview(myDoc,true );   // 打印預(yù)覽
                           
             else if(how == '打印...')
                jatoolsPrinter.print(myDoc ,true);   // 打印前彈出打印設(shè)置對(duì)話框
                         
             else
                jatoolsPrinter.print(myDoc ,false);       // 不彈出對(duì)話框打印
          }
          </script>
          <body>

          <br>
          <input type="button" value="打印預(yù)覽...">
          <input type="button" value="打印...">
          <input type="button" value="打印">
          <br>


          <%
          File reportFile = new File(application.getRealPath("/reports/WebappReport.jasper"));
              if (!reportFile.exists())
             throw new JRRuntimeException("File WebappReport.jasper not found. The report design must be compiled first.");
          JasperReport jasperReport = (JasperReport)JRLoader.loadObject(reportFile.getPath());
          Map parameters = new HashMap();
          parameters.put("ReportTitle", "Address Report");
          parameters.put("BaseDir", reportFile.getParentFile());
             
          JasperPrint jasperPrint =
             JasperFillManager.fillReport(
              jasperReport,
              parameters,
              new WebappDataSource()
              );
             
          JRHtmlExporter exporter = new JRHtmlExporter();
          session.setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);

          exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
          exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
          exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "../servlets/image?image=");

          exporter.exportReport();
          %>
          </body>
          </html>


          因?yàn)?a target="_blank">jatoolsprinter的打印是根據(jù)<div id='page'+數(shù)字>來(lái)區(qū)分打印的頁(yè)的。而Jasperreport生成的html頁(yè)面中又沒(méi)有包含這些信息,所以我們就需要修改下Jasperreport的源碼
          由生成的報(bào)表頁(yè)面的源碼中我們可以看到Jasperreport是利用<a name="JR_PAGE_ANCHOR_?_?"></a>來(lái)區(qū)分頁(yè)數(shù)的我們可以找到package net.sf.jasperreports.engine.export 下的JRHtmlExporter.java 找到代碼中的exportReportToWriter方法里的如下片段
          writer.write("<a name=\"" + JR_PAGE_ANCHOR_PREFIX + reportIndex + "_" + (pageIndex + 1) + "\"></a>\n");
          在這段代碼之后加上
          writer.write("<div id='page"+ (pageIndex + 1)+"'>\n");
          然后找到源碼中的
          exportPage(page);
          在他之后加上div的結(jié)束標(biāo)志
          writer.write("</div>\n");
          以上代碼藍(lán)色部分為后添加的內(nèi)容


          修改之后的代碼如下
          writer.write("<a name=\"" + JR_PAGE_ANCHOR_PREFIX + reportIndex + "_" + (pageIndex + 1) + "\"></a>\n");
               
               writer.write("<div id='page"+ (pageIndex + 1)+"'>\n");
               

                /*   */
                exportPage(page);
               
               
          writer.write("</div>\n");
          修改完這些之后我們就把jatoolsPrinter.cab放在項(xiàng)目中html.jsp
          <OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D975-4BE2-87FE-057188254255"
          codebase="jatoolsPrinter.cab#version=5,3,0,0"></OBJECT>


          codebase指定的位置這里指定的是和html.jsp同一路徑

          現(xiàn)在打開(kāi)IE 運(yùn)行 demo
          第一次運(yùn)行會(huì)提示安裝jatoolsprinter控件 選擇安裝ActiveX控件


          點(diǎn)擊安裝


          點(diǎn)擊打印預(yù)覽效果如下



          到此就可以在web頁(yè)面中直接打印Jasperreport 報(bào)表了。

          posted on 2010-06-24 13:08 楊慕 閱讀(16572) 評(píng)論(21)  編輯  收藏 所屬分類: 報(bào)表

          評(píng)論

          # re: 解決Jasperreport的web打印另一種方法 2010-06-24 22:07 18傲骨中文

          en 受教了~~~~~~~  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-06-25 08:33 rox

          呵呵,謝謝,這個(gè)比applet是要簡(jiǎn)單些。  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-06-25 09:17 凌晨風(fēng)

          正常分頁(yè)沒(méi)問(wèn)題嗎?字體換行不會(huì)掉字吧?  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-06-25 11:27 楊慕

          @凌晨風(fēng)
          分頁(yè)沒(méi)有問(wèn)題的,不會(huì)掉字。。。
            回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-06-25 11:28 楊慕

          @rox
          今天再研究下套打的實(shí)現(xiàn)。。。  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-06-25 12:01 凌晨風(fēng)

          jasperReport我搞了很長(zhǎng)時(shí)間,主要是使用在國(guó)內(nèi)的保單打印上,典型的套打,雖然使用applet和數(shù)字簽名搞定,但是畢竟龐大,希望和樓主共同探討  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-06-29 13:05 瀟湘振宇

          確實(shí)挺不錯(cuò),以前也弄過(guò)Jasperreport,而且一直在用,但總覺(jué)得其applet的打印方式實(shí)在笨重!
          有時(shí)間也嘗試一下下樓主說(shuō)方式  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-07-05 23:28 來(lái)如風(fēng)

          你這個(gè)是要收費(fèi)的ax空間,除了ie其它瀏覽器估計(jì)就不行了吧  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-07-23 15:26 打印

          @來(lái)如風(fēng)
          看了一下 chrome 和Firefox 都支持的
            回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-07-27 09:25 楊慕

          @凌晨風(fēng)
          前段時(shí)間一直忙別的事情,沒(méi)有顧上,今天套打的做了一個(gè)簡(jiǎn)單的例子。  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-07-27 09:26 楊慕

          @楊慕
          http://www.aygfsteel.com/three-3/archive/2010/07/27/327184.html  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-07-27 09:32 凌晨風(fēng)

          @楊慕
          我一直也在尋求好的報(bào)表控件,國(guó)外有家flash搞的很不錯(cuò),免費(fèi)版的沒(méi)有套打功能,發(fā)我一個(gè)demo吧,laoshulin@gmail.com  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-07-29 09:31 楊慕

          @凌晨風(fēng)
          關(guān)于套打的文章在這里,如果你需要模板文件或者jsp代碼的話我發(fā)給你。。。
          jasperrreprot的版本我用的是最新的。不知道跟你的會(huì)不會(huì)有什么區(qū)別。  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2010-07-29 09:31 楊慕

          @楊慕
          http://www.aygfsteel.com/three-3/archive/2010/07/27/327184.html  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2011-03-23 17:25 類風(fēng)

          最近一天在研究jasperreport套打,關(guān)于在預(yù)覽時(shí)顯示圖片,在打印時(shí)不打印圖片,一直困惑很久不知道怎么實(shí)現(xiàn),希望博主能夠給個(gè)模板文件和jsp代碼參考一下,謝謝!  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2011-03-23 17:25 類風(fēng)

          郵箱:leiflvll@sina.com  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2011-03-23 18:11 凌晨風(fēng)

          @類風(fēng)
          1. 添加一個(gè)參數(shù)去動(dòng)態(tài)控制是否顯示圖片 BPrintShow
          2. 設(shè)置圖片的屬性中 Print When expression為 Boolean.valueOf($P{BPrintShow})
          此時(shí)iReport中就可以測(cè)試通過(guò),代碼中只要設(shè)置相應(yīng)的參數(shù)即可,無(wú)法貼圖給你,如果還有不明白的可以mail我laoshulin@gmail.com
            回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2011-03-24 13:22 類風(fēng)

          在iReport中通過(guò)設(shè)置Print When expression為 Boolean.valueOf($P{BPrintShow})是可以控制是否打印圖片,這個(gè)已嘗試過(guò)。現(xiàn)在就是需要頁(yè)面上點(diǎn)擊【打印】按鈕時(shí)傳遞這個(gè)參數(shù)BPrintShow=false ,不知道在jatoolsprinter的那個(gè)位置加上這句代碼?  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法[未登錄](méi) 2011-12-28 15:41 CC

          可以把源碼發(fā)給我看看嗎 ?謝謝
          305220554@qq.com  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2013-07-02 12:39 gdTo

          貌似很不錯(cuò)的樣子,謝謝分享  回復(fù)  更多評(píng)論   

          # re: 解決Jasperreport的web打印另一種方法 2015-01-27 10:03 灰色

          同樣搞軟件開(kāi)發(fā)的,最近在學(xué)習(xí)使用JasperReports,麻煩樓主把Demo發(fā)一下,
          本人郵箱: hslh22@163.com  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2010年6月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類(3)

          隨筆檔案(3)

          文章檔案(11)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 贺州市| 安义县| 湘乡市| 凤台县| 温泉县| 凤城市| 巴塘县| 米易县| 延津县| 平和县| 庄河市| 满洲里市| 阳春市| 漳浦县| 西和县| 贵阳市| 天水市| 罗田县| 颍上县| 沾益县| 封丘县| 云南省| 曲周县| 珠海市| 安顺市| 泰安市| 通江县| 清河县| 正定县| 太和县| 霍邱县| 卢氏县| 安仁县| 阳信县| 利辛县| 天长市| 林口县| 固阳县| 特克斯县| 两当县| 仙桃市|