Java PrinterJob,高质量的打印无论如何都会得到72 DPI

问题描述 投票:0回答:2

我正在尝试以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);
    }

我的BufferedImage是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像素,任何调整大小都没有效果,这没有意义,

300 DPI的HashPrintRequestAttributeSet请求有什么用?

java printing
2个回答
0
投票

API docs of PageFormat#getImageableHeight()清楚地说:

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

([PageFormat#getImageableHeight()的API文档相似。]

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

方法文档中没有关于DPI的任何单词。


0
投票

[魔术刚发生了,这要感谢“ Marty Hall”提供的本教程MediaPrintableArea我所做的是:

1-不在您要打印的同一面板上实现可打印界面2-使用实用程序类(本教程中提到的完成工作)3-使用一个图形对象绘制所有组件(位置图像),不要堆叠/布局许多组件以绘制面板

"Printing Swing Components in Java 1.2"

4-将HashPrintRequestAttributeSet添加到print()方法,因为“ Marty Hall”类使用printDialog()来做到这一点,不适用于我]

@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 void print() {
    PrinterJob printJob = PrinterJob.getPrinterJob();

    HashPrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
    set.add(PrintQuality.HIGH);
    set.add(MediaSize.findMedia(1f, 2.125f, MediaSize.INCH));
    set.add(new MediaPrintableArea(0f, 1f/16f, 1f, 2.0f, MediaPrintableArea.INCH));
    set.add(new PrinterResolution(300, 300, ResolutionSyntax.DPI));
    set.add(OrientationRequested.PORTRAIT);

    printJob.setPrintable(this);
      try {
        printJob.print(set);
      } catch(PrinterException pe) {
        System.out.println("Error printing: " + pe);
      }
  }

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); } }

© www.soinside.com 2019 - 2024. All rights reserved.