﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-风人园-文章分类-SWT</title><link>http://www.blogjava.net/wuxufeng8080/category/39055.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 15 Apr 2009 08:23:37 GMT</lastBuildDate><pubDate>Wed, 15 Apr 2009 08:23:37 GMT</pubDate><ttl>60</ttl><item><title>实现SWT打印表格与图片功能(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/265765.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 15 Apr 2009 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/265765.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/265765.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/265765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/265765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/265765.html</trackback:ping><description><![CDATA[转载自 http://hi.baidu.com/gridrender/blog/item/0fff0f335b52ef44ac4b5f43.html<br />
<br />
源代码下载地址：<br />
参考网址：<br />
（1）http://club.xasoft.org/?uid-167-action-viewspace-itemid-346#xspace-itemreply<br />
（2）http://www.eclipseworld.org/bbs/read-cec-tid-5299-keyword-.html<br />
<br />
纯SWT的报表库: SWT Report，支持报表打印功能：<br />
1. 跨行和跨列功能<br />
2. 页码和页数统计<br />
3. 边距和间距调整<br />
4. 各边框颜色设置<br />
5. 前景和背景颜色<br />
6. 自适应页面大小<br />
其中，CustomReportTest 类生成的报表<br />
<br />
<br />
SWT提供的打印功能很简单，特别是在做表格打印的时候，需要大家使用GC自己绘出来，才能打印，对于初级的开发人员和人力不足的公司来说是非常麻烦的事情。<br />
<br />
<br />
import org.ceclipse.reporting.IReport;<br />
import org.ceclipse.reporting.IReportPage;<br />
import org.ceclipse.reporting.Report;<br />
import org.ceclipse.reporting.ReportData;<br />
import org.ceclipse.reporting.ReportUtil;<br />
import org.eclipse.nebula.widgets.grid.Grid;<br />
import org.eclipse.swt.printing.PrintDialog;<br />
import org.eclipse.swt.printing.Printer;<br />
import org.eclipse.swt.widgets.Table;<br />
import org.eclipse.ui.PlatformUI;<br />
<br />
/**<br />
* 通用表格打印组件，目前提供两个方法分别用于打印表格（Gird,Table）;<br />
* 工作任务名:printContent<br />
* @author lign<br />
*<br />
*/<br />
public class PrintContent&nbsp;&nbsp; {<br />
<br />
/**<br />
* 对Gird进行打印操作<br />
&nbsp;&nbsp;&nbsp; * @param grid SWT 的nebula项目的Grid<br />
* @param title 表头文字描述<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp; public static void printGird(Grid grid, String title) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IReportPage page = ReportUtil.convert(grid, title);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Report report = new Report();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.addPage(page);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printToPrinter(report);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; /** <br />
&nbsp;&nbsp;&nbsp; * 对Table进行打印操作<br />
&nbsp;&nbsp;&nbsp; * @param table SWT 的Table<br />
&nbsp;&nbsp;&nbsp; * @param title 表头文字描述<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp; public static void printTable(Table table, String title) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IReportPage page = ReportUtil.convert(table, title);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Report report = new Report();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.addPage(page);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printToPrinter(report);<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
<br />
/** <br />
&nbsp;&nbsp;&nbsp; * 处理打印以及调用Printer<br />
&nbsp;&nbsp;&nbsp; * @param report<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private static void printToPrinter(IReport report)&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReportData reportData = report.getReportData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reportData.setJobName("printContent");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reportData.setPrinter(new Printer(new PrintDialog(PlatformUI.getWorkbench<br />
<br />
().getActiveWorkbenchWindow().getShell()).open()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; report.print();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
参考网址：<br />
（1）http://club.xasoft.org/?uid-167-action-viewspace-itemid-346#xspace-itemreply<br />
（2）http://www.eclipseworld.org/bbs/read-cec-tid-5299-keyword-.html<br />
（3）http://www.blogjava.net/Javawind/articles/129899.html<br />
<br />
和打印文字不同。因为系统中的dpi(dot per inch)和打印机的dpi不同，所以要进行转换。<br />
<br />
import org.eclipse.swt.*;<br />
import org.eclipse.swt.graphics.*;<br />
import org.eclipse.swt.printing.*;<br />
import org.eclipse.swt.widgets.*;<br />
<br />
/** *//**<br />
* This class demonstrates printing images<br />
*/<br />
public class ImagePrinterExample {<br />
/** *//**<br />
&nbsp;&nbsp; * The application entry point<br />
&nbsp;&nbsp; * @param args the command line arguments<br />
&nbsp;&nbsp; */<br />
public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; Display display = new Display();<br />
&nbsp;&nbsp;&nbsp; Shell shell = new Shell(display, SWT.NONE);<br />
<br />
&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Prompt the user for an image file<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileDialog fileChooser = new FileDialog(shell, SWT.OPEN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = fileChooser.open();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileName == null) { return; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Load the image<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageLoader loader = new ImageLoader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageData[] imageData = loader.load(fileName);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (imageData.length &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Show the Choose Printer dialog<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintDialog dialog = new PrintDialog(shell, SWT.NULL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrinterData printerData = dialog.open();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (printerData != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create the printer object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Printer printer = new Printer(printerData);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Calculate the scale factor between the screen resolution and printer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // resolution in order to correctly size the image for the printer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point screenDPI = display.getDPI();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point printerDPI = printer.getDPI();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int scaleFactor = printerDPI.x / screenDPI.x;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Determine the bounds of the entire area of the printer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rectangle trim = printer.computeTrim(0, 0, 0, 0);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Start the print job<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (printer.startJob(fileName)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (printer.startPage()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GC gc = new GC(printer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Image printerImage = new Image(printer, imageData[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Draw the image<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gc.drawImage(printerImage, 0, 0, imageData[0].width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imageData[0].height, -trim.x, -trim.y, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scaleFactor * imageData[0].width, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scaleFactor * imageData[0].height);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Clean up<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printerImage.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gc.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printer.endPage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // End the job and dispose the printer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printer.endJob();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printer.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox messageBox = new MessageBox(shell, SWT.ICON_ERROR);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; messageBox.setMessage("Error printing test image");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; messageBox.open();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
}<br />
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/265765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2009-04-15 15:04 <a href="http://www.blogjava.net/wuxufeng8080/articles/265765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>