服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

在java程序中实现高精度打印


  在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程序中实现高精度打印(图一百零三)
在java程序中实现高精度打印(图一百零四)

扫描关注微信公众号