2015-04-08 159 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版本,後來你需要爲許可版本付費。

相關問題