一。JPS
1。黑夜:打印一直是JAVA的软肋,就连比较新的1.5,1.6里面出现的JPS服务也不例外,看DEMO上的几个例子,都是蛮好的,也都能运行,但是实际打印的时候一直存在一个问题,就是lookup不到指定的PrintService,我试了一下,我们办公室的打印机只支持text/plain,text/html,image/gif,image/jpg等几种格式,还有几种
x-java-jvm-local-objectref不明白是什么东东。 而自己要想打印的rtf,doc,xls格式都没有。
2。曙光:东西并不一定是新的好啊。
jdk1.2开始提供了一个打印接口Printable,利用Graphics图形环境画出打印内容,虽然很麻烦,但是灵活性也是最大,如果能获取到rtf,doc,xls这些文件的位置信息和内容信息就应该行的。
二。jasperreport
3。黎明前的黑暗:我们的应用原来的做法是用jasperreport导出为rtf文件,然后利用jacob调用word的打印功能。所以先要研究一下rtf文件里面的位置和内容信息。看看jasperreport是怎样把位置和内容导出为RTF的,只要在导出的地方换成用Graphics画出来就行。
但是看了代码以后,就觉得太麻烦了,里面70%的代码都是在生成rtf的控制字符,实际输出地方的代码又被包装过了,看不出什么东西来,很郁闷
4。天亮:看jasperreport的源代码时无意中注意到有一个JRPrintServiceExporter,到里面一看,正好,正是自己想要的。真是“山穷水复疑无路,柳暗花明又一村”。
5。白天(好上班):简单写一个过程,以免忘记:
a)。用IREPORT编辑 .jrxml文件,编译后生成 .jasper 文件。
b)。用数据填充 jasper ,生成 JasperPrint
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperReport,
reportParamMap,
jrDs);
c)。导出到打印机
JRPrintServiceExporter pse=new JRPrintServiceExporter();
pse.setParameter(JRExporterParameter.JASPER_PRINT,
jasperPrint);
PrintServiceAttributeSetprintServiceAttributeSet= new
HashPrintServiceAttributeSet();
printServiceAttributeSet.add(new
PrinterName("printer name", null)); //设定哪台打印机打印
pse.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG,
Boolean.FALSE);
pse.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG,
Boolean.FALSE);
pse.setParameter(JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET,
printServiceAttributeSet); pse.exportReport();
6。黄昏:打印是打印出来了,但是还是有一个瑕疵:JPS(不如说是java),本身不支持TrueType字体,所以打印出来的没有用word打印出来的rtf的字体好看。看来还是要看看源代码后再做修改。
7。有灯光的办公室:
看来还是对jasperreport和ireport了解的不够啊,如果要打印出的字体是TrueType字体,只要在ireport中的Font选项卡中
Font Name 选中文字体(如“宋体”),PDF Encoding选中“UniGB-UCS2-H (Chinese
Simplified)”(可能不用这个),就行了。