如何使用行式打印机直接从 java 使用打印机的字体进行打印?

How to print using a line printer dirictly from java using the fonts of the printer?

我想直接使用行式打印机进行打印,即点阵打印机,它使用我的 JAVA 程序中的字体制表符 return 和换行功能。我基本上知道如何从 JAVA 打印。我的问题是,在JAVA打印中,我们首先生成要打印页面的图形图像,然后将其发送到打印机进行打印。但我不是在这些方面提出我的问题。我想直接将文本作为字符流发送到打印机,并使用适用于打印机的命令 return、换行符、制表符和打印机字体,就像过去的图形打印机一样未使用激光或喷墨打印机。

如果有人能在这些方面指导我,我将不胜感激。提前致谢。

附加信息

一些评论建议从 JTextComponent 打印的简单方法。在这里我们不必完成创建由 JTextComponent 自动处理的图形可打印任务,但我的问题是如何打印 而不创建图形可打印。这意味着首先我 select 从我的打印机可用字体中使用的字体说 "courier" 然后我将 'A' 发送到打印机并且打印机打印 'A' 在 "courier",然后当我将 'B' 发送到打印机时,打印机在 "courier" 中打印 'B' 等等,直到我更改打印机中的 selected 字体。现在在该行的末尾,我发送 \n 进行换行,这将使我的打印机的滚筒前进一行,并发送 \r 进行回车 return ,这将使我的打印机的打印头到达该行的开头。

澄清一下,我不想使用可打印接口,因为此接口的打印方法基本上用于使用作为参数传递给打印方法的图形对象来生成图形图像。此后,JVM 将此图形对象发送到打印机以作为图像打印。这不是我想要的。我想使用行式打印机的字体和其他命令功能。

此代码不需要任何 Swing 相关组件,但仍然需要 Graphics class of awt,但您可以从控制台打印文本没有显示 UI 组件,刚刚测试了它:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.PageRanges;


public class DirectPrint implements Printable {

private PrintService[] printService;
private String text;

public DirectPrint() {
    this.printService = PrinterJob.lookupPrintServices();
}

public static void main(String[] args) {
    DirectPrint lt = new DirectPrint();
    lt.printString("If this text gets printed, it will have worked! ;D");
}

public void printString(String input) {

    this.text = input;

    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
    aset.add(new PageRanges(1, 1));
    aset.add(new Copies(1));

    PrinterJob printJob = PrinterJob.getPrinterJob();
    printJob.setPrintable(this);

    try {
        printJob.setPrintService(getDefaultPrintService());
        //index of installed printers on you system
        //not sure if default-printer is always '0'
        printJob.print(aset);
    } catch (PrinterException err) {
        System.err.println(err);
    }
}

public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
    Graphics2D g2 = (Graphics2D) g;
    g2.translate(pf.getImageableX(), pf.getImageableY());
    g.drawString(String.valueOf(this.text), 14, 14);
    return PAGE_EXISTS;
  }
}

方法 getDefaultPrintService() 可能 return 无效,具体取决于您的系统。

来源:CodeRanch

** 编辑 **

进一步说明,使用下面的代码,没有涉及Graphic对象。

  InputStream in = null;
try {
log.debug("preparing input stream");
in = getFileTobePrinted();
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

// find the printing service
log.debug("fetching print service");
AttributeSet attributeSet = new HashAttributeSet();
attributeSet.add(new PrinterName("lq2170", null));
PrintService[] services = PrintServiceLookup.lookupPrintServices(null,  attributeSet);

// create the print job
log.debug("creating print job");
DocPrintJob job = services[0].createPrintJob();
Doc doc = new SimpleDoc(in, flavor, null);

// monitor print job events
log.debug("preparing print job monitor");
PrintJobWatcher watcher = new PrintJobWatcher(job);

// print it
log.debug("start printing");
job.print(doc, null);

// wait for the print job is done
log.debug("waiting for the printing to finish");
watcher.waitForDone();

log.debug("done !");
  } finally {
if (in != null) try { in.close(); } catch(Exception e) {}
}

找到Here

您是否尝试过使用 This?但是rtextpr jar是Demo版,以后需要付费购买正版