Tôi đang cố gắng tạo một chương trình đơn giản gửi một chuỗi tới máy in để in. Đây là những gì chương trình của tôi trông giống như:Cách gửi dữ liệu thô đến máy in bằng 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);
}
}
}
}
tôi xuất này như một file jar và chạy nó trên dòng lệnh (Windows) sử dụng:
java -jar PrinterTest.jar
Chương trình chạy, và bắt đầu vòng lặp qua tất cả các máy in đã cài đặt trên máy tính. Nhưng khi nó được cho máy in Tôi đang tìm kiếm, sau đó tôi nhận được lỗi sau:
Exception in thread "main" sun.print.PrintJobFlavorException: invalid flavor
at sun.print.Win32PrintJob.print(Unknown Source)
at PrinterTest.main(PrinterTest.java:21)
Không thực sự chắc chắn những gì tôi đang làm sai ở đây, như các máy in mà tôi đang tìm kiếm không thực hiện .
-Sử dụng liên kết sau đây để tham khảo: http://docs.oracle.com/javase/7/docs/technotes/guides/jps/spec/jpsOverview.fm4.html
-Tried thay đổi DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN
-DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE
, nhưng tôi nhận được lỗi IllegalArgumentException: data is not of declared type
.
Đã thay đổi Doc doc = new SimpleDoc(hello, flavor, null)
thành Doc doc = new SimpleDoc(hello, null, null)
, nhưng có vẻ như bạn cần thêm hương vị ở đó.
-Thay đổi máy in, vì máy in gốc mà tôi đang cố gọi là máy in ghi nhãn, nhưng điều đó không tạo nên sự khác biệt.
Bất kỳ ý tưởng nào tôi đang làm sai ở đây? Tôi có thể làm gì để sửa mã này và in nó?
CẬP NHẬT
tôi nhận này để làm việc (phần nào). Đây là những gì tôi có cho đến nay:
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.");
}
}
}
Những gì tôi đã làm là đưa các chuỗi thành một dòng đầu vào, và thay đổi DocFlavor.STRING.TEXT_PLAIN
-DocFlavor.INPUT_STREAM.AUTOSENSE
.
Hiện nấc cục duy nhất của tôi bây giờ là không có gì thực sự in trừ khi một thứ khác được gửi tới máy in. Rời khỏi đây ngay bây giờ để tham khảo.
Way trở lại trong thời đại đen tối, để có được một máy in để di chuyển trang cuối cùng ra, bạn phải gửi một byte ASCII dạng nguồn cấp dữ liệu '0xC' (được tạo trên thiết bị đầu cuối DOS bằng cách gõ Control-L, và thường được biểu diễn'^L'). Nếu máy in của bạn đẩy các tờ riêng lẻ thay vì phát ra một luồng giấy màu xanh lá cây không bị gián đoạn, kiến thức này có thể không hữu ích ... trừ khi máy in được thiết kế tương thích ngược tất cả cách quay lại máy in nối tiếp ma trận chấm . (Tôi sẽ thấy điều đó thật quyến rũ.) –