印刷する文字列をプリンタに送る簡単なプログラムを作成しようとしています。これは、私のプログラムがどのようなものか:Javaでプリンタに生データを送信する方法
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
public class PrinterTest {
public static void main (String [] args) throws PrintException {
DocPrintJob job = null;
PrintService[] printServices =
PrintServiceLookup.lookupPrintServices(null, null);
System.out.println("Number of print services: " + printServices.length);
for (PrintService printer : printServices) {
System.out.println("Printer: " + printer.getName());
if (printer.getName().contains("ZM400")) {
String hello = "Hello";
DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN;
Doc doc = new SimpleDoc(hello, flavor, null);
job = printer.createPrintJob();
job.print(doc, null);
}
}
}
}
私はjarファイルとしてこれをエクスポートして、コマンドライン(Windowsの場合)使用した上で、それを実行します。
java -jar PrinterTest.jar
プログラムが実行され、すべてをループを開始しますインストールされているプリンタをコンピュータにインストールします。それは私が探していますプリンタになった場合でも、私は、次のエラーを取得する:私が探していたプリンタが実際に表示されないように私は、ここで間違ってやって
Exception in thread "main" sun.print.PrintJobFlavorException: invalid flavor
at sun.print.Win32PrintJob.print(Unknown Source)
at PrinterTest.main(PrinterTest.java:21)
本当にわかりません。 http://docs.oracle.com/javase/7/docs/technotes/guides/jps/spec/jpsOverview.fm4.html
-TriedがDocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE
からDocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN
を変更するが、私はエラーを取得しIllegalArgumentException: data is not of declared type
:参照のための次のリンクを-Using
。
- Doc doc = new SimpleDoc(hello, flavor, null)
からDoc doc = new SimpleDoc(hello, null, null)
に変更しましたが、そこにフレーバーを追加する必要があるようです。
- 私が電話しようとしていた元のプリンタはラベルプリンタでしたが、それは違いはありませんでした。
ここで間違っているのは何ですか?このコードを修正して印刷するにはどうすればよいですか?
UPDATE
私は(多少)の仕事にこれを得ました。私は、入力ストリームに文字列を入れて、DocFlavor.INPUT_STREAM.AUTOSENSE
にDocFlavor.STRING.TEXT_PLAIN
を変更してやった
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
public class PrinterTest {
public static void main (String [] args) throws PrintException, IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the name of the printer: ");
String printerName = bufferedReader.readLine();
System.out.print("Enter a short message of what you would like to print here: ");
String printerMessage = "PRINTER MESSAGE: " + bufferedReader.readLine();
boolean printerCheck = false;
DocPrintJob job = null;
PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
System.out.println("Number of print services: " + printServices.length);
for (PrintService printer : printServices) {
System.out.println("Printer: " + printer.getName());
if (printer.getName().contains(printerName)) {
InputStream inputStream = new ByteArrayInputStream(printerMessage.getBytes());
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc doc = new SimpleDoc(inputStream, flavor, null);
job = printer.createPrintJob();
job.print(doc, null);
printerCheck = true;
}
}
if (printerCheck == false) {
System.out.println("The printer you were searching for could not be found.");
}
}
}
:これは私がこれまで持っているものです。
実際にが印刷されるのは、以外の何かがプリンタに送信されない限りです。これをここに残して参考にしてください。
ウェイバック暗黒時代に、最後のページをスクロールするプリンタを得るために、あなたはそれをASCIIのフォームフィードのバイトを送信する必要がありました'0xC'(Control-Lと打ち込むことによってDOS端末で生成され、通常は'^L 'で表されます)。プリンタがグリーンバーの折りたたみ用紙の連続したストリームを出力するのではなく、個々のシートを取り出す場合、この知識は役に立たないでしょう...プリンタがドットマトリックスシリアルプリンタに戻って後方互換性があるように設計されていない限り。 (私はそれはまったく魅力的であることがわかります。) –