2015-04-08 156 views
2

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

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

附加信息

一些评论所提出的建议从JTextComponent的印刷的简单方法。在这里,我们不必完成创建由JTextComponent自动处理的图形打印任务,但我的问题是如何在不创建图形打印的情况下打印。这意味着首先我从打印机中的可用字体中选择要使用的字体,例如“快递员”,然后将“A”发送给打印机,打印机在“快递员”中打印“A”,然后当我发送“B”到打印机,打印机在“快递员”中打印“B”,直到我更改我的打印机中选定的字体。现在在行的最后,我发送了\ n换行,这将使我的打印机的滚筒前进一行,\ r返回回车,这将使我的打印机的打印头到达行的开头。

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

+0

我无法弄清楚我能做到这一点的过程。我试图谷歌关于我的问题,但所有的答案导致使用Java的图形打印,这不能解决我的问题。 – Blip

+0

[可能会帮助你](https://docs.oracle.com/javase/tutorial/uiswing/misc/printtext。html) –

+0

您是否尝试过'JTextPane'类的方法'setText(“hello”)'并使用print()将它发送给打印机? –

回答

1

此代码不需要任何Swing相关的部分,但仍然需要Graphicsawt,但你可以打印从控制台没有显示任何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,具体取决于您的系统。

来源:CodeRanch

** EDIT **

进一步澄清后,用下面的代码,有正在不涉及图形对象。

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

+0

当我使用g.drawString时,我基本上是生成文本的图形在**图形**对象在调用打印方法时由程序提供。然后JVM使用打印机继续打印图形对象。但这不是我想要的。请参阅上面的其他信息。 – Blip

+0

我以为你想*无UI图形组件正在屏幕上显示*?对不起,我也试过搜索,但没有运气。 –

+0

@Blip检查我的更新答案...我仍然有一种感觉,这不是你想要的,但我相信它的接近。 –

1

您是否尝试过使用This?但rtextpr jar是Demo版本,后来你需要为许可版本付费。

相关问题