Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javax.print通过cups打印_Java_Printing - Fatal编程技术网

使用javax.print通过cups打印

使用javax.print通过cups打印,java,printing,Java,Printing,如果我使用命令lpfilename,我有一个工作正常的文件 该文件是回执冲击式打印机的ESC/p文件。它有linux本机CUPS驱动程序和所有可用的功能 我正在尝试使用javax.printAPI,这样我就可以对打印进行更细粒度的控制,并希望保持跨平台的兼容性,尽管Linux是目标平台 我尝试了人类已知的每种DocFlavor组合和每种类型的数据类型(InputStream,byte[],Reader等) 它要么完全忽略print()命令,要么干脆翻出一张空白纸。运行lp filename可以完

如果我使用命令
lpfilename
,我有一个工作正常的文件

该文件是回执冲击式打印机的ESC/p文件。它有linux本机CUPS驱动程序和所有可用的功能

我正在尝试使用
javax.print
API,这样我就可以对打印进行更细粒度的控制,并希望保持跨平台的兼容性,尽管Linux是目标平台

我尝试了人类已知的每种DocFlavor组合和每种类型的数据类型(
InputStream
byte[]
Reader
等)

它要么完全忽略
print()
命令,要么干脆翻出一张空白纸。运行
lp filename
可以完美地打印它,那么如何让
javax.print
只执行与
lp filename
相同的功能呢

我不打算使用javax.print,我可以使用其他“东西”,可能会开始研究cups4J,但它似乎将我限制在Linux/*nix上,目前还可以,但我更希望有一个跨平台的解决方案

我可以对文件发出
lp
system命令,但我需要更细粒度的控制。这些不是我们正在打印的收据,它们是票,票的价格从5美元到数千美元不等。目前,如果我们检测到打印问题,我们将使交易无效,如果打印的内容无效,我们不会轻易重印,如果客户丢失了副本,大多数情况下,我们会收取打印新副本的费用。哦,这样做的原因是我们将POS系统从Windows改为Linux,打印机从通过串行端口直接访问改为通过USB管理的CUPS。这是我不起作用的代码。感谢您的帮助

try {
    // Find the default service
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

    PrintService service = PrintServiceLookup.lookupDefaultPrintService();

    // Create the print job
    DocPrintJob job = service.createPrintJob();
    InputStream in = new FileInputStream("/home/bart/real.escp");
    Doc docNew = new SimpleDoc(in,flavor,null);

    // Monitor print job events; for the implementation of PrintJobWatcher,
    // see Determining When a Print Job Has Finished
    PrintJobWatcher pjDone = new PrintJobWatcher(job);

    // Print it
    job.print(docNew, null);

    // Wait for the print job to be done
    pjDone.waitForDone();

    // It is now safe to close the input stream
    in.close();
} catch (PrintException e) {
} catch (IOException e) {
}
我对cups4j很满意。 先拿你的打印机

try { 
        CupsClient client = new CupsClient("addressOfTheCupsServer", 631);
        List<CupsPrinter> printers = client.getPrinters();
        if (printers.size() == 0) {
            throw new RuntimeException("Cant list Printer");
        }
        for (CupsPrinter cupsPrinter : printers) {
            if (cupsPrinter.getName().equals("NameOfPrinter")) {
                selectedPrinter = cupsPrinter;
            }
        }
    }catch (Exception ignored){
        ignored.printStackTrace();
    }
}

在linux上从Java打印充其量是危险的。我已经开始使用lpr命令到命令行进行一些打印。一个选项可能是,看看你是否可以将文件转换成Java能理解的格式,比如PDF,然后在上面使用javax.print。这就是问题所在,可能有一个linux esc/p转换器,但是为什么要在lp命令打印得很好的时候费事呢?这似乎是自找麻烦从esc/p(可以直接输入打印机)->PDF(让Java高兴)->ESC/P(通过驾驶员)。我们正在生成ESC/P文件。无论如何,使用Cups4J效果很好,大约需要15分钟来实现。我想我会使用cups4J,并在其他操作系统/打印系统出现问题时处理它们。这对我来说是可行的,但我尝试打印字节[]数组,这导致打印符号出现问题。我必须通过CUPS服务器将打印机设置为pdf格式,并且它工作正常。我想知道是否可以通过代码配置字节数组为pdf。
 PrintJob printJob = new PrintJob.Builder(inputStream).jobName("Jobname").build();
    PrintRequestResult result = selectedPrinter.print(printJob);