分类: Oracle
2008-04-23 17:36:30
图表经常用于为管理人员、客户、股东和其他利益相关者提供的演示中。然而,通过 Java 应用程序或作为纯文本文件显示图表通常不适合这些类型的观众。将生成的图表添加到 PDF 中对于向不同的观众演示很有帮助。有几种 Java 到 PDF 的转换器适用于该目的。下面我们演示一个使用其中的一个 Java 到 PDF 库 iText 的简单示例。
iText Java 到 PDF 库是免费的。我们的示例中使用的版本是 itext-2.0.2,是一个相对较小的文件,易于下载。这个下载的编译 JAR 是一个可执行文件,可通过 java –jar itext-2.0.2 命令或单击 Windows 中的 JAR 运行。运行该 JAR 会弹出“iText Toolbox”人机界面 (HMI),该界面可用于将文本或 TIFF 图像转换为 PDF 并提供其他实用工具功能。该示例没有使用这个 HMI,而是将 iText 用作一个库并使用该库将 JFreeChart 生成的图表转换为 PDF。
下载 iText JAR 后的第一个步骤是将它放在 build 和运行时类路径或 IDE 的项目中。使用 iText 将图表写入 PDF 并不比下载 JAR 文件并将其放在类路径中难很多。以下两个代码清单显示了创建圆环图(类似于饼形图,使用 PieDataset)的代码以及将该生成的图表写出到 PDF 中的代码。
清单 11: 创建圆环图
/** * Create ring chart indicating number of countries in each region. * * @return Ring (similar to Pie) Chart with number of countries per region. */ public JFreeChart createCountriesPerRegionRingChart() { JFreeChart ringChart = null; try { final String QUERY_NUMBER_COUNTRIES_PER_REGION = "SELECT regions.region_name, count(*) AS num_countries " + " FROM regions, countries " + "WHERE regions.region_id = countries.region_id " + "GROUP BY regions.region_name"; final PieDataset ringDataset = new JDBCPieDataset( databaseAccess.getOracleDbConnection(), QUERY_NUMBER_COUNTRIES_PER_REGION ); ringChart = ChartFactory.createRingChart( TITLE_COUNTRIES_PER_REGION, // title ringDataset, // pie (ring) dataset true, // legend displayed true, // tooltips displayed false ); // no URLs } catch ( SQLException sqlEx ) { // exception handling code here . . . } return ringChart; } |
上述代码清单与本文中使用 JFreeChart 生成图表的其他代码清单十分相似。下一个代码清单显示如何将该图表或任何其他使用 JFreeChart 生成的图表写入 PDF。生成的 JFreeChart(在本例中为在上一个清单中创建的圆环图)可以与包含应写入的 PDF 文件的文件名的字符串一同被传递到下面的方法。
清单 12: 在 PDF 中显示 JFreeChart 生成的图表
/** * Write PDF based on the provided chart. * * @param aChart Chart to be written out as PDF. * @param aOutputPdfFileName File name (without extension) to write PDF file. * @param aWidth Width of chart to be rendered. * @param aHeight Height of chart to be rendered. */ public void writePdfBasedOnChart( JFreeChart aChart, String aOutputPdfFileName, int aWidth, int aHeight ) { final String fileExtension = ".pdf"; // com.lowagie.text.Document Document document = new Document(); try { PdfWriter.getInstance( document, new FileOutputStream( aOutputPdfFileName + fileExtension)); document.open(); Image png = Image.getInstance( ChartUtilities.encodeAsPNG( aChart.createBufferedImage(aWidth,aHeight))); document.add(png); document.close(); } catch (DocumentException docEx) // checked exception { docEx.printStackTrace(); } catch (IOException ioEx) // checked exception { ioEx.printStackTrace(); } } |
如上述代码清单所示,只需六条与 iText 相关的 Java 代码语句即可将提供的图表写入 PDF。这些步骤如下所示:
◆创建 iText 文档(从 com.lowagie.text 程序包中)。
◆使用 open() 方法打开 iText 文档。
◆使用静态 Image.getInstance() 方法调用实例化一个 iText 图像,以 byte[] 形式接收图表。
◆将图像添加到 iText 文档中(使用它的 add() 方法)。
◆关闭 iText 文档(使用它的 close() 方法)。
图 11 是上述代码生成的 PDF 的屏幕截图。
图11:显示包含生成的圆环图的PDF的Adobe Reader |
JFreeChart 支持将图表作为 BufferedImage 以 byte[] 格式写出,这使得将图表转换为可以通过 iText 直接转换为 PDF 的格式变得十分简单。