【问题标题】:Thermal Printing in Java "Printer is not accepting job"Java中的热敏打印“打印机不接受作业”
【发布时间】:2014-08-11 12:31:23
【问题描述】:

我在 java 中编写了用于热敏打印的 java 代码,我仅使用 microsoft xps 文档编写器 在本地机器上对其进行了测试,并且工作正常,但是当我使用 Xprinter XP-F900 打印机我得到下一个错误

打印机不接受作业

完整代码:

public class printThisBill {


    public static void printCard(final String bill) {

        Printable contentToPrint = new Printable() {            

            @Override
            public int print(Graphics graphics, PageFormat pageFormat, int page)
                    throws PrinterException {
                if (page > 0) {
                    return NO_SUCH_PAGE;
                }
                pageFormat.setOrientation(PageFormat.LANDSCAPE);
                Graphics2D g2d = (Graphics2D) graphics;
                g2d.translate(pageFormat.getImageableX(),
                        pageFormat.getImageableY());
                g2d.setPaint(Color.black);
                g2d.setFont(new Font("Arial", Font.BOLD, 10));

                int y = 15;
                Font f = new Font(Font.SANS_SERIF, Font.PLAIN, 8);
                graphics.setFont(f);
                for (int i = 0; i < Tbill.length; i++) {
                    graphics.drawString(Tbill[i], 5, y);
                    y = y + 15;
                }
                return PAGE_EXISTS;
            }
        };

        PrinterService ps = new PrinterService();
        PrintService pss = null;
        PrinterJob job = null;
        // get the printer service by printer name
        // first test if printer defind by the use search on db
        String query = "SELECT * FROM printer WHERE id_printer=1";
        conn = DBconnect.connectDB();
        if (db.TestIFex(query, conn)) {
            Statement sqlState = null;
            ResultSet rows = null;
            try {
                sqlState = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
                        ResultSet.CONCUR_READ_ONLY);
                rows = sqlState.executeQuery(query);
                String printer_name = rows.getString(2);
                pss = ps.getCheckPrintService(printer_name);
                job = PrinterJob.getPrinterJob();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    sqlState.close();
                    rows.close();
                } catch (Exception e) {
                }
            }

        } else {
            job = PrinterJob.getPrinterJob();
            pss = job.getPrintService();
        }

        try {
            job.setPrintService(pss);

        } catch (PrinterException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        job.setPrintable(contentToPrint);
        try {
            job.print();
        } catch (PrinterException e) {
            System.err.println(e.getMessage());
        }    
    }
}

【问题讨论】:

  • 请将您的代码简化为 minimal 示例。帐单格式的详细信息与连接打印机无关。
  • 它是否比“打印机不接受作业?”可能有数百个原因...
  • @Fildor “打印机不接受作业”我得到的所有内容
  • 您是否尝试过除 XPS 之外的其他打印机型号?
  • 我不是我测试的第一台热敏打印机(当我使用 XPS 工具“安装驱动程序时 XPS 提供的用于测试的软件”时它工作)@Fildor

标签: java printing jobs


【解决方案1】:

我的第一个猜测是计算机无法识别打印机。当我使用 Java 进行热敏打印时,我会遇到这个问题,只是意识到打印机没有连接到我的计算机,或者我在代码中调用了不正确的打印机。

我的第二个猜测是,如果您尝试打印 Graphics2D 对象或图像,则需要使用字节命令。热敏打印机使用起来真的很乏味,因为没有任何标准,很可能需要查看文档以了解如何打印条形码/剪切/更改字体等。

打印机的名称可能与您想象的完全不同。所以我建议首先测试使用 System.out.println() 来查看你得到的打印机,如果你还没有这样做,我还建议将你希望使用的热敏打印机设置为默认打印机。

        DocPrintJob job =  PrintServiceLookup.lookupDefaultPrintService().createPrintJob();
        System.out.println(job + " <- printer");

首先看看你能从中得到什么。可能和你想的很不一样。

这是一个简单的示例,看看您是否可以使用我制作的方法使用打印机打印字符串,该方法应该对热敏打印机通用。

    public void PrintString(String s) throws Exception{
    DocPrintJob job = PrintServiceLookup.lookupDefaultPrintService().createPrintJob();
    //Get's the default printer so it must be set.
    System.out.println(job + " <- printer");
    DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    byte[] b = s.getBytes("CP437");
    //Get's the bytes from the String(So that characters such as å ä ö may be printed).
    Doc doc = new SimpleDoc(b, flavor, null);
    //Includes the content to print(b) and what kind of content it is (flavor, in this case a String turned into a byte array).
    job.print(doc, null);          
}

只需使用您希望用作参数的任何字符串调用它,然后查看结果是什么。同样,您需要将您希望使用的热敏打印机设置为默认值(如果您使用的是 Windows,您可以在控制面板中执行此操作,我无法想象在其他操作系统上这样做非常困难)。

如果您能够打印字符串但无法打印图形选项。然后你需要去here下载《程序员手册最新版》或者适合你需要的手册。您可能还想去制造商website 阅读更多信息。使用热敏打印机进行开发并不容易,如果您想打印任何花哨的东西,则需要大量工作。

尝试打印字符串并说出你得到的结果。你没有说天气,或者你没有先测试打印一个简单的字符串,然后再转到诸如 Graphics2D 之类的高级东西。

此外,这里还有一些关于 stackoverflow 的其他问题/答案,可以帮助您充分利用热敏打印机。

(如何让打印机打印得更快)

How to improve speed with Receipt printer and ESC/POS commands in Java

(如何打印转换为Graphics对象的String)

Printing reciepts with thermal printer in java

希望这能为您提供所需的帮助..真诚的..

//奥维尔·诺德斯特罗姆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多