文件尚未通过 java 中的打印机设备打印

Posted

技术标签:

【中文标题】文件尚未通过 java 中的打印机设备打印【英文标题】:File has not been printed Through Printer device in java 【发布时间】:2016-05-20 08:56:24 【问题描述】:

我想打印一个文件。我为此编写了这段代码。但它不打印我的文件。 选择服务:

      String printerName = "Canon MF4320-4350".toLowerCase();
    PrintService service = null;

    PrintService[] services = PrinterJob.lookupPrintServices();

    // Retrieve a print service from the array
    for (int index = 0; service == null && index < services.length; index++) 

        if (services[index].getName().toLowerCase().indexOf(printerName) >= 0) 
            service = services[index];
        
    

用于打印:

    byte[] bytes = null;
    Path path = FileSystems.getDefault().getPath("D:\\Test.docx");
    bytes = Files.readAllBytes(path);
    DocFlavor docFlavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    PrintRequestAttributeSet faset = new HashPrintRequestAttributeSet();
    faset.add(new Copies(5));
    faset.add(Sides.ONE_SIDED);
    DocAttributeSet daset = new HashDocAttributeSet();
    daset.add(OrientationRequested.LANDSCAPE);
    daset.add(Sides.ONE_SIDED);
    Doc myDoc = new SimpleDoc(bytes, docFlavor, daset);
    //create the DocPrintJob
    DocPrintJob job = service.createPrintJob();
    job.print(myDoc, faset);

【问题讨论】:

【参考方案1】:

这不是打印的工作方式 - 当 Word 打印出 docx 文件时,它不会将文件的原始字节发送到打印机。相反,它将文件转换为发送给打印驱动程序的低级打印命令。

Java 打印 API 可以处理 2d rendering via drawing commands,或者它允许您将原始字节流发送到打印机,但您有责任制作打印机可以理解的字节。

另请参阅this question,并查看docx4j。

【讨论】:

谢谢你,Adrian,但是如果我把 .txt 文件放在这里,它也不起作用。 如果您打算通过向打印机发送字节流进行打印,最好的参考是 Linux 打印为您的打印机使用的过滤器 (wiki.debian.org/PrinterDriver/Canon/UFR-II)。我不认为佳能喷墨打印没有翻译为 UFR 的纯文本。 比你 :),除了向打印机发送字节流之外,还有其他方法吗? 所有打印技术都很复杂:您可以生成自己的页面布局,或者运行 Word,或者使用 Linux 打印服务器来转换格式,或者选择本机理解您的格式的打印机型号想要。

以上是关于文件尚未通过 java 中的打印机设备打印的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PowerShell 将“设备和打印机”中的对象查询到数组中

java 获取电脑设备打印机状态,越具体越好,做过的请帮忙理下思路,好

直接通过通过localhost访问网站的android设备打印

为啥明明已经安装了打印机,可打印的时候却提示尚未安装?

通过 Java 中的套接字发送打印机命令

如何通过JAVA代码调用网络打印机使其打印接收到的文件