 |
| iReport整合向量图形 |
|
efly 原创 更新:2004-06-09 16:34:04 版本: 1.0
|
|
笔者最近通过试用iReport并整合了打了向量图形的补丁后的JasperReports,发现iReport的功能和易用性接近商业化的报表工具。成为开源报表工具的首选。Svg补丁直接使用了iText对Java Graphics2D的wrap来实现pdf文件的svg图形。
iReport主页
JasperReports向量图形patch
补丁方式 通过svg-patch-src修补jasperreports cvs源码,编译后与iReport源码整合。笔者发现了少数中文和xml校验等问题,通过修改源码可以解决。所以建议iText,jasperreports,jfreechart,iReport都使用cvs源码。
中文问题 修改com.lowagie.text.pdf.DefaultFontMapper类的awtToPdf方法: BaseFont bf = null; try { bf = BaseFont.createFont( System.getProperty(“font.chinese.SIMYOU”),"D:/wiki/iReport-0.3.0/fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); } catch (DocumentException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }
在Linux平台上部署的时候需要修改jfreechart相应的字体。
iReport Chart iReport目前对chart支持很有限,不过通过image标签和scriptlet可以很好的嵌入jfreechart图形, 嵌入其它chart比如jcharts方法一样。

Scriptlet代码
public class ChartScriptlet extends JRDefaultScriptlet { /** * */ public void afterReportInit() throws JRScriptletException { Connection con=null; DefaultPieDataset pieDataset = new DefaultPieDataset(); try { Class.forName("oracle.jdbc.driver.OracleDriver"); System.out.println("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } try {
con = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1.38:1521:ora8i", "user", "password");
String query = "select province.name as name,sum(bill.total) as total from province,bill,node where bill.node_id =node.id and node.province_id=province.id and bill.CREATE_TIME > to_date('2004-1-1','yyyy-MM-dd') group by province.name"; Statement stmt = con.createStatement();
// Submit a query, creating a ResultSet object
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) { System.out.println(rs.getString("name")); pieDataset.setValue( rs.getString("name"), rs.getDouble("total")); } rs.close(); stmt.close(); con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } JFreeChart chart = ChartFactory.createPieChart( "2004-1-1至今各省帐单数据统计图", pieDataset, true, true, false); JCommonDrawableWrapper chartWrapper = new JCommonDrawableWrapper(chart);
this.setVariableValue("ChartImage", chartWrapper);
BufferedImage image = chart.createBufferedImage(246, 303); this.setVariableValue("ChartImage2", image); } }
生成pdf 作为对比,笔者同时使用了svg和位图,svg在编辑模式下可以copy文本,并且放大显示后不会出现像那样位图模糊不清的情况。图形渲染质量和打印效果也非常好。 Example pdf下载
|
|
|
评论人:panpa
|
发表时间: Tue Jun 15 10:44:50 CST 2004
|
嗯,不错!试了有个问题请教一下: 用这个patch画出来的图表中文字字体很粗,中文显示则会超出那个提示框 不知道在哪儿能更改字体,这个图表的字体取决于哪个对象呢 是那个DefaultFontMapper还是Graphics2D或是其他哪个?
|
|
|
评论人:panpa
|
发表时间: Tue Jun 15 10:55:14 CST 2004
|
发现作者scriplet代码里的 this.setVariableValue("ChartImage2", image); 给的是一个Image对象 而在图中给Image设置的类是dori.jasper.util.Renderable 这是否有矛盾呢,要想用矢量能给定Image对象吗?你的scriplet到底是出矢量图的还是位图的
|
|
|
游客:
efly
|
发表时间: Tue Jun 15 18:07:55 CST 2004
|
panpa的第一个问题是修改DefaultFontMapper来解决的. 第二个问题,大概你没有看我最下面提供的pdf example,可以下载来看,它绘了两个 图,一个是graphics2D的,一个是普通的位图.
|
|
|
评论人:panpa
|
发表时间: Wed Jun 16 09:10:49 CST 2004
|
哦,谢谢! 另外我还想问你怎么让饼图里面的文字都变成矢量可选的,我发现我做完后只有注释里面的文字比较漂亮是可选择拷贝的 看:我的PDF
|
|
|
游客:
efly
|
发表时间: Wed Jun 16 09:31:53 CST 2004
|
to panpa: 我已经不记得了,可能是修改了哪个地方的代码。打包的4个工程包括代码大概有80M,你可以找我以前的同事zou_2000@263.net索取,我这里没有。
|
|
|
评论人:vampire_315
|
发表时间: Sat Dec 16 17:03:33 CST 2006
|
|
不错的东东啊
|
|
|
|
|
 |