首先说些废话。
基于java开发的web的应用系统的打印问题一直困扰着我。原因是基于web的应用是瘦客户端应用,逻辑集中在服务器上,而打印是基于客户端的行为。
目前基于web的精确打印解决方案主要有两类:一是加强客户端的逻辑;二是在服务器端产生适于精确打印的文件。
流行的打印工具中用applet实现、用浏览器插件实现或是开发嵌入浏览器的客户端的方法属于第一类;而在服务器端产生图片文件、pdf或ps等
精确打印文件的方法属于第二类。
以上流行的解决方案的比较:
方案 打印效果 浏览器依赖 部署代价 维护代价
applet实现 页面控制困难 需要java plug-in插件 无需客户端部署 客户端调整
浏览器插件实现 同本地打印,效果好 依赖特定类型版本的浏览器 客户端动态部署 客户端调整
图片文件实现 页面控制困难 无 无 无
pdf文件实现 同本地打印,效果好 需要acroreader插件 无需客户端部署 无
pdf文件是流行的文件格式,浏览器和pdf阅读器已成为客户端必备的安装内容。对于通用的打印解决方案我认为pdf文件的方式具有更大的灵活性和可用性。
废话到此为止,下面就给出一个servlet通过模板生成pdf文件的实现:
我选择的是报表工具是jfreereport,当然若简单的文本可以使用itext直接产生。
1. jfreereport与was5.0.x的集成
was5.0.x依据j2ee 1.3规范,jaxp/dom/sax的版本分别为1.1/2/2,与jfreereport依赖的gunjaxp.jar中的一致,其他的包也不存在冲突。因此可以将这些
包直接加到web项目的包目录/web-inf/lib中。
jfreereport的包很多,与读取模板、生成报表和生成pdf文件相关的有:
gnujaxp.jar
itext-1.2.2.jar
itextasian.jar
jcommon-0.9.7.jar
jfreereport-0.8.4_11-core.jar
jfreereport-0.8.4_11-misc-configstore-base.jar
jfreereport-0.8.4_11-output-pageable-base.jar
jfreereport-0.8.4_11-output-pageable-pdf.jar
jfreereport-0.8.4_11-output-support-itext.jar
jfreereport-0.8.4_11-output-support-pagelayout.jar
jfreereport-0.8.4_11-parser-base.jar
jfreereport-0.8.4_11-parser-ext.jar
pixie-0.8.1.jar
jfreereport中自带的itext-1.02b.jar版本低,可以替换为新版本,itextasian.jar是生成中文所必须的。
2. 编码和汉字问题
由于我的环境是英文系统(win2k en version + sp4)加装中文支持,为了在开发环境中支持中文必须使用utf-8编码。因此需要对jfreereport中的一些参数进行配置。
需要将org\jfree\report\modules\output\support\itext\configuration.properties文件中的org.jfree.report.modules.output.support.itext.encoding参数设为gbk (或gb18030,请量力而行,我的环境未安装gb18030的支持)。
需要将显示中文的区域的字体和编码分别设为"stsong-light"和"unigb-ucs2-h"。此字体和编码是生成pdf文件时显示中文所必须的,与jfreereport的gui工具的显示无关。
3. 程序示例
我选用了jfreereport中的java look and feel graphics repository的例子,并将部分内容换为中文。以下是直接生成pdf的servlet代码和我变更的报表模板。
//- genpdfbyjfreereporttemplateservlet.java
package acme.web.servlets;
import java.io.ioexception;
import java.net.url;
import javax.servlet.servlet;
import javax.servlet.servletexception;
import javax.servlet.servletoutputstream;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import org.jfree.report.boot;
import org.jfree.report.jfreereport;
import org.jfree.report.demo.swingiconsdemotablemodel;
import org.jfree.report.modules.output.pageable.base.pageablereportprocessor;
import org.jfree.report.modules.output.pageable.pdf.pdfoutputtarget;
import org.jfree.report.modules.parser.base.reportgenerator;
import org.jfree.report.util.log;
import org.jfree.report.util.reportconfiguration;
import org.jfree.xml.elementdefinitionexception;
/**
* @version 1.0
* @author lee s
*/
public class genpdfbyjfreereporttemplateservlet extends httpservlet implements servlet
{
/**
* @see javax.servlet.http.httpservlet#void (javax.servlet.http.httpservletrequest, javax.servlet.http.httpservletresponse)
*/
public void doget(httpservletrequest req, httpservletresponse resp)
throws servletexception, ioexception
{
resp.setcontenttype("application/pdf");
servletoutputstream out = resp.getoutputstream();
try
{
// initialize jfreereport
boot.start();
reportconfiguration.getglobalconfig().setloglevel("error");
// update the log system to use the new settings ...
log.getjfreereportlog().init();
final url in =
getclass().getresource("/acme/web/resources/swing-icons.xml");
if (in == null)
{
throw new exception("swing-icons.xml can't be found.");
}
final jfreereport report = parsereport(in);
report.setdata(new swingiconsdemotablemodel());
pdfoutputtarget target =
new pdfoutputtarget(out, report.getdefaultpageformat());
target.configure(report.getreportconfiguration());
target.open();
pageablereportprocessor proc = new pageablereportprocessor(report);
proc.setoutputtarget(target);
proc.processreport();
target.close();
}
catch (exception ex)
{
system.err.println("generate pdf failed: " + ex);
}
finally
{
try
{
out.close();
}
catch (exception e)
{
system.err.println("output pdf failed: " + e);
}
}
}
/**
* @see javax.servlet.http.httpservlet#void (javax.servlet.http.httpservletrequest, javax.servlet.http.httpservletresponse)
*/
public void dopost(httpservletrequest req, httpservletresponse resp)
throws servletexception, ioexception
{
doget(req, resp);
}
/**
* reads the report from the swing-icons.xml report template.
*
* @param templateurl the template location.
*
* @return a report.
* @throws elementdefinitionexception if the report generator encountered an error.
* @throws ioexception if there was an io error while reading from the url.
*/
private jfreereport parsereport(final url templateurl)
throws ioexception, elementdefinitionexception
{
final reportgenerator generator = reportgenerator.getinstance();
return generator.parsereport(templateurl);
}
}
<?xml version="1.0" encoding="utf-8"?>
<!doctype report-definition
public "-//jfreereport//dtd report definition//en//extended"
"http://jfreereport.sourceforge.net/extreport.dtd">
<!-- ***************************************************************** -->
<!-- * swing-icons.xml * -->
<!-- * a sample report definition used as an introduction to * -->
<!-- * jfreereport. * -->
<!-- ***************************************************************** -->
<report-definition name="first report">
<!-- ************************ -->
<!-- * parser configuration * -->
<!-- ************************ -->
<parser-config>
<object-factory class="org.jfree.report.modules.parser.ext.factory.objects.defaultclassfactory"/>
<element-factory class="org.jfree.report.modules.parser.ext.factory.elements.defaultelementfactory"/>
<stylekey-factory class="org.jfree.report.modules.parser.ext.factory.stylekey.defaultstylekeyfactory"/>
<stylekey-factory class="org.jfree.report.modules.parser.ext.factory.stylekey.pageablelayoutstylekeyfactory"/>
<template-factory class="org.jfree.report.modules.parser.ext.factory.templates.defaulttemplatecollection"/>
<datasource-factory class="org.jfree.report.modules.parser.ext.factory.datasource.defaultdatasourcefactory"/>
</parser-config>
<!-- ************************ -->
<!-- * report configuration * -->
<!-- ************************ -->
<report-config>
<defaultpageformat orientation="portrait"
pageformat="letter"
topmargin="72"
bottommargin="72"
leftmargin="72"
rightmargin="72"/>
</report-config>
<!-- ********** -->
<!-- * styles * -->
<!-- ********** -->
<styles>
<style name="medium-line">
<compound-key name="min-size">
<basic-object name="height">0.0</basic-object>
<basic-object name="width">-100.0</basic-object>
</compound-key>
<basic-key name="paint">black</basic-key>
<basic-key name="stroke" class="java.awt.basicstroke">0.5</basic-key>
<basic-key name="draw-shape">true</basic-key>
<basic-key name="scale">true</basic-key>
</style>
<style name="background-rectangle">
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">0.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">-100.0</basic-object>
<basic-object name="width">-100.0</basic-object>
</compound-key>
<basic-key name="fill-shape">true</basic-key>
<basic-key name="scale">true</basic-key>
</style>
</styles>
<!-- ********************** -->
<!-- * report description * -->
<!-- ********************** -->
<report-description>
<!-- ================= -->
<!-- = report header = -->
<!-- ================= -->
<report-header name="report-header-band">
<style>
<compound-key name="min-size">
<basic-object name="height">112.0</basic-object>
<basic-object name="width">0.0</basic-object>
</compound-key>
</style>
<default-style>
<basic-key name="font">sansserif</basic-key>
<basic-key name="font-size">10</basic-key>
<basic-key name="valignment">bottom</basic-key>
</default-style>
<element name="title1" type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">2.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">18.0</basic-object>
<basic-object name="width">-100.0</basic-object>
</compound-key>
<basic-key name="alignment">center</basic-key>
<basic-key name="font-size">18</basic-key>
<basic-key name="font-bold">true</basic-key>
</style>
<template references="label">
<basic-object name="content">java look and feel graphics repository</basic-object>
</template>
</element>
<element name="description1" type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">32.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">10.0</basic-object>
<basic-object name="width">-100.0</basic-object>
</compound-key>
</style>
<template references="label">
<basic-object name="content">this report lists the icons contained in the java look and feel graphics repository.</basic-object>
</template>
</element>
<element name="description2" type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">44.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">10.0</basic-object>
<basic-object name="width">-100.0</basic-object>
</compound-key>
</style>
<template references="label">
<basic-object name="content">for more information about the repository, refer to:</basic-object>
</template>
</element>
<element name="url1" type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">68.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">10.0</basic-object>
<basic-object name="width">-100.0</basic-object>
</compound-key>
<basic-key name="alignment">center</basic-key>
<basic-key name="font">monospaced</basic-key>
<basic-key name="font-size">9</basic-key>
</style>
<template references="label">
<basic-object name="content">http://developer.java.sun.com/developer/techdocs/hi/repository/</basic-object>
</template>
</element>
<element name="description3" type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">92.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">10.0</basic-object>
<basic-object name="width">-100.0</basic-object>
</compound-key>
</style>
<template references="label">
<basic-object name="content">the design of this report is described in the jfreereport pdf documentation.</basic-object>
</template>
</element>
</report-header>
<!-- ================= -->
<!-- = report footer = -->
<!-- ================= -->
<report-footer name="report-footer-band">
<style>
<compound-key name="min-size">
<basic-object name="height">30.0</basic-object>
<basic-object name="width">0.0</basic-object>
</compound-key>
</style>
<default-style>
<basic-key name="font">sansserif</basic-key>
<basic-key name="font-size">12</basic-key>
<basic-key name="font-bold">true</basic-key>
<basic-key name="valignment">bottom</basic-key>
</default-style>
<element name="rect1" type="shape/generic">
<style>
<extends name="background-rectangle"/>
<basic-key name="paint">#ccffcc</basic-key>
</style>
<template references="rectangle"/>
</element>
<element type="shape/generic">
<style>
<extends name="medium-line"/>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">0.0</basic-object>
</compound-key>
</style>
<template references="horizontal-line"/>
</element>
<element type="shape/generic">
<style>
<extends name="medium-line"/>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">30.0</basic-object>
</compound-key>
</style>
<template references="horizontal-line"/>
</element>
<element name="reporttotallabel" type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">10.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">12.0</basic-object>
<basic-object name="width">-50.0</basic-object>
</compound-key>
<basic-key name="alignment">left</basic-key>
</style>
<template references="label">
<basic-object name="content">report total:</basic-object>
</template>
</element>
<element name="reportcountfield" type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">-50.0</basic-object>
<basic-object name="y">10.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">9.0</basic-object>
<basic-object name="width">-30.0</basic-object>
</compound-key>
<basic-key name="alignment">center</basic-key>
<basic-key name="font-size">9</basic-key>
</style>
<template references="number-field">
<basic-object name="field">overallcount</basic-object>
<basic-object name="format">#0</basic-object>
<basic-object name="nullvalue">-</basic-object>
</template>
</element>
<element name="reportsumfield" type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">-80.0</basic-object>
<basic-object name="y">10.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">9.0</basic-object>
<basic-object name="width">-20.0</basic-object>
</compound-key>
<basic-key name="font-size">9</basic-key>
<basic-key name="alignment">right</basic-key>
<basic-key name="valignment">bottom</basic-key>
</style>
<template references="number-field">
<basic-object name="field">overallsum</basic-object>
<basic-object name="format">#,##0</basic-object>
<basic-object name="nullvalue">-</basic-object>
</template>
</element>
</report-footer>
<!-- =============== -->
<!-- = page header = -->
<!-- =============== -->
<page-header>
<style>
<compound-key name="min-size">
<basic-object name="height">18.0</basic-object>
<basic-object name="width">0.0</basic-object>
</compound-key>
<basic-key name="display-on-firstpage">false</basic-key>
<basic-key name="display-on-lastpage">true</basic-key>
</style>
<default-style>
<basic-key name="font-bold">true</basic-key>
<basic-key name="font-size">9</basic-key>
<basic-key name="font">sansserif</basic-key>
<basic-key name="font-italic">false</basic-key>
<basic-key name="paint">black</basic-key>
<basic-key name="valignment">bottom</basic-key>
</default-style>
<element type="shape/generic">
<style>
<extends name="background-rectangle"/>
<basic-key name="paint">#afafaf</basic-key>
</style>
<template references="rectangle"/>
</element>
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">0.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">14.0</basic-object>
<basic-object name="width">-50.0</basic-object>
</compound-key>
<basic-key name="alignment">left</basic-key>
</style>
<template references="label">
<basic-object name="content">java look and feel graphics repository</basic-object>
</template>
</element>
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">-80.0</basic-object>
<basic-object name="y">0.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">14.0</basic-object>
<basic-object name="width">-20.0</basic-object>
</compound-key>
<basic-key name="alignment">right</basic-key>
</style>
<template references="date-field">
<basic-object name="nullvalue">-</basic-object>
<basic-object name="format">d-mmm-yyyy</basic-object>
<basic-object name="field">report.date</basic-object>
</template>
</element>
<element type="shape/generic">
<style>
<extends name="medium-line"/>
<basic-key name="stroke" class="java.awt.basicstroke">2.0</basic-key>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">16.0</basic-object>
</compound-key>
<basic-key name="paint">#cfcfcf</basic-key>
</style>
<template references="horizontal-line"/>
</element>
</page-header>
<!-- =============== -->
<!-- = page footer = -->
<!-- =============== -->
<page-footer>
<style>
<basic-key name="display-on-lastpage">true</basic-key>
<basic-key name="display-on-firstpage">true</basic-key>
<compound-key name="min-size">
<basic-object name="height">14.0</basic-object>
<basic-object name="width">0.0</basic-object>
</compound-key>
</style>
<default-style>
<basic-key name="font-bold">false</basic-key>
<basic-key name="font-size">9</basic-key>
<basic-key name="font">sansserif</basic-key>
<basic-key name="font-italic">false</basic-key>
</default-style>
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">3.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">9.0</basic-object>
<basic-object name="width">-100.0</basic-object>
</compound-key>
<basic-key name="alignment">center</basic-key>
<basic-key name="valignment">bottom</basic-key>
</style>
<template references="number-field">
<basic-object name="nullvalue">-</basic-object>
<basic-object name="format">page #0</basic-object>
<basic-object name="field">pagenumber</basic-object>
</template>
</element>
</page-footer>
<!-- ========== -->
<!-- = groups = -->
<!-- ========== -->
<groups>
<!-- category group -->
<group name="category">
<fields>
<field>category</field>
</fields>
<group-header>
<style>
<compound-key name="min-size">
<basic-object name="height">30.0</basic-object>
<basic-object name="width">0.0</basic-object>
</compound-key>
</style>
<default-style>
<!-- use such font name & encoding for displaying chinese -->
<basic-key name="font">stsong-light</basic-key>
<basic-key name="font-encoding">unigb-ucs2-h</basic-key>
<basic-key name="font-size">12</basic-key>
<basic-key name="font-bold">true</basic-key>
<basic-key name="font-italic">false</basic-key>
<basic-key name="paint">black</basic-key>
<basic-key name="alignment">left</basic-key>
<basic-key name="valignment">bottom</basic-key>
</default-style>
<element type="shape/generic">
<style>
<extends name="background-rectangle"/>
<basic-key name="paint">#ccccff</basic-key>
</style>
<template references="rectangle"/>
</element>
<element type="shape/generic">
<style>
<extends name="medium-line"/>
<basic-key name="paint">black</basic-key>
</style>
<template references="horizontal-line"/>
</element>
<element type="shape/generic">
<style>
<extends name="medium-line"/>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">30.0</basic-object>
</compound-key>
<basic-key name="paint">black</basic-key>
</style>
<template references="horizontal-line"/>
</element>
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">3.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">12.0</basic-object>
<basic-object name="width">92.0</basic-object>
</compound-key>
</style>
<template references="label">
<basic-object name="content">分类:</basic-object>
</template>
</element>
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">96.0</basic-object>
<basic-object name="y">3.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">12.0</basic-object>
<basic-object name="width">120.0</basic-object>
</compound-key>
</style>
<template references="string-field">
<basic-object name="nullvalue">-</basic-object>
<basic-object name="field">category</basic-object>
</template>
</element>
<element type="text/plain">
<style>
<basic-key name="font-size">8</basic-key>
<basic-key name="font-bold">false</basic-key>
<basic-key name="font-italic">true</basic-key>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">20.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">9.0</basic-object>
<basic-object name="width">-50.0</basic-object>
</compound-key>
</style>
<template references="label">
<basic-object name="content">名称:</basic-object>
</template>
</element>
<element type="text/plain">
<style>
<basic-key name="font-size">8</basic-key>
<basic-key name="font-bold">false</basic-key>
<basic-key name="font-italic">true</basic-key>
<basic-key name="paint">black</basic-key>
<compound-key name="absolute_pos">
<basic-object name="x">-50.0</basic-object>
<basic-object name="y">20.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">9.0</basic-object>
<basic-object name="width">-30.0</basic-object>
</compound-key>
</style>
<template references="label">
<basic-object name="content">图标:</basic-object>
</template>
</element>
<element type="text/plain">
<style>
<basic-key name="font-size">8</basic-key>
<basic-key name="font-bold">false</basic-key>
<basic-key name="font-italic">true</basic-key>
<basic-key name="alignment">right</basic-key>
<compound-key name="absolute_pos">
<basic-object name="x">-80.0</basic-object>
<basic-object name="y">20.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">9.0</basic-object>
<basic-object name="width">-20.0</basic-object>
</compound-key>
</style>
<template references="label">
<basic-object name="content">文件大小:</basic-object>
</template>
</element>
</group-header>
<group-footer>
<style>
<compound-key name="min-size">
<basic-object name="height">30.0</basic-object>
<basic-object name="width">0.0</basic-object>
</compound-key>
<basic-key name="pagebreak-before">false</basic-key>
</style>
<default-style>
<basic-key name="font">sansserif</basic-key>
<basic-key name="font-size">11</basic-key>
<basic-key name="font-bold">true</basic-key>
<basic-key name="font-italic">false</basic-key>
<basic-key name="valignment">bottom</basic-key>
</default-style>
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">5.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">11.0</basic-object>
<basic-object name="width">100.0</basic-object>
</compound-key>
<basic-key name="alignment">left</basic-key>
</style>
<template references="label">
<basic-object name="content">group total:</basic-object>
</template>
</element>
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">-50.0</basic-object>
<basic-object name="y">5.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">9.0</basic-object>
<basic-object name="width">-30.0</basic-object>
</compound-key>
<basic-key name="alignment">center</basic-key>
<basic-key name="font-size">9</basic-key>
</style>
<template references="number-field">
<basic-object name="nullvalue">-</basic-object>
<basic-object name="format">#0</basic-object>
<basic-object name="field">groupcount</basic-object>
</template>
</element>
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">-80.0</basic-object>
<basic-object name="y">5.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">9.0</basic-object>
<basic-object name="width">-20.0</basic-object>
</compound-key>
<basic-key name="font-size">9</basic-key>
<basic-key name="alignment">right</basic-key>
</style>
<template references="number-field">
<basic-object name="nullvalue">-</basic-object>
<basic-object name="format">#,##0</basic-object>
<basic-object name="field">groupsum</basic-object>
</template>
</element>
</group-footer>
</group>
</groups>
<!-- ============= -->
<!-- = item band = -->
<!-- ============= -->
<itemband>
<style>
<compound-key name="min-size">
<basic-object name="height">26.0</basic-object>
<basic-object name="width">0.0</basic-object>
</compound-key>
</style>
<default-style>
<basic-key name="font">stsong-light</basic-key>
<basic-key name="font-encoding">unigb-ucs2-h</basic-key>
<basic-key name="font-size">10</basic-key>
<basic-key name="valignment">bottom</basic-key>
</default-style>
<element type="shape/generic">
<style>
<extends name="medium-line"/>
<basic-key name="stroke" class="java.awt.basicstroke">0.1</basic-key>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">25.0</basic-object>
</compound-key>
<basic-key name="paint">#dfdfdf</basic-key>
</style>
<template references="horizontal-line"/>
</element>
<!-- element to display the name from the tablemodel -->
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">0.0</basic-object>
<basic-object name="y">8.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">10.0</basic-object>
<basic-object name="width">-50.0</basic-object>
</compound-key>
<basic-key name="alignment">left</basic-key>
</style>
<template references="string-field">
<basic-object name="nullvalue">-</basic-object>
<basic-object name="field">name</basic-object>
</template>
</element>
<!-- element to display icon from the tablemodel -->
<element type="image/generic">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">-50.0</basic-object>
<basic-object name="y">1.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">24.0</basic-object>
<basic-object name="width">-30.0</basic-object>
</compound-key>
<basic-key name="alignment">center</basic-key>
<basic-key name="valignment">middle</basic-key>
</style>
<template references="image-field">
<basic-object name="field">icon</basic-object>
</template>
</element>
<!-- element to display the file size from the tablemodel -->
<element type="text/plain">
<style>
<compound-key name="absolute_pos">
<basic-object name="x">-80.0</basic-object>
<basic-object name="y">8.0</basic-object>
</compound-key>
<compound-key name="min-size">
<basic-object name="height">10.0</basic-object>
<basic-object name="width">-20.0</basic-object>
</compound-key>
<basic-key name="alignment">right</basic-key>
</style>
<template references="number-field">
<basic-object name="nullvalue">-</basic-object>
<basic-object name="format">#,##0</basic-object>
<basic-object name="field">size</basic-object>
</template>
</element>
</itemband>
</report-description>
<!-- ************* -->
<!-- * functions * -->
<!-- ************* -->
<functions>
<property-ref name="report.date"/>
<function name="pagenumber" class="org.jfree.report.function.pagefunction"/>
<function name="groupcount" class="org.jfree.report.function.itemcountfunction">
<properties>
<property name="field">name</property>
<property name="group">category</property>
</properties>
</function>
<function name="groupsum" class="org.jfree.report.function.itemsumfunction">
<properties>
<property name="field">size</property>
<property name="group">category</property>
</properties>
</function>
<function name="overallcount" class="org.jfree.report.function.itemcountfunction">
<properties>
<property name="field">name</property>
</properties>
</function>
<function name="overallsum" class="org.jfree.report.function.itemsumfunction">
<properties>
<property name="field">size</property>
</properties>
</function>
</functions>
</report-definition>
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器