<%@ page contentType="text/html; charset=gb2312"%> 在Java程序中实现高精度打印
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
在Java程序中实现高精度打印
     发布者: 发布时间:2007-07-27
Java环境中,可以使用 java.awt.Toolkit.getScreenResolution()可以得到屏幕每英寸的象素数,但是好像没有什么方法能知道某一台打印机的分辨率,更别提去控制打印粒度了。
于是可耻的使用着丑陋的缺省打印精度几年后,终于找到了解决方法,不知道该高兴还是悲伤,其原理说出来也是非常的简单:

  提高打印精度,其实就是把本来是A3纸的内容往A4纸里画,也就是说,打印区域(这里对应着Java里的Graphics对象)需要缩小,然后由于缺省情况下打印是照72DPI来打的,不做改变的话,打印内容也会跟着变小。这样就不是我们想要的效果了,所以还得把打印内容成比例放大。一个缩小,一个放大,于是画完后,在指定大小的纸张内,便容纳了比以往更多象素的内容,这下世界总算完美了。

  以上做法形象的说应该是这样:把需要产生的图形对象先放大,画在一张“纸上”,然后整体缩小,这样精度就提高了。

  tips 1:在一般企业报表表格打印中,使用144DPI得到的表格线的宽度看起来最舒服。

  tips 2:现在号称600DPI的打印机其实是576DPI,如果想使用这个分辨率的精度,需要用好一点的纸张,因为已经到极限了,纸张稍差点,打印墨粉就沾不上,导致线体残缺。

  附源码(修改分辨率就改动变量iResMul就好):


