在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);
}
}
}
}
闽公网安备 35060202000074号