JAVA打印问题,各种打印方案都没满足我的打印要求,难难难啊,各位帮忙找个好方法
最近在弄JAVA打印时,找来找去没找到一个好的解决方案.
我是要打印canvas界面上的东西,都是由Graphics画出来的,想要有彩色,想要能通过打印对话框来设置纸型大小和纵横向
现在我了解的几种打印方案:
方案1:
Toolkit toolkit = Toolkit.getDefaultToolkit();
java.awt.PrintJob printjob = toolkit.getPrintJob(frame, "", null);
if(printjob != null)
{
g = printjob.getGraphics();
dimension = printjob.getPageDimension();
w = dimension.width;
h = dimension.height;
}
drawImg(g,w,h);
优:
这种方法来打印时,最大的方便就是可以得到打印对话框里的设置,在打印对话框里设置的纸的宽度可以在JAVA程序中得到,这样我打印的时候就可以根据纸宽来设置我打印的图片drawImg(g,w,h),横纵打印都可以直接反应在打印输出上.
缺点:
不能实现彩色打印,在我的应用中没办法采用.
第2种方案:
PrinterJob pj=PrinterJob.getPrinterJob();
if (pj != null) {
pj.setPrintable(new Printable(){
public int print(Graphics g,PageFormat pf,int page) throws PrinterException{
if(page>=1){
return Printable.NO_SUCH_PAGE;
}
drawImg(g,(int)pf.getWidth(),(int)pf.getHeight());
return Printable.PAGE_EXISTS;
}
});
if(pj.printDialog()){
try{
pj.print();
}catch(PrinterException exception){}
}
缺点:
用这种方案,打印对话框里对纸张大小的设置,纸张宽纵的设置完全不起作用.我在drawImg(g,w,h)的时候,这里完全得不到正确的由打印对话框设置的纸张大小,程序里得到的纸型都是A4,我可以在JAVA程序里自己设置纸的大小,但这个设置跟打印对话框的设置脱节
3种方案:
PrintService svc = PrintServiceLookup.lookupDefaultPrintService();
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
PrintService selection = ServiceUI.printDialog(null, 100, 100, services, svc, null, attrs);
DocPrintJob job = service.createPrintJob();
DocFlavor flavor = DocFlavor.URL.GIF;
Doc doc = new SimpleDoc(url, flavor, null);
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(new Copies(2));
job.print(doc, attrs);
用这种方案来打印,是打印文档的,不能把我的canvas内容用drawImg的方法打印出来,而且,它弹出来的打印对话框也不能调整纸型.也不行.
不知道还有别的JAVA打印方法,现在的这些我都没法满足我的要求,请问有没有好的方法来实现.
(我的要求关键是两点:1是能有彩打,1,1的方案就没有彩打,2是能从打印对话框里获取到纸型,能让客户设置纸型及模打纵打)
非常感谢!
问题点数:100、回复次数:31Top
1 楼xiaopeipei2004(小裴)回复于 2006-03-08 14:54:03 得分 5
up,先学习了,搜藏,帮顶Top
2 楼cql0007(南方过客 )回复于 2006-03-09 15:19:25 得分 0
好冷清啊,一直没响应啊,自己顶顶Top
3 楼congliu(取次花丛都不顾,半缘修道半缘君。)回复于 2006-03-09 15:59:54 得分 10
PrinterJob.printDialogTop
4 楼cql0007(南方过客 )回复于 2006-03-09 16:23:28 得分 0
congliu老兄你好
请问如果用PrinterJob.printDialog的话,那应该如何从打印对话框里获取纸张的类型大小了?
Top
5 楼TomDebug(风)回复于 2006-03-09 16:27:21 得分 10
这么有难度的需求
只好帮顶了,对java的AWT没有太多兴趣Top
6 楼fire222(这会傻了)回复于 2006-03-09 23:18:56 得分 5
关注中Top
7 楼A07508(逍遙子)回复于 2006-03-09 23:38:39 得分 5
初学者,跟进中
Top
8 楼mingxuan3000(铭轩)回复于 2006-03-11 09:13:18 得分 5
up,先学习了,搜藏,帮顶Top
9 楼zx2002027(http://www.netyi.net/in.asp?id=zx2002027)回复于 2006-03-11 11:07:37 得分 5
记号Top
10 楼wuzhu888(繁华的夜景)回复于 2006-03-13 09:12:53 得分 5
恩Top
11 楼dogcai(dogcai)回复于 2006-03-13 11:13:09 得分 20
楼主这么做,是不聪明。
我们在开发软件的时候,碰到打印的,我基本上不去碰这些东西了。
我会按照格式导入到Excel表格,由Excel去打印。
为什么不利用Excel的打印功能而自己开发,因为Java控制打印很烦而且效果不好。
我觉得楼主可以考虑一下这个办法。
Top
12 楼cql0007(南方过客 )回复于 2006-03-13 12:39:21 得分 0
dogcai(dogcai)
哥们,我是打印图形啊,图形还要根据纸的大小还调整输出大小的啊.
Top
13 楼wmzsl(王明哲)回复于 2006-03-15 09:11:30 得分 0
学习!!Top
14 楼javaboat(毛豆)回复于 2006-03-16 15:56:56 得分 0
关注一下!Top
15 楼nbzone(本本地带www.nbzone.com.cn专业笔记本电脑供应商)回复于 2006-03-16 16:19:35 得分 0
up,先学习了,搜藏,帮顶
Top
16 楼cql0007(南方过客 )回复于 2006-03-17 09:07:03 得分 0
兄弟们,问题还没解决啊,不要都只做个记号啊
难道这个问题就没有什么好的解决方法吗?郁闷Top
17 楼killme2008(为了生态平衡,请保护蛤蟆)回复于 2006-03-17 15:47:35 得分 10
打印图形?也许LZ该找位对JAVA(2d,3d,image io等技术)图形编程有了解的朋友问下
关注Top
18 楼feifeirao(人渣)回复于 2006-03-20 08:56:40 得分 0
dingTop
19 楼panpan221(我是来学习的!)回复于 2006-03-20 09:14:00 得分 0
关注一下!Top
20 楼cql0007(南方过客 )回复于 2006-03-20 13:00:11 得分 0
自己再UPTop
21 楼lilygt(活的坦然)回复于 2006-03-22 09:56:44 得分 0
我要学习Top
22 楼96310(longding)回复于 2006-03-23 12:16:54 得分 0
关注........Top
23 楼datalover(白发始立发奋志)回复于 2006-03-23 20:03:40 得分 0
关注........Top
24 楼wmzsl(王明哲)回复于 2006-03-24 09:10:56 得分 0
不好弄啊,帮你顶一下!Top
25 楼caoze(大漠孤烟)回复于 2006-03-31 15:07:13 得分 10
Java 在打印方面做得还不够强。楼主可以试着将要打印的东西转换成图片或者是pdf档案,然后通过其他软件来打印。
我们现在是转成pdf后打印,省去了很多麻烦,java产生pdf文件倒是很简单。
Top
26 楼lcllcl987(毛爷爷)回复于 2006-03-31 15:12:37 得分 0
如果要打印我一般是让水晶报表来解决
楼主可以用水晶报表试一下
顶Top
27 楼cql0007(南方过客 )回复于 2006-04-05 10:17:07 得分 0
我主要是做APPLET的,本来下载这个APPLET包就比较慢了,再用第三方控制来打印就更麻烦了.
生成的东西直接交给IE来打的话,IE的打印功能也是很差的,郁闷
Top
28 楼bgceft()回复于 2006-04-05 11:19:30 得分 0
汗~ 友情帮顶Top
29 楼TinyJimmy(Jimmy)回复于 2006-04-05 13:31:41 得分 10
在IE上打印? 又能打印出很好的效果? 然后还要通过Applet去控制打印机? 有些难度
1. 一般的做法是使用画布, 在上面画好了直接输出打印机
2. Applet控制打印机一般是被禁止的吧, 是否你的签名不正确, 所以applet无法访问本地资源
3. 实在不行还是建议用PDF, IE中打开一个PDF文件, 这样打印你能省去不少功夫Top
30 楼cql0007(南方过客 )回复于 2006-04-06 21:34:56 得分 0
多谢楼上老兄.
我做的东西是应用于局域网内的,APPLET都是做了数字签名的,对本地资源的访问不存在问题
其实是个GIS应用了,所以在应用中要根据客户的需求打印不同大小图形输出,而我的想法得到纸的大小是从打印机处直接获取参数的,在打印对话框中读到纸张大小后,就可以在我的画布中根据纸大小画不同大小的图来打印了.
用JAVA1.1那个打印的方法就可以读到打印机的纸张大小了,可惜它的打印没有彩色
用JAVA1.2的打印方法打印是有了彩色了,却读不到打印机中纸的大小了
其实这两者结合起来就可以达到我的要求了Top
31 楼ciahi(爪哇乞丐)回复于 2006-04-08 10:05:33 得分 0
顶啦!Top