在Java程序中实现高精度打印(图一)import java.awt.*;
在Java程序中实现高精度打印(图二)import java.awt.print.*;
在Java程序中实现高精度打印(图三)
在Java程序中实现高精度打印(图四)在Java程序中实现高精度打印(图五)public class MyPrintableObject implements Printable 在Java程序中实现高精度打印(图六){
在Java程序中实现高精度打印(图七) public int iResMul = 1; // 1 = 72 dpi; 4 = 288 dpi在Java程序中实现高精度打印(图八)
在Java程序中实现高精度打印(图九)
在Java程序中实现高精度打印(图十) public int print(Graphics g, PageFormat pf, int iPage)
在Java程序中实现高精度打印(图十)在Java程序中实现高精度打印(图十二) throws PrinterException 在Java程序中实现高精度打印(图十三){
在Java程序中实现高精度打印(图十四) final int FONTSIZE = 12;
在Java程序中实现高精度打印(图十五) final double PNT_MM = 25.4 / 72.;
在Java程序中实现高精度打印(图十六) if (0 != iPage)
在Java程序中实现高精度打印(图十七) return NO_SUCH_PAGE;
在Java程序中实现高精度打印(图十八)在Java程序中实现高精度打印(图十九) try 在Java程序中实现高精度打印(图二十){
在Java程序中实现高精度打印(图二十) int iPosX = 1;
在Java程序中实现高精度打印(图二十二) int iPosY = 1;
在Java程序中实现高精度打印(图二十三) int iAddY = FONTSIZE * 3 / 2 * iResMul;
在Java程序中实现高精度打印(图二十四) int iWdth = (int) Math.round(pf.getImageableWidth() * iResMul) - 3;
在Java程序中实现高精度打印(图二十五) int iHght = (int) Math.round(pf.getImageableHeight() * iResMul) - 3;
在Java程序中实现高精度打印(图二十六) int iCrcl = Math.min(iWdth, iHght) - 4 * iResMul;
在Java程序中实现高精度打印(图二十七) Graphics2D g2 = (Graphics2D) g;
在Java程序中实现高精度打印(图二十八) PrinterJob prjob = ((PrinterGraphics) g2).getPrinterJob();
在Java程序中实现高精度打印(图二十九) g2.translate(pf.getImageableX(), pf.getImageableY());
在Java程序中实现高精度打印(图三十) g2.scale(1.0 / iResMul, 1.0 / iResMul);
在Java程序中实现高精度打印(图三十) g2.setFont(new Font("SansSerif", Font.PLAIN, FONTSIZE * iResMul));
在Java程序中实现高精度打印(图三十二) g2.setColor(Color.black);
在Java程序中实现高精度打印(图三十三) g2.drawRect(iPosX, iPosY, iWdth, iHght);
在Java程序中实现高精度打印(图三十四) g2.drawLine(iPosX, iHght / 2 + iWdth / 50, iPosX + iWdth, iHght / 2
在Java程序中实现高精度打印(图三十五) - iWdth / 50);
在Java程序中实现高精度打印(图三十六) g2.drawLine(iPosX, iHght / 2 - iWdth / 50, iPosX + iWdth, iHght / 2
在Java程序中实现高精度打印(图三十七) + iWdth / 50);
在Java程序中实现高精度打印(图三十八) g2.drawOval(iPosX + 2 * iResMul, iHght - iCrcl - 2 * iResMul,
在Java程序中实现高精度打印(图三十九) iCrcl, iCrcl);
在Java程序中实现高精度打印(图四十) iPosX += iAddY;
在Java程序中实现高精度打印(图四十) iPosY += iAddY / 2;
在Java程序中实现高精度打印(图四十二) g2.drawString("PrinterJob-UserName: " + prjob.getUserName(), iPosX,
在Java程序中实现高精度打印(图四十三) iPosY += iAddY);
在Java程序中实现高精度打印(图四十四) g2.drawString("Betriebssystem: " + System.getProperty("os.name")
在Java程序中实现高精度打印(图四十五) + " " + System.getProperty("os.version"), iPosX,
在Java程序中实现高精度打印(图四十六) iPosY += iAddY);
在Java程序中实现高精度打印(图四十七) g2
在Java程序中实现高精度打印(图四十八) .drawString("Java-Version: JDK "
在Java程序中实现高精度打印(图四十九) + System.getProperty("java.version"), iPosX,
在Java程序中实现高精度打印(图五十) iPosY += iAddY);
在Java程序中实现高精度打印(图五十) g2.drawString("Width/Height: " + dbldgt(pf.getWidth()) + " / "
在Java程序中实现高精度打印(图五十二) + dbldgt(pf.getHeight()) + " points = "
在Java程序中实现高精度打印(图五十三) + dbldgt(pf.getWidth() * PNT_MM) + " / "
在Java程序中实现高精度打印(图五十四) + dbldgt(pf.getHeight() * PNT_MM) + " mm", iPosX,
在Java程序中实现高精度打印(图五十五) iPosY += iAddY);
在Java程序中实现高精度打印(图五十六) g2.drawString("Imageable Width/Height: "
在Java程序中实现高精度打印(图五十七) + dbldgt(pf.getImageableWidth()) + " / "
在Java程序中实现高精度打印(图五十八) + dbldgt(pf.getImageableHeight()) + " points = "
在Java程序中实现高精度打印(图五十九) + dbldgt(pf.getImageableWidth() * PNT_MM) + " / "
在Java程序中实现高精度打印(图六十) + dbldgt(pf.getImageableHeight() * PNT_MM) + " mm", iPosX,
在Java程序中实现高精度打印(图六十) iPosY += iAddY);
在Java程序中实现高精度打印(图六十二) g2.drawString("Imageable X/Y: " + dbldgt(pf.getImageableX())
在Java程序中实现高精度打印(图六十三) + " / " + dbldgt(pf.getImageableY()) + " points = "
在Java程序中实现高精度打印(图六十四) + dbldgt(pf.getImageableX() * PNT_MM) + " / "
在Java程序中实现高精度打印(图六十五) + dbldgt(pf.getImageableY() * PNT_MM) + " mm", iPosX,
在Java程序中实现高精度打印(图六十六) iPosY += iAddY);
在Java程序中实现高精度打印(图六十七) g2.drawString("versuchte Druckaufl sung: " + 72 * iResMul + " dpi",
在Java程序中实现高精度打印(图六十八) iPosX, iPosY += iAddY);
在Java程序中实现高精度打印(图六十九)在Java程序中实现高精度打印(图七十) } catch (Exception ex) 在Java程序中实现高精度打印(图七十){
在Java程序中实现高精度打印(图七十二) throw new PrinterException(ex.getMessage());
在Java程序中实现高精度打印(图七十三) }
在Java程序中实现高精度打印(图七十四) return PAGE_EXISTS;
在Java程序中实现高精度打印(图七十五) }
在Java程序中实现高精度打印(图七十六)
在Java程序中实现高精度打印(图七十七)在Java程序中实现高精度打印(图七十八) private static double dbldgt(double d) 在Java程序中实现高精度打印(图七十九){
在Java程序中实现高精度打印(图八十) return Math.round(d * 10.) / 10.; // show one digit after point
在Java程序中实现高精度打印(图八十) }
在Java程序中实现高精度打印(图八十二)
在Java程序中实现高精度打印(图八十三)在Java程序中实现高精度打印(图八十四) public static void main(String[] args) 在Java程序中实现高精度打印(图八十五){
在Java程序中实现高精度打印(图八十六) PrinterJob pj = PrinterJob.getPrinterJob();
在Java程序中实现高精度打印(图八十七) pj.setPrintable(new MyPrintableObject());
在Java程序中实现高精度打印(图八十八)在Java程序中实现高精度打印(图八十九) if (pj.printDialog()) 在Java程序中实现高精度打印(图九十){
在Java程序中实现高精度打印(图九十)在Java程序中实现高精度打印(图九十二) try 在Java程序中实现高精度打印(图九十三){
在Java程序中实现高精度打印(图九十四) pj.print();
在Java程序中实现高精度打印(图九十五)在Java程序中实现高精度打印(图九十六) } catch (PrinterException e) 在Java程序中实现高精度打印(图九十七){
在Java程序中实现高精度打印(图九十八) System.out.println(e);
在Java程序中实现高精度打印(图九十九) }
在Java程序中实现高精度打印(图一百) }
在Java程序中实现高精度打印(图一百零一) }
在Java程序中实现高精度打印(图一百零二)}
(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
类Excel报表设计器标准
一个使用JAVA xmlencoder 例子
探讨Java与Ruby语言迁移时的安全性
用纯JAVA语言编程读取MAC地址的实现
用AJAX编写用户注册时的应用实例
如何有效防止Java程序源码被人偷窥?
 
最近评论:
        
鍥炲
        
那个雨天的想法!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(3421)
        
如果真的有来生!
四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游, max(945)
        
如果真的有来生!
四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游, max(2181)
        
轻轻走过你的窗前!
world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold max(8963)
        
不在的哪天!
final fantasy xi gil,final fantasy xi gil,final fantasy xi gil,final fantasy xi gil, max(1923)
        
昨夜的狂想曲!
wow gold,WoW Gold,world of warcraft gold,WoW Gold, max(1510)
        
昨夜的狂想曲!
wow gold,WoW Gold,world of warcraft gold,WoW Gold, max(4499)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(6942)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(7122)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号