用Java打印的问题

时间:2011-04-19 17:21:13

标签: java swing printing

我有一个与USB打印机对话的应用程序,并在销售完成后打印出收据。连接打印机和打印东西没问题。我现在的问题是,当我做一些打印时,我只能看到我的信息的一部分被打印在收据上。我附上了我正在使用的代码。请帮我看看完整的打印收据:)

- 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

2 个答案:

答案 0 :(得分:1)

  

你能告诉我更多吗?

g.getClipBounds()返回的矩形与PageFormat中找到的getImageableWidth()getImageableHeight()进行比较。看起来您的图像被裁剪为打印机默认Paper尺寸。

答案 1 :(得分:1)

我不确定这是不是问题,但我似乎记得在使用Graphics对象时,你需要“撤消”你完成后对它所做的所有更改。所以你需要在print方法的末尾添加这一行

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

即使对于同一页面,也可以多次调用print方法 - 也许你只是将​​Graphics对象翻译得太过分了。