2017-08-01 6 views
0

Haben Sie eine seltsame Frage für Sie. Kürzlich verbesserte mein altes Projekt von Java 7 (jdk1.7.0_10) zu Java 8 (1.8.0.91.x86_64). In Java 7 druckte es die Postscript-Datei ohne Probleme und jetzt wird die Postscript-Datei als einfacher Text gedruckt, anstatt die Datei zu konvertieren. Dies ist in einer Redhat-Linux-Umgebung. Ich versuche einfach eine Zeichenfolge zu drucken, die eine Post-Script-Datei einer Datei selbst enthält.Java 8 Probleme PS zu Netzwerkdrucker drucken

Hier ist meine Original-Code ist

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT; 
    PrintService pService = PrintServiceLookup.lookupDefaultPrintService(); 
// In a field environment, send to the printer 
    if (System.getenv("USER_DEFINED_RELTOP") == null || pfr.exists()) { 
     if (pService.getName().isEmpty()) { 
      LOGGER.error("No printer selected"); 
     } else { 
      LOGGER.info("Printing to " + pService.getName()); 
      DocPrintJob pj = pService.createPrintJob(); 
      try { 
       InputStream is = new ByteArrayInputStream(data.getBytes("UTF8")); 
       Doc doc = new SimpleDoc(is, flavor, null); 
       PrintJobWatcher pjw = new PrintJobWatcher(pj); 
       pj.print(doc, null); 
       pjw.waitForDone(); 
       is.close(); 

      } catch (PrintException | IOException e) { 
       LOGGER.error(e); 
      } // try block 

     } // no printer selected 
     // Otherwise, send to a file 
    } else { 

, die in fein gearbeitet Java 7, ich es dem Orakel spec hier für Java 8. https://docs.oracle.com/javase/8/docs/api/javax/print/PrintService.html#createPrintJob--

https://docs.oracle.com/javase/8/docs/technotes/guides/jps/spec/printing.fm6.html

 DocFlavor psFlavor = DocFlavor.INPUT_STREAM.POSTSCRIPT; 
     PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(); 
     attrs.add(MediaSizeName.ISO_A4); 


PrintService[] pservices = PrintServiceLookup.lookupPrintServices(psFlavor, 
                attrs); 
    File pfr = new File(PFR_INDICATOR); 

    // In a field environment, send to the printer 
    if (System.getenv("USER_DEFINED_RELTOP") == null || pfr.exists()) { 
     //Check we have a printer capable of post script 
    if (pservices.length > 0) { 
      LOGGER.info("Printing to " + pservices[0].getName()); 
      DocPrintJob pj = pservices[0].createPrintJob(); 
      try { 
        InputStream fis = new ByteArrayInputStream(data.getBytes("UTF8")); 

//byte[] ba =data.getBytes("UTF8"); 
     Doc doc = new SimpleDoc(fis, psFlavor, null); 
      LOGGER.info("Doc Flavor " + doc.getDocFlavor()); 
        PrintJobWatcher pjw = new PrintJobWatcher(pj); 
      LOGGER.info("PrintJob Attributes : " + pj.getAttributes()); 
     pj.print(doc, attrs); 
     pjw.waitForDone(); 
     fis.close(); 
      } catch (IOException e) { 
       LOGGER.error(e); 
       NotificationDialog.show(NotificationDialog.NOTICE_TYPE.ERROR, PRINT_ERROR); 
    } catch (PrintException e) { 
       LOGGER.error(e); 
      } 

     } else { // no printer selected 

gefunden aktualisiert Dies gibt mir einen Fehler java.awt.print.PrinterIOException: java.io.IOException:/usr/bin/lpr: wo es aussieht, um lpr nicht zu finden .

Wenn ich es so behalte, wie es ursprünglich war (nicht in Datei schreiben), wird das PostScript als einfacher Text gedruckt, auch wenn die Prüfung hinzugefügt wird, um zu prüfen, ob der Drucker postskriptfähig ist. Wenn ich die neue Art der Druckdatei verwende, bekomme ich einen lpr nicht gefunden Fehler. Wenn ich das PS-Dokument mit dem Befehl lpr drucke, konvertiert es es wie erwartet und druckt gut. Wenn ich lpr -l verwende, das nicht formatiert, druckt es das Dokument auch als einfachen Text.

Jeder Vorschlag/Hilfe wäre großartig. Ich bin verloren, was ich tun soll. Ich möchte es wirklich nicht in ein Bild umwandeln und das ausdrucken.

Antwort

0

Ich würde sagen, dass Ihr Drucker ist ein HP oder mindestens PCL + PS-Drucker, kein reiner PostScript-only-Drucker.

In diesem Fall müssen Sie in der Regel das PostScript mit einer Sprachauswahl-PJL-Zeichenfolge voranstellen. Wenn Sie dies nicht tun, wird normalerweise PCL verwendet, und wenn Sie keine PCL-Befehle senden (die alle mit 0x1B beginnen), wird alles als reiner ASCII-Text behandelt. Das würde erklären, warum sowohl Ihre Anwendung als auch lpr -l Text schreiben, aber lpr selbst nicht (vermutlich fügt es den PJL hinzu).

Sie könnten versuchen, die Postscript-Datei mit so etwas wie dem Voranstellen:

%[email protected] JOB 
@PJL ENTER LANGUAGE=POSTSCRIPT 

NB gibt das erste Byte, bevor das% ein 0x1b ESC-Zeichen sein soll, aber ich kann nicht ohne weiteres binäres einfügen ....

Versuchen Sie, die Datei mit lpr -l zu senden, wenn das funktioniert, dann könnten Sie Ihre alte Druckmethode versuchen.

+0

so arbeitete Ihr Vorschlag. Ich kann mit lpr -l ein schön formatiertes Papier drucken. Beim Drucken aus Java wird jedoch immer noch die Textdarstellung gedruckt. Ich habe sogar versucht, den FileInputStream in den ByteArrayInputStream zu konvertieren, habe aber dieselbe Textdarstellung erhalten. Irgendwelche anderen Vorschläge? – jonnysteals

+0

Entschuldigung, Java ist nicht mein Fachgebiet. Ich kann nur annehmen, dass es zu Beginn die zusätzliche PJL wegwirft und nicht seine eigene Version hineinstellt, aber ich kann Ihnen keine Hinweise geben warum. Ich denke, das wird wirklich nur eine Java-Frage sein müssen. – KenS

+0

Entschuldigung Ken, das Team hat letzte Nacht meinen Code falsch gepatcht. Ich habe es korrekt gepatcht und es korrekt gedruckt. Danke für die Hilfe. – jonnysteals

Verwandte Themen