2011-04-19 94 views
2

我有一個應用程序會與USB打印機通話,並在銷售完成後打印出收據。連接到打印機和打印東西沒有問題。我現在遇到的問題是當我進行一些打印時,我可以看到只有部分信息打印在收據上。我附上了我使用的代碼。請大家幫我看看完整的打印收據:)在Java中打印時出現問題

--CODE--

package utilities; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane;  
import java.awt.print.PrinterJob;  
import java.awt.print.PageFormat; 
import java.awt.print.Printable;  
import java.awt.print.PrinterException; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D;  
public class ReceiptPrinter implements Printable { 
    private JFrame printFrame; 
    private String waitMsg; 
    private javax.swing.JTextArea jTextArea1;` 

    /** Inner class for the actual printed object */ 
    class PrintFrame extends JFrame { 

     PrintFrame(String msg) { 
      setBackground(new Color(255, 255, 255, 0)); 

      jTextArea1 = new javax.swing.JTextArea(); 

      jTextArea1.setColumns(80); 

      jTextArea1.setLineWrap(true); 

      jTextArea1.setRows(5); 

      jTextArea1.setWrapStyleWord(true); 

      jTextArea1.setText(msg); 

      add(jTextArea1); 
      pack(); 
      setVisible(true); 
     } 
    } 

    /** Creates a new instance of ReceiptPrinter with a default wait message */ 
    public ReceiptPrinter() { 
     waitMsg = "Wait for the printer to finish\nClick the OK button when done"; 
    } 

    /** 
    * Creates a new instance of ReceiptPrinter with a wait message. 
    * 
    * @param msg  the wait message 
    */ 
    public ReceiptPrinter(String msg) { 
     waitMsg = msg; 
    } 

    /** 
    * Sends the actual message to the receipt printer - does not wait. 
    * 
    * @param msg  the actual message to be printed 
    */ 
    public void printIt(String msg) { 
     printIt(msg, false); 
    } 

    /** 
    * Sends the actual message to the receipt printer. 
    * 
    * @param msg  the actual message to be printed 
    * @param wait show JOptionPane to wait for print to finish 
    */ 
    public void printIt(String msg, boolean wait) { 
     printFrame = new PrintFrame(msg); 

     PrinterJob job = PrinterJob.getPrinterJob(); 
     PageFormat format = job.defaultPage(); 
     format.setOrientation(PageFormat.PORTRAIT); 
     //double width = format.getWidth(); 
     System.out.println(format.getImageableX()+","+format.getImageableY()); 

     job.setPrintable(this, format); 

     try { 
      job.print(); 
      if (wait) { 
       JOptionPane.showMessageDialog(null, waitMsg, "Information", 
         JOptionPane.INFORMATION_MESSAGE); 
      } 
     } catch (PrinterException e) { 
      e.printStackTrace(); 
     } 
     //printFrame.dispose(); 
    } 

    /** 
    * Print method required by Printable interface. 
    * 
    * @param g  the graphics context 
    * @param format the page format 
    * @param pagenum the page number requested to print 
    * @return int  flag indicating page existance 
    */ 

    public int print(Graphics g, PageFormat pf, int pagenum) { 
     if (pagenum > 0) { 
      return Printable.NO_SUCH_PAGE; 
     } 
     //g.translate(0, 150); 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.translate(pf.getImageableX(), pf.getImageableY()); 

     /* Print the entire visible contents of a java.awt.Frame */ 
     printFrame.printAll(g2d); 
     //g.translate((int) format.getImageableX(), 
      //  (int) format.getImageableY()); 
     //printFrame.paint(g); 
     return Printable.PAGE_EXISTS; 
    } 

} 

和主要功能那裏我調用這個類是

package utilities; 
import forms_helper.global_variables; 
import java.awt.Dimension; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import javax.swing.JOptionPane; 
public class PrintTest extends javax.swing.JFrame { 
    private ReceiptPrinter receiptPrinter = new ReceiptPrinter(); 
    private FileOutputStream fos; 
    public PrintTest() { 
     initComponents(); 
     setPreferredSize(new Dimension(300, 200)); 
     pack(); 
     try { 
      fos = new FileOutputStream("USB002");  
     } 
     catch (FileNotFoundException e) { 
      JOptionPane.showMessageDialog(this, "Cannot open file\n" + e.getMessage(), 
        "Warning", JOptionPane.WARNING_MESSAGE); 
     } 
    }` 

