`
wolfsquare
  • 浏览: 83553 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java高精度打印

阅读更多

    在Java环境中,可以使用 java.awt.Toolkit.getScreenResolution()可以得到屏幕每英寸的象素数,但是好像没有什么方法能知道某一台打印机的分辨率,更别提去控制打印粒度了。于是可耻的使用着丑陋的缺省打印精度几年后,终于找到了解决方法,不知道该高兴还是悲伤,其原理说出来也是非常的简单:
    提高打印精度,其实就是把本来是A3纸的内容往A4纸里画,也就是说,打印区域(这里对应着Java里的Graphics对象)需要缩小,然后由于缺省情况下打印是照72DPI来打的,不做改变的话,打印内容也会跟着变小。这样就不是我们想要的效果了,所以还得把打印内容成比例放大。一个缩小,一个放大,于是画完后,在指定大小的纸张内,便容纳了比以往更多象素的内容,这下世界总算完美了。

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

    tips 1:在一般企业报表表格打印中,使用144DPI得到的表格线的宽度看起来最舒服。
    tips 2:现在号称600DPI的打印机其实是576DPI,如果想使用这个分辨率的精度,需要用好一点的纸张,因为已经到极限了,纸张稍差点,打印墨粉就沾不上,导致线体残缺。

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

 

import java.awt.*;
import java.awt.print.*;

public class MyPrintableObject implements Printable {
 
public int iResMul = 1// 1 = 72 dpi; 4 = 288 dpi

 
public int print(Graphics g, PageFormat pf, int iPage)
   
throws PrinterException {
  
final int FONTSIZE = 12;
  
final double PNT_MM = 25.4 / 72.;
  
if (0 != iPage)
   
return NO_SUCH_PAGE;
  
try {
   
int iPosX = 1;
   
int iPosY = 1;
   
int iAddY = FONTSIZE * 3 / 2 * iResMul;
   
int iWdth = (int) Math.round(pf.getImageableWidth() * iResMul) - 3;
   
int iHght = (int) Math.round(pf.getImageableHeight() * iResMul) - 3;
   
int iCrcl = Math.min(iWdth, iHght) - 4 * iResMul;
   Graphics2D g2 
= (Graphics2D) g;
   PrinterJob prjob 
= ((PrinterGraphics) g2).getPrinterJob();
   g2.translate(pf.getImageableX(), pf.getImageableY());
   g2.scale(
1.0 / iResMul, 1.0 / iResMul);
   g2.setFont(
new Font("SansSerif", Font.PLAIN, FONTSIZE * iResMul));
   g2.setColor(Color.black);
   g2.drawRect(iPosX, iPosY, iWdth, iHght);
   g2.drawLine(iPosX, iHght 
/ 2 + iWdth / 50, iPosX + iWdth, iHght / 2
     
- iWdth / 50);
   g2.drawLine(iPosX, iHght 
/ 2 - iWdth / 50, iPosX + iWdth, iHght / 2
     
+ iWdth / 50);
   g2.drawOval(iPosX 
+ 2 * iResMul, iHght - iCrcl - 2 * iResMul,
     iCrcl, iCrcl);
   iPosX 
+= iAddY;
   iPosY 
+= iAddY / 2;
   g2.drawString(
"PrinterJob-UserName: " + prjob.getUserName(), iPosX,
     iPosY 
+= iAddY);
   g2.drawString(
"Betriebssystem: " + System.getProperty("os.name")
     
+ " " + System.getProperty("os.version"), iPosX,
     iPosY 
+= iAddY);
   g2
     .drawString(
"Java-Version: JDK "
       
+ System.getProperty("java.version"), iPosX,
       iPosY 
+= iAddY);
   g2.drawString(
"Width/Height: " + dbldgt(pf.getWidth()) + " / "
     
+ dbldgt(pf.getHeight()) + " points = "
     
+ dbldgt(pf.getWidth() * PNT_MM) + " / "
     
+ dbldgt(pf.getHeight() * PNT_MM) + " mm", iPosX,
     iPosY 
+= iAddY);
   g2.drawString(
"Imageable Width/Height: "
     
+ dbldgt(pf.getImageableWidth()) + " / "
     
+ dbldgt(pf.getImageableHeight()) + " points = "
     
+ dbldgt(pf.getImageableWidth() * PNT_MM) + " / "
     
+ dbldgt(pf.getImageableHeight() * PNT_MM) + " mm", iPosX,
     iPosY 
+= iAddY);
   g2.drawString(
"Imageable X/Y: " + dbldgt(pf.getImageableX())
     
+ " / " + dbldgt(pf.getImageableY()) + " points = "
     
+ dbldgt(pf.getImageableX() * PNT_MM) + " / "
     
+ dbldgt(pf.getImageableY() * PNT_MM) + " mm", iPosX,
     iPosY 
+= iAddY);
   g2.drawString(
"versuchte Druckaufl sung: " + 72 * iResMul + " dpi",
     iPosX, iPosY 
+= iAddY);
  }
 catch (Exception ex) {
   
throw new PrinterException(ex.getMessage());
  }

  
return PAGE_EXISTS;
 }


 
private static double dbldgt(double d) {
  
return Math.round(d * 10.) / 10.; // show one digit after point
 }


 
public static void main(String[] args) {
  PrinterJob pj 
= PrinterJob.getPrinterJob();
  pj.setPrintable(
new MyPrintableObject());
  
if (pj.printDialog()) {
   
try {
    pj.print();
   }
 catch (PrinterException e) {
    System.out.println(e);
   }

  }

 }

}



全文完)   

分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    Java 1.6 API 中文 New

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    java api最新7.0

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    JavaAPI1.6中文chm文档 part1

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    JavaAPI中文chm文档 part2

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    java jdk-api-1.6 中文 chmd

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    [Java参考文档]

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    JAVA性能瓶颈和漏洞检测

    * JProbe Profiler JProbe Profiler内置了Call Graph调用关系图和高级数据采集机制,可实现方法和代码行级的高精度性能诊断。 主要功能: 方法和行级分析:确定方法的热点,并以逐行方式挖掘分析性能状态。 计算...

    Style Print专业报表套打解决方案

    思达专业套打解决方案是基于思达专业打印平台Style Print(以下简称Style Print)这款专业的高精度面向打印服务的软件。作为全球第一款基于JAVA语言的打印产品—思达专业打印平台Style Print具有打印精美,定位准确...

    整理后java开发全套达内学习笔记(含练习)

    进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时,加上“final”关键词来限定,这个...

    [Java参考文档].JDK_API 1.6

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    JAVA性能瓶颈和漏洞检测.JProbe.Suite.v7.0.part2

    * JProbe Profiler JProbe Profiler内置了Call Graph调用关系图和高级数据采集机制,可实现方法和代码行级的高精度性能诊断。 主要功能: 方法和行级分析:确定方法的热点,并以逐行方式挖掘分析性能状态。 计算...

    JAVA性能瓶颈和漏洞检测].JProbe.Suite.v7.0.part1

    * JProbe Profiler JProbe Profiler内置了Call Graph调用关系图和高级数据采集机制,可实现方法和代码行级的高精度性能诊断。 主要功能: 方法和行级分析:确定方法的热点,并以逐行方式挖掘分析性能状态。 计算...

    java经典面试2010集锦100题(不看你后悔)

    C) 双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快、占用内存小的优点。 D) 在Java中布尔值可以用true或false来表示,但是同时也可以用1或0来表示。 题目5:b 程序...

    rocky:具有REPL,调试和OOP的Rockstar Java实现

    ) 交互式终端模式(REPL-读取-评估-打印循环) 列表命令(在不运行文件的情况下解析文件) 选项说明的详细帮助IEEE754数学(双精度)或可选的Dec64(带有--dec64选项) 特殊功能: Rockstar中的! 是的,您可以在...

    JDK_1_6 API

    java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....

    印刷网站管理系统.zip

    栏目管理系统 - 自由单页栏目频道,智能化管理排版前台页面,无需较高的互联网技术 订单管理模块 - 包括订单查询、未审核、已审核、 进行中、 已发货、已付款、 已结束、存档查询等功能 成品管理系统 - 任意创建多个...

Global site tag (gtag.js) - Google Analytics