知识大全 在Java程序中实现高精度打印
Posted 内容
篇首语:“善与恶皆为上帝的成见。”蛇如是说。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Java程序中实现高精度打印相关的知识,希望对你有一定的参考价值。
在Java程序中实现高精度打印 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在Java环境中 可以使用 java awt Toolkit getScreenResolution()可以得到屏幕每英寸的象素数 但是好像没有什么方法能知道某一台打印机的分辨率 更别提去控制打印粒度了 于是可耻的使用着丑陋的缺省打印精度几年后 终于找到了解决方法 不知道该高兴还是悲伤 其原理说出来也是非常的简单
提高打印精度 其实就是把本来是A 纸的内容往A 纸里画 也就是说 打印区域(这里对应着Java里的Graphics对象)需要缩小 然后由于缺省情况下打印是照 DPI来打的 不做改变的话 打印内容也会跟着变小 这样就不是我们想要的效果了 所以还得把打印内容成比例放大 一个缩小 一个放大 于是画完后 在指定大小的纸张内 便容纳了比以往更多象素的内容 这下世界总算完美了
以上做法形象的说应该是这样 把需要产生的图形对象先放大 画在一张 纸上 然后整体缩小 这样精度就提高了
tips 在一般企业报表表格打印中 使用 DPI得到的表格线的宽度看起来最舒服
tips 现在号称 DPI的打印机其实是 DPI 如果想使用这个分辨率的精度 需要用好一点的纸张 因为已经到极限了 纸张稍差点 打印墨粉就沾不上 导致线体残缺
附源码(修改分辨率就改动变量iResMul就好)
import java awt *;
import java awt print *;
public class MyPrintableObject implements Printable
public int iResMul = ; // = dpi; = dpi
public int print(Graphics g PageFormat pf int iPage)
throws PrinterException
final int FONTSIZE = ;
final double PNT_MM = / ;
if ( != iPage)
return NO_SUCH_PAGE;
try
int iPosX = ;
int iPosY = ;
int iAddY = FONTSIZE * / * iResMul;
int iWdth = (int) Math round(pf getImageableWidth() * iResMul) ;
int iHght = (int) Math round(pf getImageableHeight() * iResMul) ;
int iCrcl = Math min(iWdth iHght) * iResMul;
Graphics D g = (Graphics D) g;
PrinterJob prjob = ((PrinterGraphics) g ) getPrinterJob();
g translate(pf getImageableX() pf getImageableY());
g scale( / iResMul / iResMul);
g setFont(new Font( SansSerif Font PLAIN FONTSIZE * iResMul));
g setColor(Color black);
g drawRect(iPosX iPosY iWdth iHght);
g drawLine(iPosX iHght / + iWdth / iPosX + iWdth iHght /
iWdth / );
g drawLine(iPosX iHght / iWdth / iPosX + iWdth iHght /
+ iWdth / );
g drawOval(iPosX + * iResMul iHght iCrcl * iResMul
iCrcl iCrcl);
iPosX += iAddY;
iPosY += iAddY / ;
g drawString( PrinterJob UserName: + prjob getUserName() iPosX
iPosY += iAddY);
g drawString( Betriebssystem: + System getProperty( os name )
+ + System getProperty( os version ) iPosX
iPosY += iAddY);
g drawString( Java Version: JDK
+ System getProperty( java version ) iPosX
iPosY += iAddY);
g drawString( Width/Height: + dbldgt(pf getWidth()) + /
+ dbldgt(pf getHeight()) + points =
+ dbldgt(pf getWidth() * PNT_MM) + /
+ dbldgt(pf getHeight() * PNT_MM) + mm iPosX
iPosY += iAddY);
g 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);
g 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);
g drawString( versuchte Druckaufl sung: + * 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 * ) / ; // 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);
cha138/Article/program/Java/hx/201311/26417
相关参考