前段時(shí)間寫了一篇 解決Jasperreport的web打印另一種方法http://www.blogjava.net/three-3/archive/2010/06/24/324329.html
關(guān)于在web中的打印 套打是經(jīng)常被提到的,這個(gè)需求很廣泛,中間忙了一些其他的事情,到今天才把在Jasperreport實(shí)現(xiàn)web套打的內(nèi)容整理好。
在讀這篇文章之前最好先讀一下上一篇文章,里面有些設(shè)計(jì)到jatoolsprinter的內(nèi)容需要了解一下。
下面開始講述一下整個(gè)套打的過程
1:首先用ireport制作一張?zhí)状虻膱?bào)表如下圖
如下模板所示 在一個(gè)image組件上放上要打印的內(nèi)容,我這里的演示是從數(shù)據(jù)庫中取到的字段打印出來。
至于ireport模板的制作,我這里不做介紹,因?yàn)槲易约阂矝]有接觸多久,會的不一定比你多。
2:創(chuàng)建JSP文件 代碼如下
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="net.sf.jasperreports.engine.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="net.sf.jasperreports.engine.util.*"%>
<%@ page import="net.sf.jasperreports.engine.export.*"%>
<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)
{
//打印文檔對象
var myDoc =
{
settings:
{
pageWidth: 2100, //自定義紙張寬度(單位為十分之一毫米)
pageHeight: 1400, //自定義紙張高度(單位為十分之一毫米)
orientation: 1 //打印方向
},
enableScreenOnlyClass:true, // 使所有使用 screen-only 樣式類的對象,只在預(yù)覽、顯示時(shí)可見,打印時(shí)隱藏
documents: document, // 打印頁面(div)們在本文檔中
marginIgnored: true,
settingsID: 'mydocc', //打印設(shè)置的ID保存在注冊表中
copyrights: '杰創(chuàng)軟件擁有版權(quán) www.jatools.com' // 版權(quán)聲明必須
};
// 調(diào)用打印方法
if(how == '打印預(yù)覽')
jatoolsPrinter.printPreview(myDoc,true ); // 打印預(yù)覽
else if(how == '打印')
jatoolsPrinter.print(myDoc ,true); // 打印前彈出打印設(shè)置對話框
else
jatoolsPrinter.print(myDoc ,false); // 不彈出對話框打印
}
</script>
<body bgcolor="white">
<br>
<input type="button" value="打印預(yù)覽" onClick="doPrint('打印預(yù)覽')">
<input type="button" value="打印" onClick="doPrint('打印')">
<input type="button" value="打印" onClick="doPrint('打印')">
<br>
<%
File reportFile = new File(application
.getRealPath("/jasper/taoda.jasper"));
JasperReport jasperReport = (JasperReport) JRLoader
.loadObject(reportFile.getPath());
Map parameters = new HashMap();
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/DataName", "user", "password");
JasperPrint jasperPrint = JasperFillManager.fillReport(
jasperReport, parameters, conn);
JRXhtmlExporter exporter = new JRXhtmlExporter();
StringBuffer sbuffer = new StringBuffer();
Map imagesMap = new HashMap();
session.setAttribute("IMAGES_MAP", imagesMap);
exporter
.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
exporter
.setParameter(JRHtmlExporterParameter.IMAGES_MAP, imagesMap);
String imgServDirUrl = "/images/";
File imgRealDir = new File(request.getRealPath(File.separator)
+ imgServDirUrl);
if (!imgRealDir.exists()) {
imgRealDir.mkdirs();
}
exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, request
.getContextPath()
+ imgServDirUrl);
exporter.setParameter(JRHtmlExporterParameter.IMAGES_DIR,
imgRealDir);
exporter.setParameter(
JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR,
Boolean.TRUE);
exporter.setParameter(
JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN,
Boolean.FALSE);
exporter.exportReport();
conn.close();
%>
其中以下內(nèi)容為jatoolsprinter所需代碼
<OBJECT ID="jatoolsPrinter"
CLASSID="CLSID:B43D3361-D975-4BE2-87FE-057188254255"
codebase="jatoolsPrinter.cab#version=5,3,0,0"></OBJECT>
function doPrint(how)
{
//打印文檔對象
var myDoc =
{
settings:
{
pageWidth: 2100, //自定義紙張寬度(單位為十分之一毫米)
pageHeight: 1400, //自定義紙張高度(單位為十分之一毫米)
orientation: 1 //打印方向
},
enableScreenOnlyClass:true, // 使所有使用 screen-only 樣式類的對象,只在預(yù)覽、顯示時(shí)可見,打印時(shí)隱藏
documents: document, // 打印頁面(div)們在本文檔中
marginIgnored: true,
settingsID: 'mydocc', //打印設(shè)置的ID保存在注冊表中
copyrights: '杰創(chuàng)軟件擁有版權(quán) www.jatools.com' // 版權(quán)聲明必須
};
// 調(diào)用打印方法
if(how == '打印預(yù)覽')
jatoolsPrinter.printPreview(myDoc,true ); // 打印預(yù)覽
else if(how == '打印')
jatoolsPrinter.print(myDoc ,true); // 打印前彈出打印設(shè)置對話框
else
jatoolsPrinter.print(myDoc ,false); // 不彈出對話框打印
起先在在jasperreprot中輸出格式為html 背景圖一直不顯示,單獨(dú)放一張圖片,圖片上不要有其他組件,就會顯示,一直沒搞清楚這個(gè)問題是什么原因,但是輸出格式為xhtml的時(shí)候圖片就會顯示。
3:修改JRXhtmlExporter代碼
根據(jù)jatoolsprinter的規(guī)范,需要在打印的內(nèi)容的div 命名規(guī)則必須為<div id='page'+數(shù)字>
而Jasperreport是利用<a name="JR_PAGE_ANCHOR_?_?"></a>來區(qū)分頁數(shù)所以我們在代碼中找到輸出JR_PAGE_ANCHOR_?_? 的位置在他之后加上
writer.write("<div id='page"+ (pageIndex + 1)+"'>"n");
exportPage(page);
writer.write("</div>"n");
4:預(yù)覽可見,打印不可見。
這樣打印的頁面jatoolsprinter就可以找到了??墒沁€有個(gè)問題,套打一般的問題都是希望那個(gè)底圖在預(yù)覽的時(shí)候可見而打印的時(shí)候不打印,那么這個(gè)問題在jatoolsprinter中是這樣處理的。
找到輸出img信息的位置如下圖
在輸出img 的信息中添加 writer.write(" class=\"screen-only\"");現(xiàn)在底圖就不會被打印出來了。
5:啟動tomcat在web下運(yùn)行
點(diǎn)擊打印預(yù)覽
最后打印效果如下
這篇文章只是對在JsperReport中進(jìn)行套打進(jìn)行了介紹。套打當(dāng)中還會設(shè)計(jì)到其他的一些問題可以參照早先錄的一個(gè)視頻一步一步教你做web套打(http://www.56.com/u11/v_NTA2MjcyMDM.html),這個(gè)就和JsperReport沒有任何關(guān)系了。