2013-03-04 66 views
1

在我的應用程序中,以下代碼打印卡的正面和背面。在虛擬打印機(如Virtual PDF打印機,ImagePrinter Pro和Microsoft XPS Document Writer)上,輸出是正確的。但是當我在真正的打印機上測試它時,它只打印寬度的一半圖像,而且高度正確。我測試了A4和Letter合成器,但都是風向標。不要khow有什麼問題。到真實打印機的打印輸出不同於在java中使用虛擬打印機的打印輸出

public int print(Graphics g, PageFormat pageFormat, int pageIndex) { 
     Graphics2D g2d = (Graphics2D) g; 

     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, 
       RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
       RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_RENDERING, 
       RenderingHints.VALUE_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
       RenderingHints.VALUE_INTERPOLATION_BICUBIC); 

     int w = 360, h = 240; 
     int padding = 2; 

     BufferedImage temp = new BufferedImage(w * 2, h, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D tempG = temp.createGraphics(); 

     tempG.drawImage(card.getFrontImage(), 0, 0, 
       w, h, null); 
     tempG.drawImage(card.getBackImage(), w, 0, 
       w, h, null); 
     tempG.dispose(); 

     g2d.drawImage(temp, (int) 0, 0 + padding, 
       (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableHeight()/5, null); 
} 

任何幫助?

+0

你如何建立的PageFormat? – MadProgrammer 2013-03-04 09:07:56

+0

甚至沒有碰它。無法弄清楚如何處理PageFormat。 – junoonmera 2013-03-04 09:32:23

回答

1

這是非常簡單的例子...

PageFormat能手動創建(如上例),或從打印機選擇對話框

public class TestPrint implements Printable { 

    private BufferedImage background; 
    public static final float DPI = 72; 

    public static void main(String[] args) { 
     new TestPrint(); 
    } 

    public TestPrint() { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception ex) { 
       } 

       try { 
        background = ImageIO.read(new File("/Users/swhitehead/Dropbox/MegaTokyo/MgkGrl_Yuki_by_fredrin.jpg")); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

       float width = cmToPixel(21f, DPI); 
       float height = cmToPixel(29.7f, DPI); 

       Paper paper = new Paper(); 
       float margin = cmToPixel(1, DPI); 
       paper.setImageableArea(margin, margin, width - (margin * 2), height - (margin * 2)); 
       PageFormat pf = new PageFormat(); 
       pf.setPaper(paper); 

       BufferedImage img = new BufferedImage(Math.round(width), Math.round(height), BufferedImage.TYPE_INT_RGB); 
       Graphics2D g2d = img.createGraphics(); 
       g2d.setColor(Color.WHITE); 
       g2d.fill(new Rectangle2D.Float(0, 0, width, height)); 
       try { 
        g2d.setClip(new Rectangle2D.Double(pf.getImageableX(), pf.getImageableY(), pf.getImageableWidth(), pf.getImageableHeight())); 
        print(g2d, pf, 0); 
       } catch (PrinterException ex) { 
        ex.printStackTrace(); 
       } 
       g2d.dispose(); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JLabel(new ImageIcon(img))); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

      } 
     }); 

    } 

    public float cmToPixel(float cm, float dpi) { 

     return (dpi/2.54f) * cm; 

    } 

    public int print(Graphics graphics, PageFormat pageFormat, int page) throws PrinterException { 

     if (page > 0) { 
      return NO_SUCH_PAGE; 
     } 

     Graphics2D g = (Graphics2D) graphics; 

     g.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 
     if (background != null) { 

      int x = (int)Math.round((pageFormat.getImageableWidth() - background.getWidth())/2f); 
      int y = (int)Math.round((pageFormat.getImageableHeight() - background.getHeight())/2f); 

      g.drawImage(background, x, y, null); 

     } 

     g.setColor(Color.BLACK); 
     g.draw(new Rectangle2D.Double(0, 0, pageFormat.getImageableWidth() - 1, pageFormat.getImageableHeight() - 1)); 

     return PAGE_EXISTS; 
    } 
} 
+0

謝謝你很多。 – junoonmera 2013-03-08 07:53:44

+0

你真的增強了我對這種印刷材料的知識基礎。但問題仍然存在。我的代碼寬度只打印一張卡片(拉長的一張)。我已經設置了一個循環來打印5張卡片,這是可行的,但每張卡片的背面都不打印。 – junoonmera 2013-03-08 07:59:52

+0

那麼,你在A4頁面上打印雙面?卡的大小和圖像的大小是多少? – MadProgrammer 2013-03-08 08:14:53