2017-08-03 9 views
6

के साथ प्रिंटर को कच्चे डेटा को कैसे भेजना है मैं एक साधारण प्रोग्राम बनाने की कोशिश कर रहा हूं जो प्रिंट करने के लिए प्रिंटर को स्ट्रिंग भेजता है।जावा

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

मैं एक जार फ़ाइल के रूप में इस निर्यात और कमांड लाइन पर चला (विंडोज़) का उपयोग करते हुए: यह वही है मेरा कार्यक्रम की तरह लग रहा है

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 मिलता है।

- Doc doc = new SimpleDoc(hello, flavor, null) से Doc doc = new SimpleDoc(hello, null, null) बदलने की कोशिश की गई, लेकिन ऐसा लगता है कि आपको वहां एक स्वाद जोड़ने की आवश्यकता है।

- प्रिंटर को बदलने की कोशिश की, क्योंकि मूल प्रिंटर जिसे मैं कॉल करने का प्रयास कर रहा था वह एक लेबलिंग प्रिंटर था, लेकिन इससे कोई फर्क नहीं पड़ता।

कोई विचार क्या मैं यहां गलत कर रहा हूं? इस कोड को ठीक करने और इसे प्रिंट करने के लिए मैं क्या कर सकता हूं?

अद्यतन

मैं करने के लिए (कुछ) काम यह मिल गया।

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."); 
    } 
    } 
} 

क्या मैं एक इनपुट धारा में स्ट्रिंग डाल दिया गया था था, और DocFlavor.INPUT_STREAM.AUTOSENSE करने के लिए DocFlavor.STRING.TEXT_PLAIN बदल: यह क्या मैं अब तक है।

मेरी केवल हिचकी अब कि कुछ भी नहीं वास्तव में प्रिंट जब तक कुछ और प्रिंटर के लिए भेजा जाता है। संदर्भ के लिए अब इसे यहां छोड़कर।

+1

रास्ता वापस अंधकार युग में, अंतिम पृष्ठ बाहर स्क्रॉल करने के लिए एक प्रिंटर पाने के लिए, आप इसे एक ASCII फार्म फ़ीड बाइट भेजने के लिए किया था '0xC' (नियंत्रण-एल टाइप करके एक डॉस टर्मिनल पर उत्पादित, और आमतौर पर '^ एल' का प्रतिनिधित्व किया जाता है)। यदि आपका प्रिंटर ग्रीन-बार प्रशंसक-गुना पेपर की एक अखंड धारा को उत्सर्जित करने के बजाय अलग-अलग चादरों को निकाल देता है, तो यह ज्ञान शायद सहायक नहीं है ... जब तक प्रिंटर को डॉट-मैट्रिक्स सीरियल प्रिंटर पर वापस जाने के लिए पिछड़ा-अनुकूल नहीं बनाया गया था । (मुझे वह बेहद आकर्षक लगेगा।) –

उत्तर

4

अपवाद संदेश उपयोगी हैं और समाधान खोजने में आपकी सहायता करनी चाहिए।

1) सबसे पहले, इस स्वाद अपने प्रिंटर द्वारा समर्थित नहीं है:

DocFlavor.STRING.TEXT_PLAIN; 

यह अपवाद यह कहते हैं:

Exception in thread "main" sun.print.PrintJobFlavorException: invalid flavor

आप इस निरंतर मूल्य के स्रोत कोड में देखो, तो आप देख सकते हैं कि इसे घोषित किया गया है:

public static final STRING TEXT_PLAIN = 
    new STRING ("text/plain; charset=utf-16"); 

तो, सबसे पहले आप sh sh यह जांच कर रहा है कि आपके प्रिंटर द्वारा कौन से स्वाद समर्थित हैं।

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

द्वारा:
यह रेंडर करने के लिए, वास्तविक कोड बदलने

image:image/gif:[B image:image/gif:java.io.InputStream

image:image/gif:java.net.URL image:image/jpeg:[B

image:image/jpeg:java.io.InputStream image:image/jpeg:java.net.URL

image:image/png:[B image:image/png:java.io.InputStream

image:image/png:java.net.URL

application:application/x-java-jvm-local-objectref:java.awt.print.Pageable

application:application/x-java-jvm-local-objectref:java.awt.print.Printable

application:application/octet-stream:[B

application:application/octet-stream:java.net.URL

application:application/octet-stream:java.io.InputStream

आप अपने प्रिंटर देख सकते हैं:

if (printer.getName().contains("ZM400")) { 
    Arrays.stream(printer.getSupportedDocFlavors()).forEach(f->System.out.println(f.getMediaType() + ":" + f.getMimeType() + ":" + f.getRepresentationClassName())); 
    String hello = "Hello"; 
    DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN; 
    Doc doc = new SimpleDoc(hello, flavor, null); 
    job = printer.createPrintJob(); 
    job.print(doc, null); 
} 
अपने प्रिंटर के साथ

, यह निम्न उत्पादन का उत्पादन "text/plain; charset=utf-16" स्वाद का समर्थन नहीं करता है।

2) स्वाद को DocFlavor.INPUT_STREAM.AUTOSENSE पर बदलकर, अब DocFlavor के लिए अनुपलब्ध समर्थन से संबंधित अपवाद नहीं है।
तो इसका मतलब है कि DocFlavor.INPUT_STREAM.AUTOSENSE आपके प्रिंटर द्वारा समर्थित है।
लेकिन तुम घोषित DocFlavor.INPUT_STREAM.AUTOSENSE से जुड़े प्रकार के मेल नहीं खाता प्रिंट डेटा के रूप में एक और समस्या का सामना:

IllegalArgumentException: data is not of declared type.

DocFlavor में, INPUT_STREAM.AUTOSENSE लगातार इस तरह से घोषित किया जाता है:

public static final INPUT_STREAM AUTOSENSE = 
     new INPUT_STREAM ("application/octet-stream"); 

यह पिछले आउटपुट में अंतिम समर्थित स्वाद के अनुरूप है:

application:application/octet-stream:java.io.InputStream

एन घ समस्या है:

String hello = "Hello";  
... 
Doc doc = new SimpleDoc(hello, flavor, null); 

आप एक InputStream लेकिन एक String पारित नहीं किया है।

उदाहरण के लिए आप इस तरह से एक InputStream प्रदान कर सकते हैं:

String hello = "Hello";  
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
Doc doc = new SimpleDoc(new ByteArrayInputStream(hello.getBytes()), 
         flavor, null); 

या आप भी इस स्वाद इस्तेमाल कर सकते हैं: यदि आप एक InputStream लेकिन एक String इनपुट के रूप में नहीं है के रूप में

application:application/octet-stream:[B

:

यहां उपयोग करने के लिए स्वाद निरंतर है:

DocFlavor.BYTE_ARRAY.AUTOSENSE 

आप भी इस तरह से इस्तेमाल कर सकते हैं:

String hello = "Hello";  
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; 
Doc doc = new SimpleDoc(hello.getBytes(), flavor, null);