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

如何使用打印机的字体从java直接使用行打印机打印?,java,printing,Java,Printing,我想使用行打印机直接打印,即使用字体选项卡回车和JAVA程序换行功能的点阵打印机。我基本上知道如何从JAVA打印。我的问题是,在JAVA打印中,我们首先生成要打印的页面的图形图像,然后将其发送到要打印的打印机。但我并不是在问这些问题。我想直接将文本以字符流的形式发送到打印机,并使用打印机的适用命令,用于回车、换行、制表符和打印机的字体,就像以前不使用激光或喷墨打印机等图形打印机一样 如果有人能在这些问题上指导我,我将不胜感激。提前谢谢 其他信息 一些评论建议使用从JTextComponent打印

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

如果有人能在这些问题上指导我,我将不胜感激。提前谢谢

其他信息

一些评论建议使用从JTextComponent打印的简单方法。在这里,我们不必完成创建由JTextComponent自动处理的图形可打印文件的任务,但我的问题是如何在不创建图形可打印文件的情况下打印。这意味着,首先我从打印机的可用字体中选择要使用的字体,比如“courier”,然后我将“A”发送到打印机,打印机将“A”打印在“courier”中,然后当我将“B”发送到打印机时,打印机将“B”打印在“courier”中,直到我更改打印机中的选定字体为止。现在在该行的末尾,我发送了换行符,\n它将使打印机的滚筒前进一行,\r并发送了回车符,\r它将使打印机的打印头回到行的开头


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

此代码不需要任何
Swing
相关组件,但仍然需要
图形
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()
可能返回null,具体取决于您的系统

资料来源:

**编辑**

进一步澄清后,使用下面的代码,不涉及任何图形对象

  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) {}
}

找到

您尝试过使用吗?但是rtextpr jar是演示版,以后您需要支付许可版本的费用。

我不知道我可以通过什么流程来完成。我试图用谷歌搜索我的问题,但所有的答案都导致使用java进行图形打印,这并不能解决我的问题。您是否尝试过
JTextPane
class的方法
setText(“hello”)
并使用
print()将其发送给打印机
?您发送的链接显示了一种从JTextComponent打印的简单方法。在这里,您不必完成创建图形可打印文件的任务,该文件由JTextComponent自动处理,但我的问题是如何在不创建图形可打印文件的情况下进行打印。这意味着,首先我从打印机中的可用字体中选择要使用的字体,然后我将“A”发送到打印机,然后打印机以我选择的字体打印“A”,以此类推。Sharp edge,您的答案与Neeraj的答案类似。我希望我能在之前的评论中澄清我的问题。当我使用g.drawString时,我基本上是在程序调用print方法时在图形对象中生成文本的图形。然后JVM继续使用打印机打印图形对象。但这不是我想要的。请查看上面的附加信息。我以为您不想在屏幕上显示UI图形组件?很抱歉,我也尝试过搜索,但没有成功。@请检查我的更新答案。。。我仍然觉得这不是你想要的,但我相信它已经接近了。