2013-02-06 20 views
0

進出口使用的PrinterJob對象,以打印我的BufferedImage,我有一個BufferedImage我proccess,並與論文格式等發送到打印機的工作,我不能讓它能夠裝配到我的卡打印機。當我將它保存到我的硬盤並通過Windows打印管理器打印時,它在我的卡片打印機上打印效果非常好,但是與PrinterJob一起出來太大而且不適合卡片裝修的PrinterJob對象BufferedImage的特定打印格式

卡片的尺寸爲86X54mm,我的緩衝圖像的大小是1300x816px 驗證碼:

PrinterJob printjob = PrinterJob.getPrinterJob(); 
    printjob.setJobName("CardPrint"); 

    Printable printable = new Printable() { 

      public int print(Graphics pg, PageFormat pf, int pageNum) { 

        if (pageNum > 0) { 
          return Printable.NO_SUCH_PAGE; 
        } 
        JLayeredPane j1 = new JLayeredPane(); 
        Dimension size = j1.getSize(); 

        j1.print(bi.getGraphics()); 

        Graphics2D g2 = (Graphics2D) pg; 
        g2.translate(pf.getImageableX(), pf.getImageableY()); 
        g2.drawImage(bi, 0, 0, (int) pf.getWidth(), (int) pf.getHeight(), null); 

        return Printable.PAGE_EXISTS; 
      } 
    }; 

    Paper paper = new Paper(); 
    paper.setImageableArea(0, 0, 0, 0); 
    paper.setSize(1.15, 0.72); 

    PageFormat format = new PageFormat(); 
    format.setPaper(paper); 


    printjob.setPrintable(printable, format); 

    try { 
      printjob.printDialog(); 
      printjob.print(); 

    } catch (Exception eee){ 
      System.out.println("NO PAGE FOUND."+eee.toString()); 

    } 

我發現 paper.setSize(1.15,0.7); 是英寸(http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/print/Paper.html) paper.setImageableArea(0,0,0,0); ,我不知道這個setImageableArea。

沒有任何一個有關於當前尺寸的線索,難道我犯了一個錯誤計算? 謝謝。

回答

3

印刷首先,「打印樂趣多」 - 還記得,在凌晨2點重複此...

基本上,你需要從CM轉換您的紙張大小的像素開始。 Java使用72dpi作爲它的API。

所以你8.6x5.4cm的頁面大小計算出153.0708659856 X 243.7795273104像素

然後,你需要創建一個新的Paper滿足這些要求的網頁...

這一切都需要被折回到變成PageFormat並交還給PrintJob

Printable,你需要將圖像縮放爲「適合」可打印區域。圖像縮放的樂趣...

所以,我考,我有800x1159的圖像,這是縮減到166x241

有關圖像縮放更好的討論退房this question

public class PrintTest02 { 

    private static BufferedImage image; 

    public static void main(String[] args) { 
     try { 
      image = ImageIO.read(new File("/path/to/image.png")); 

      System.out.println(image.getWidth() + "x" + image.getHeight()); 

      PrinterJob pj = PrinterJob.getPrinterJob(); 
      if (pj.printDialog()) { 
       PageFormat pf = pj.defaultPage(); 
       Paper paper = pf.getPaper(); 
//      86X54mm 
       double width = fromCMToPPI(8.6); 
       double height = fromCMToPPI(5.4); 
       paper.setSize(width, height); 
       paper.setImageableArea(
           fromCMToPPI(0.1), 
           fromCMToPPI(0.1), 
           width - fromCMToPPI(0.1), 
           height - fromCMToPPI(0.1)); 
       pf.setOrientation(PageFormat.PORTRAIT); 
       pf.setPaper(paper); 
       PageFormat validatePage = pj.validatePage(pf); 
       System.out.println("Valid- " + dump(validatePage)); 
       pj.setPrintable(new MyPrintable(), validatePage); 
       try { 
        pj.print(); 
       } catch (PrinterException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } catch (IOException exp) { 
      exp.printStackTrace(); 
     } 
    } 

    protected static double fromPPItoCM(double dpi) { 
     return dpi/72/0.393700787; 
    } 

    protected static double fromCMToPPI(double cm) { 
     return toPPI(cm * 0.393700787); 
    } 

    protected static double toPPI(double inch) { 
     return inch * 72d; 
    } 

    protected static String dump(Paper paper) { 
     StringBuilder sb = new StringBuilder(64); 
     sb.append(paper.getWidth()).append("x").append(paper.getHeight()) 
         .append("/").append(paper.getImageableX()).append("x"). 
         append(paper.getImageableY()).append(" - ").append(paper 
         .getImageableWidth()).append("x").append(paper.getImageableHeight()); 
     return sb.toString(); 
    } 

    protected static String dump(PageFormat pf) { 
     Paper paper = pf.getPaper(); 
     return dump(paper); 
    } 

    public static class MyPrintable implements Printable { 

     @Override 
     public int print(Graphics graphics, PageFormat pageFormat, 
             int pageIndex) throws PrinterException { 
      System.out.println(pageIndex); 
      int result = NO_SUCH_PAGE; 
      if (pageIndex < 1) { 
       Graphics2D g2d = (Graphics2D) graphics; 
       System.out.println("[Print] " + dump(pageFormat)); 
       double width = pageFormat.getImageableWidth(); 
       double height = pageFormat.getImageableHeight(); 

       System.out.println("Print Size = " + fromPPItoCM(width) + "x" + fromPPItoCM(height)); 
       g2d.translate((int) pageFormat.getImageableX(), 
           (int) pageFormat.getImageableY()); 
       Image scaled = null; 
       if (width > height) { 
        scaled = image.getScaledInstance((int)Math.round(width), -1, Image.SCALE_SMOOTH); 
       } else { 
        scaled = image.getScaledInstance(-1, (int)Math.round(height), Image.SCALE_SMOOTH); 
       } 
       g2d.drawImage(scaled, 0, 0, null); 
       result = PAGE_EXISTS; 
      } 
      return result; 
     } 

    } 

} 
+0

謝謝,這種方法有效,但結果很差。我認爲下一步將是檢查如何使用Windows打印對話框進行打印。我發佈這個問題btw:http://stackoverflow.com/questions/14729127/printing-an-image-from-harddrive-via-windows-print-images-console-java ...再次感謝你 –