<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 在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);
}
}
}
}
提高打印精度,其实就是把本来是A3纸的内容往A4纸里画,也就是说,打印区域(这里对应着Java里的Graphics对象)需要缩小,然后由于缺省情况下打印是照72DPI来打的,不做改变的话,打印内容也会跟着变小。这样就不是我们想要的效果了,所以还得把打印内容成比例放大。一个缩小,一个放大,于是画完后,在指定大小的纸张内,便容纳了比以往更多象素的内容,这下世界总算完美了。
以上做法形象的说应该是这样: 把需要产生的图形对象先放大,画在一张“纸上”,然后整体缩小,这样精度就提高了。
tips 1:在一般企业报表表格打印中,使用144DPI得到的表格线的宽度看起来最舒服。
tips 2:现在号称600DPI的打印机其实是576DPI,如果想使用这个分辨率的精度,需要用好一点的纸张,因为已经到极限了,纸张稍差点,打印墨粉就沾不上,导致线体残缺。
附源码(修改分辨率就改动变量iResMul就好):
![](/Upload/2006-06/BD58C61D846C3A9BB32BC04CBE29AB0A.gif)
![](/Upload/2006-06/99CDF306D6E6E69E7F29F5843D381CC3.gif)
![](/Upload/2006-06/EDAF6E377B93A20159EF818023440419.gif)
![](/Upload/2006-06/2F1C278B7FE885772B9B4801FAD3C9F1.gif)
![](/Upload/2006-06/450385CC0262CAA0E637F0CF3CA0CDD5.gif)
![](/Upload/2006-06/109DE6D87E05E69A4F323C9EED91DF0D.gif)
![](/Upload/2006-06/0C3CAB94454C1D73293CA813531D7858.gif)
![](/Upload/2006-06/30794C5111E120B97C15B505BB8A6CED.gif)
![](/Upload/2006-06/4F9C461EBED77A2E8375A3BCA91AEF6C.gif)
![](/Upload/2006-06/23082E8310FB05E67B79F3B2F2C9DAE8.gif)
![](/Upload/2006-06/C7A6C3C498E73CD74372C9F4F9BCAE4F.gif)
![](/Upload/2006-06/03B2C218FC37779455D6A656C5D3692A.gif)
![](/Upload/2006-06/23C8359ABB890C707398E750061F5D20.gif)
![](/Upload/2006-06/A228507F572E9D361214390F876C0B31.gif)
![](/Upload/2006-06/B37D172BE0F0A07904FE7A4FA7D76F71.gif)
![](/Upload/2006-06/4A4D6C10092D29669B550E532D3B6E97.gif)
![](/Upload/2006-06/306A0916BFCE4FBCB8B67F7792890E16.gif)
![](/Upload/2006-06/D532FC16632903B813489498A5998EBA.gif)
![](/Upload/2006-06/A31B7C6196596A2ED7291260982354A0.gif)
![](/Upload/2006-06/888ABB71FF569E652EAC081817C1A983.gif)
![](/Upload/2006-06/3DF800A802FDAC4EA24D9169ED448AFC.gif)
![](/Upload/2006-06/E7D04628C71FD477130708E23AD9A2A1.gif)
![](/Upload/2006-06/CC43AA26D46121B5F650B4DAE626E465.gif)
![](/Upload/2006-06/8DD771DA130D4EE16A2B5A6F096320A5.gif)
![](/Upload/2006-06/08770A2959C5E3933B2D2BF00C74490A.gif)
![](/Upload/2006-06/8E2EBEAD7CDB1FB3C5FA80D7E19DF9CE.gif)
![](/Upload/2006-06/7F0FD61C86DF27A1A988E084AAFFA2B4.gif)
![](/Upload/2006-06/3A9DA9F2B10B05CAF122C2AD33F95225.gif)
![](/Upload/2006-06/EC99358FEC57E239734F93C662B4E9B9.gif)
![](/Upload/2006-06/DB34C913DCF0CFB909888FF07BFC3497.gif)
![](/Upload/2006-06/E4963AFD273DF30B0356CD6494DB5159.gif)
![](/Upload/2006-06/5D0BFEE6AA46F9236D558588EDC9859A.gif)
![](/Upload/2006-06/6A84E20C94307584BE5097733E46D88D.gif)
![](/Upload/2006-06/15283A0BC060C0E1C7198AC33DAAC4AB.gif)
![](/Upload/2006-06/282D8E04B438A406294C61A567987CBE.gif)
![](/Upload/2006-06/3FF64E9FD75A1A730C9EFF68940678B5.gif)
![](/Upload/2006-06/B4F93046B0016F4377EB74B694352EAF.gif)
![](/Upload/2006-06/CABF38EB542894E5A6CBBA65F6E978AD.gif)
![](/Upload/2006-06/1D4092916D34839F6AA21E348A75875A.gif)
![](/Upload/2006-06/F017B9EC6A7C3CE36951980C13C1185D.gif)
![](/Upload/2006-06/51CF872705D504A48C7B964A6CB8E620.gif)
![](/Upload/2006-06/57B7D97CF0C7D1628DA718E00087E3D4.gif)
![](/Upload/2006-06/5BACC7240B43B350E143109EA59993BF.gif)
![](/Upload/2006-06/A242E0B233636CF759913CFEB75A5402.gif)
![](/Upload/2006-06/7063BE3A983C14ECE680E3937B14E124.gif)
![](/Upload/2006-06/9D09459054C621DE88F440143DC7ACB9.gif)
![](/Upload/2006-06/BDF296F1332D22900188F46C5C7329A2.gif)
![](/Upload/2006-06/77B65EF40E9C4A67F9FD8CA7439D9478.gif)
![](/Upload/2006-06/2AE18C7049B14AA34A72E17D2B79C9B0.gif)
![](/Upload/2006-06/7E89AEE02A06C6EF924E61B53C1F4603.gif)
![](/Upload/2006-06/12852518D7D08869BB0656D78F5A4657.gif)
![](/Upload/2006-06/DE393CEF8746A8F2DBB9BC237E970212.gif)
![](/Upload/2006-06/DFFA591BEEEA6A7F7A8116E8E0BB1C98.gif)
![](/Upload/2006-06/69F9047C64D025D2E978CE2DD96C7EB9.gif)
![](/Upload/2006-06/9DF2FD770F8A0B20EC96BA801586569A.gif)
![](/Upload/2006-06/77DEA55D1721E345FEEC7F83219072BE.gif)
![](/Upload/2006-06/26C387904B6020A4C20BA7B4CDDBD688.gif)
![](/Upload/2006-06/346F1CD58900933485796BD03205F243.gif)
![](/Upload/2006-06/02F808565FC2983F1B7D47947FF229FE.gif)
![](/Upload/2006-06/61B3289A056009896FEAD015A626B982.gif)
![](/Upload/2006-06/87A1EFA1D8882F47312E50A1D9F11D64.gif)
![](/Upload/2006-06/6E9DC88F3DC567AB12DDF1D3AB6429EE.gif)
![](/Upload/2006-06/7B95DB7228C41C298718101F0418ED99.gif)
![](/Upload/2006-06/EE338848FBDDF70027CEE78EA6A08DF3.gif)
![](/Upload/2006-06/383D98242F8FD7886C67BC1112DF5ACC.gif)
![](/Upload/2006-06/E5043F5BC0EE336D281B2CDEBCC360F6.gif)
![](/Upload/2006-06/69627982533057F1D108E66EB30099DC.gif)
![](/Upload/2006-06/45E373B78B25499E7E2DF0FB8F85067C.gif)
![](/Upload/2006-06/BD6C1ED15E54F1E895AB14807872F567.gif)
![](/Upload/2006-06/6994A96E4C2D7FA432FB4FACBB31890D.gif)
![](/Upload/2006-06/FB6786E08B9C178BBA3BC6FD9DE3F59F.gif)
![](/Upload/2006-06/08C2ED710CA5A2DBCFB3C6295A0A8C13.gif)
![](/Upload/2006-06/AFAD4F90805CCAA5C388BFA81D69BD2A.gif)
![](/Upload/2006-06/B55C3D101DE9F96DC3538E7D3BC1857F.gif)
![](/Upload/2006-06/A3B38D7D14B8362F6567241D98503DD7.gif)
![](/Upload/2006-06/BF1182844B48D0BBCA5D4323F53A8407.gif)
![](/Upload/2006-06/0887442B5FF0BF1680076DA63896C487.gif)
![](/Upload/2006-06/D6DBFC4E11B93D9CDFF7D014B4882410.gif)
![](/Upload/2006-06/B8784271590EE9EB41E5F5F47A42CE84.gif)
![](/Upload/2006-06/D7BE50333DCFF4CD50CCB9ECF1CC503B.gif)
![](/Upload/2006-06/4FFBB99548A916E5DCF90BECA2CE4348.gif)
![](/Upload/2006-06/4D75BECAFEFD14C3B8999DC0FA281BDA.gif)
![](/Upload/2006-06/42016DA089E1A46C521AEB37A1772E99.gif)
![](/Upload/2006-06/16CC956BFB6708E6AFDA1EDC50266B60.gif)
![](/Upload/2006-06/255C6C7F28102CD9E99042EB4228F09B.gif)
![](/Upload/2006-06/DFF7A9E6F61C2DE207F92D7B4FB62970.gif)
![](/Upload/2006-06/3246187737052416981344E028440B18.gif)
![](/Upload/2006-06/5282089973DD2E5D0B1E85A838CC7D82.gif)
![](/Upload/2006-06/517867B942D5237629B6D0C0DE18DB31.gif)
![](/Upload/2006-06/C3E2BE8416F60C7F2634DB25C0FA0288.gif)
![](/Upload/2006-06/4A82B80D69721DB04F09567011954CA9.gif)
![](/Upload/2006-06/D8C002CD195391B9C93AE1654623A40B.gif)
![](/Upload/2006-06/81C3FC041DA592B0BB68DC02B8A67BF7.gif)
![](/Upload/2006-06/BEE591F8F7CBBEEDD31723F8424C9E3E.gif)
![](/Upload/2006-06/30D76C919C68C6736851A7794F159364.gif)
![](/Upload/2006-06/52238DFC6AA64B570C8D9500FBADAA9A.gif)
![](/Upload/2006-06/B6BC30C61DE7E201FD8A1BC3839E8322.gif)
![](/Upload/2006-06/EC621C125ABED87961545262178BE1ED.gif)
![](/Upload/2006-06/5586C160ABD7FB0ADC51C4A69978F987.gif)
![](/Upload/2006-06/984CF1A75BC0742A27B7DB88E1182CB3.gif)
![](/Upload/2006-06/4CA5CD770F629E500178C9CABDA1A76F.gif)
![](/Upload/2006-06/1B1A402152AB3803E6E7806EDFFAEEB2.gif)