title: Problem with printing in Java
body: <p>I have an application which talks to USB printer and prints out the receipt once a sale is completed. I have no problem with connecting to the printer and printing something. THe problem i have now is when i do some printing i could see only a part of my message gets printed on the receipt. I have attached the code i am using. Please help me to see the full printed receipt :)</p>
  
  <p>--CODE--  </p>
  
  <pre><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 &gt; 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;
      }
  
  }
  </code></pre>
  
  <p>And the main function where i call this class is</p>
  
  <pre><code>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 &lt; msg.length(); i += 5) {
              for (int j = 0; j &lt; 5; j++) {
                  if ((i + j) &lt; msg.length()) {
                      int x = msg.charAt(i + j);
                      display.append(String.format("%02x ", x));
                  }
              }
              display.append("   ");
              for (int j = 0; j &lt; 5; j++) {
                  if (i + j &lt; 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;
  
  }
  </code></pre>
  
  <p>When i print it i am getting the image like this<br>
  <img src="https://i.stack.imgur.com/g21JL.jpg" alt="enter image description here">  </p>
  
  <p>Actual content was something like this<br>
  <img src="https://i.stack.imgur.com/NgHy8.jpg" alt="enter image description here"></p>