    private void initComponents() { 
     openButton = new javax.swing.JButton(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     display = new javax.swing.JTextArea(); 
     exitButton = new javax.swing.JButton(); 

     getContentPane().setLayout(null); 

     setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); 
     openButton.setFont(new java.awt.Font("Tahoma", 1, 11)); 
     openButton.setText("Open"); 
     openButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       openButtonActionPerformed(evt); 
      } 
     }); 

     getContentPane().add(openButton); 
     openButton.setBounds(151, 120, 80, 23); 

     display.setColumns(20); 
     display.setRows(5); 
     jScrollPane1.setViewportView(display); 

     getContentPane().add(jScrollPane1); 
     jScrollPane1.setBounds(10, 10, 220, 92); 

     exitButton.setFont(new java.awt.Font("Tahoma", 1, 11)); 
     exitButton.setText("Exit"); 
     exitButton.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       exitButtonActionPerformed(evt); 
      } 
     }); 

     getContentPane().add(exitButton); 
     exitButton.setBounds(10, 120, 70, 23); 

     pack(); 
    } 

    private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) { 
     try { 
      fos.close(); 
     } 
     catch (IOException e) { 
      JOptionPane.showMessageDialog(this, "Unable to close printer port", 
        "Warning", JOptionPane.WARNING_MESSAGE); 
     } 
     dispose(); 
    } 

    private void openButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    // this section attempts to send the BEL character to the printer port 
     byte bel = 0x07; 
     try { 
      fos.write(bel); 
      fos.flush(); 
     } 
     catch (IOException e) { 
      JOptionPane.showMessageDialog(this, "Error trying to write\n" + e.getMessage(), 
        "Warning", JOptionPane.WARNING_MESSAGE); 
     } 
    // this section appends the BEL to the printed message and sends it to the Windows printer 
     //String msg = "test \n test"; 
     String msg=global_variables.msg; 
     msg += ((char) 0x07); 

     receiptPrinter.printIt(msg); 
    // this section displays a hex dump of the printed message 
    // note that the BEL is being converted to a box and that 
    // is what actually prints on the printer instead of the beep 
     for (int i = 0; i < msg.length(); i += 5) { 
      for (int j = 0; j < 5; j++) { 
       if ((i + j) < msg.length()) { 
        int x = msg.charAt(i + j); 
        display.append(String.format("%02x ", x)); 
       } 
      } 
      display.append(" "); 
      for (int j = 0; j < 5; j++) { 
       if (i + j < msg.length()) { 
        char c = msg.charAt(i + j); 
        display.append(String.format(" %c", c)); 
       } 
      } 
      display.append("\n"); 
     } 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new PrintTest().setVisible(true); 
      } 
     }); 
    } 

    private javax.swing.JTextArea display; 
    private javax.swing.JButton exitButton; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JButton openButton; 

} 

當我打印出來我是獲取圖像這樣
enter image description here

實際內容是這樣的
enter image description here

+0

重新格式化的代碼;如果不正確請回復。 – trashgod 2011-04-19 18:15:04

+0

謝謝你.. – Deepak 2011-04-19 18:17:38

+0

沒問題。你可以看看'get'mageableWidth'和'getImageableHeight'與'Graphics'剪裁邊界的比較。 – trashgod 2011-04-19 18:22:21

回答

1

你能告訴我更多嗎?

通過比較返回g.getClipBounds()getImageableWidth()getImageableHeight()PageFormat發現的矩形。它看起來像你的圖像被剪裁到打印機的默認尺寸Paper

+0

約束:java.awt.Rectangle中[X = 0,Y = -1,寬度= 61,高度= 3681] getImageableWidth():60.80315017700195 getImageableHeight():697.6063232421875 – Deepak 2011-04-19 18:45:52

+0

這似乎與'PageFormat.PORTRAIT'一致;你可以嘗試'PageFormat.LANDSCAPE'。 – trashgod 2011-04-19 19:53:54

1

我不確定這是否是問題,但我似乎回想起使用Graphics對象時,您需要'撤銷'完成後對其所做的所有更改。所以,你需要在打印方法

g2d.translate(-pf.getImageableX(), -pf.getImageableY()); 

的打印方法可以被調用多次,甚至在同一頁的末尾添加此行 - 也許你只是翻譯Graphics對象太遠。