Java PrinterJob,无论怎样,高质量的打印最终都会达到72 DPI

Java PrinterJob,无论怎样,高质量的打印最终都会达到72 DPI,java,printing,Java,Printing,我正在尝试以300 dpi打印质量在1英寸x 2英寸标签上打印图像 public void print() { RepaintManager currentManager = RepaintManager.currentManager(this); currentManager.setDoubleBufferingEnabled(false); PrinterJob job = PrinterJob.getPrinterJob();

我正在尝试以300 dpi打印质量在1英寸x 2英寸标签上打印图像

public void print() {
        RepaintManager currentManager =  RepaintManager.currentManager(this);
        currentManager.setDoubleBufferingEnabled(false);

        PrinterJob job = PrinterJob.getPrinterJob();

        try {
            HashPrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
            set.add(PrintQuality.HIGH);
            set.add(MediaSize.findMedia(2.125f, 1f, MediaSize.INCH));
            // 2" x 1" PrintableArea
            set.add(new MediaPrintableArea(1f/16f, 0f, 2.0f, 1f, MediaPrintableArea.INCH));
            set.add(new PrinterResolution(300, 300, ResolutionSyntax.DPI));
            set.add(OrientationRequested.PORTRAIT);
            job.setPrintable(this);
            job.setJobName("Label");
            job.print(set);
        } catch (PrinterException e) {
            // The job did not complete successfully
            e.printStackTrace();
        }
        currentManager.setDoubleBufferingEnabled(true);
    }
我的BuffereImage是300 x 600像素,应该适合

BufferedImage bi = freeze(this); //getting BufferedImage from JPanel
System.out.println("Image dim: "+bi.getWidth()+" X "+bi.getHeight());
控制台输出:图像尺寸:600 X 300

但问题是当我打印出可成像的尺寸时,比如

        double x=pf.getImageableX();
        double y=pf.getImageableY();
        int w = (int)Math.round(pf.getImageableWidth());
        int h = (int)Math.round(pf.getImageableHeight());
        System.out.println("X: "+x);
        System.out.println("Y: "+y);
        System.out.println("W: "+w);
        System.out.println("H: "+h);
结果是:

X: 4.50141716003418
Y: 0.0
W: 144
H: 72
来自h&w:我这里每英寸有72个像素,任何大小调整都没有效果,这没有意义

HashPrintRequestAttributeSet对300 DPI的请求有什么用处?

清楚地说明:

返回页面可成像区域的高度,单位为1/72英寸。此方法考虑了页面的方向

(getImageableWidth()的API文档与之类似。)

当您将可打印区域指定为2x1英寸时(请参见代码中的
MediaPrintableArea
属性),可成像宽度和高度分别为144英寸。72英寸(1/72英寸)


方法文档中没有关于DPIs的一个词。

多亏了本教程中的“Marty Hall”,魔法才刚刚发生 我所做的是:

1-不要在要打印的同一面板上实现可打印接口 2-使用实用程序类(教程中提到的用于执行此任务) 3-使用一个图形对象绘制所有组件(位置图像),不要堆叠/布局许多组件来绘制面板

@Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        RenderingHints rh = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);    
        g2d.setRenderingHints(rh);

        // Grids for testing porpose
        for(int i=50; i<=300; i+=50) {
            g2d.drawLine(i, 0, i, 600);
            g2d.drawString(""+i, i-20,20);
        }
        for(int i=100; i<=400; i+=100) {
            g2d.drawLine(0, i, 300, i);
            g2d.drawString(""+i, 10,i-10);
        }
        g2d.translate(0, 400);
        BufferedImage barcodeImage=getBarCode128(String.valueOf(1234567));
        g2d.drawImage(barcodeImage, 0, 0, 300, 200, null);
    }
5-根据需要进行平移和缩放,然后打印面板

public int print(Graphics g, PageFormat pf, int pageIndex) {
    if (pageIndex > 0) {
      return(NO_SUCH_PAGE);
    } else {
      Graphics2D g2d = (Graphics2D)g;
      g2d.translate(pf.getImageableX(), pf.getImageableY());
      g2d.scale(pf.getImageableWidth()/componentToBePrinted.getWidth(), pf.getImageableHeight()/componentToBePrinted.getHeight());
      disableDoubleBuffering(componentToBePrinted);
      componentToBePrinted.paint(g2d);
      enableDoubleBuffering(componentToBePrinted);
      return(PAGE_EXISTS);
    }
  }

谢谢您的回复,但我的问题是“如何将300像素调整为72像素?”是否尝试缩放图形g2d.scale()或GetScaleInstance会获得72 DPI打印分辨率的相同结果,不管我是如何完成这项工作的,但仍然不知道问题在哪里trick@WalidKilany“72 DPI打印分辨率”是什么意思?你怎么知道的?正如我在回答中所述,
getImageableWidth()
不会返回任何与实际打印分辨率相关的内容。除此之外,您还可以将可打印区域设置为1x2英寸。。。
public int print(Graphics g, PageFormat pf, int pageIndex) {
    if (pageIndex > 0) {
      return(NO_SUCH_PAGE);
    } else {
      Graphics2D g2d = (Graphics2D)g;
      g2d.translate(pf.getImageableX(), pf.getImageableY());
      g2d.scale(pf.getImageableWidth()/componentToBePrinted.getWidth(), pf.getImageableHeight()/componentToBePrinted.getHeight());
      disableDoubleBuffering(componentToBePrinted);
      componentToBePrinted.paint(g2d);
      enableDoubleBuffering(componentToBePrinted);
      return(PAGE_EXISTS);
    }
  }