2017-08-01 7 views
0

あなたに奇妙な質問がありました。最近、Java 7(jdk1.7.0_10)からJava 8(1.8.0.91.x86_64)への私の古いプロジェクトをアップレベルにしました。 Java 7では、ポストスクリプトファイルを問題なく印刷しましたが、今ではファイルを変換する代わりにポストスクリプトファイルをプレーンテキストとして印刷しています。これは、RedHat Linux環境にあります。単に、ファイル自体のポストスクリプトファイルを含む文字列を出力しようとしています。Java 8がPSをネットワークプリンタに発行する

は、ここでのJava 7で正常に働いていた私の元のコード

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 { 

は、私は、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 

のためにここで見つけるオラクルの仕様にそれを更新していますこれはjava.awt.print.PrinterIOExceptionのエラーを返します:java.io.IOException:/ usr/bin/lpr:lprが見つからない。

私はそれがオリジナルであった(ファイルに書き込まない)場合、プリンタがポストスクリプト対応かどうかをチェックするためにチェックを追加しても、ポストスクリプトをプレーンテキストとして印刷します。私が新しい方法でファイルを印刷すると、lprが見つかりませんでした。 lprコマンドを使用してPS文書を印刷すると、予想どおりに変換され、正常に印刷されます。フォーマットしていないlpr -lを使用すると、ドキュメントもプレーンテキストとして印刷されます。

どのような示唆/助けが素晴らしいでしょう。私は何をするのか迷っています。私はそれをイメージに変換して印刷したくないのです。

答えて

0

あなたのプリンタは純粋なPostScriptプリンタではなく、HPまたは少なくともPCL + PSプリンタであると思います。

この場合、一般にPostScriptに言語選択PJL文字列を付加する必要があります。これをしないと、通常はデフォルトでPCLになり、PCLコマンドを送信しないと(すべて0x1Bで始まる)、すべてがプレーンなASCIIテキストとして扱われます。それはあなたのアプリケーションとlpr -lの両方がテキストを書くことに終わる理由を説明しますが、lpr自体は(おそらくそれはPJLを追加しません)。

はあなたのようなものでPostScriptファイルを付加試みることができる:%はとして0x1BのESC文字でなければなりません前に、最初のバイトが

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

NBが、私はすぐにバイナリ貼り付けることはできません....

ファイルがlpr -lで送信された場合は、古い印刷方法を試してみてください。

+0

あなたの提案はうまくいきました。 lpr -lを使ってきれいにフォーマットされた用紙を使って印刷できます。しかし、javaから印刷するときにはまだテキスト表現が印刷されます。私は、FileInputStreamをByteArrayInputStreamに変換しようとしても、同じテキスト表現を得ました。その他の提案はありますか? – jonnysteals

+0

申し訳ありませんが、Javaは私のフィールドではありません。私はそれが最初に追加のPJLを破棄し、独自のバージョンを入れないと仮定することができますが、私はあなたに何か手がかりを与えることはできません。私はこれが本当にJavaのみの質問でなければならないと思う。 – KenS

+0

申し訳ありませんケン、チームは昨夜私のコードを誤ってパッチを当てました。私はそれを正しくパッチし、正しく印刷しました。すべての助けをありがとう。 – jonnysteals

関連する問題