比如:
BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
Graphics g = img.createGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, 300, 300);
然后,我希望能在打印机上输出1英寸的方块
DocFlavor psInFormat = DocFlavor.INPUT_STREAM.JPEG;
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
try {
ImageIO.write(img, "jpg", outstream);
}
catch (IOException e) {
e.printStackTrace();
}
byte[] buf = outstream.toByteArray();
InputStream stream = new ByteArrayInputStream(buf);
Doc myDoc = new SimpleDoc(psStream, psInFormat, null);
PrinterResolution printerResolution = new PrinterResolution(300, 300, PrinterResolution.DPI);
PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
attr.add(printerResolution);
attr.add(PrintQuality.HIGH);
PrintService services = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob job = services.createPrintJob();
try {
job.print(myDoc, aset);
}
catch (PrintException pe) {
pe.printStackTrace();
}
这段代码打印的结果是占据A4纸中央的一个大约2英寸的方块这种结果是因为图片转换造成的?还是图片的ppi设置的不对?还是打印参数有问题?

解决方案 »

  1.   

    我说的意思是1平方英寸,就是1英寸 x 1英寸的方块PrinterResolution printerResolution = new PrinterResolution(300, 300, PrinterResolution.DPI);
    这里是设定打印机为300dpi分辨率的,我的意思是,是不是300x300像素的方块用300dpi打印也是1inch x 1inch的
      

  2.   

    根据API说明上看 
    你这样设应该就是
    1英寸300像素了
      

  3.   

    现在新情况……我在ps里面建了一张300x300像素,分辨率300的jpg,结果PS和ACDSEE打印都是正常的1英寸大小,唯独用上面的方法打印依旧有问题(我是载入这张jpg打印的)
      

  4.   

    对打印这方面的确不是很了解
        attr.add(printerResolution);
        attr.add(PrintQuality.HIGH);
        PrintService services = PrintServiceLookup.lookupDefaultPrintService();
        DocPrintJob job = services.createPrintJob();
        try {
            job.print(myDoc, aset);
        }
        catch (PrintException pe) {
            pe.printStackTrace();
        }但是楼主这里上面定义的属性集是attr
    下面用的是aset
    不知道这里是发帖时的笔误还是程序原来就是这样呢?
    这个好像有点问题吧?
      

  5.   

    PrinterResolution printerResolution = new PrinterResolution(300, 300, PrinterResolution.DPI);
    PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
    attr.add(printerResolution);这个属性是用来搜索打印机用,即找出分辨率为300点的打印机。分辨率是打印机的固有属性,不能在打印时设置。属性有几种类型,一种是可以设置的打印方式,另一种是可以取得的固有属性。大概是这样。
      

  6.   

    aset那里是笔误……因为网上类似的程序名字都是用aset……我试过修改
        PrinterResolution printerResolution = new PrinterResolution(300, 300, PrinterResolution.DPI);
    这一行,改成600会使打印面积增加一倍,用尺量过之后发现约为105.8mm~4.167inch,也就是300x300像素在72dpi下应该打印的大小,可能该打印机默认为600dpi导致……很奇怪,应该说分辨率越大打印应该越小才对,为啥分辨率越高打印越大……搞不懂
      

  7.   

    呵呵,自己的老帖子,自己解决下
    java print api最终打印结果是只有72dpi的,需要精确打印的可以用graphic2D.Double对bufferedimage重新计算后输出……这个PrintResolution最终被我扔到一边……