2008-11-24 1 views
9

У меня есть код/​​данные Postscript (?) В памяти (в Java Tomcat webapp), которые я бы хотел отправить непосредственно на сетевой принтер PS. Есть ли простой способ (например, просто открыть порт и отправить текст), чтобы напечатать это, минуя все драйверы и прочее, связанные с O/S (и, надеюсь, даже не требующие дополнительных банок)? Ссылка на пример кода, показывающий, как это сделать?Печать на Java непосредственно на сетевой принтер Postscript

Спасибо, Dave

+0

Можете ли вы заблокировать это для конкретной ОС? – 2008-11-24 20:52:06

+1

Ну, я развиваюсь на Ubuntu и развертываю либо на Ubuntu, либо на WinXP. Я надеялся обработать принтер как устройство с IP-адресом, таким образом, обходя все дерьмо, специфичное для O/S. – 2008-11-24 21:55:58

ответ

7

Откройте TCP-порт на порт LPR на целевом принтере.

отправьте свои данные; пока принтер постигает его, вы круты.

Не забудьте про линию, когда вы закончите.

(затем закрыть порт.)

+3

На самом деле в протоколе lpr/lpd есть немного больше, чем просто передача данных, я написал Java-реализацию некоторое время назад на http://sourceforge.net/projects/jlpr/ – 2009-09-21 08:30:20

0

Я не уверен, что вы можете сделать это без дополнительной библиотеки.

В этом example показано, как отправить файл на сетевой принтер, но требуется библиотека adobe (на основе коммерческого J2EE Livecycle ES, хотя это не общее «бесплатное» решение ...).

import com.adobe.livecycle.output.client.*; 
import java.util.*;  
import java.io.File;  
import java.io.FileInputStream;  
import com.adobe.idp.Document;  
import com.adobe.idp.dsc.clientsdk.ServiceClientFactory; 

public class SendToPrinter { 

    public static void main(String[] args) { 
     try{ 
      //Set LiveCycle ES service connection properties        
      Properties ConnectionProps = new Properties(); 
      ConnectionProps.setProperty("DSC_DEFAULT_EJB_ENDPOINT", "jnp://localhost:1099"); 
      ConnectionProps.setProperty("DSC_TRANSPORT_PROTOCOL","EJB");   
      ConnectionProps.setProperty("DSC_SERVER_TYPE", "JBoss"); 
      ConnectionProps.setProperty("DSC_CREDENTIAL_USERNAME", "administrator"); 
      ConnectionProps.setProperty("DSC_CREDENTIAL_PASSWORD", "password"); 
      //Create a ServiceClientFactory object 
      ServiceClientFactory myFactory = ServiceClientFactory.createInstance(ConnectionProps); 
      //Create an OutputClient object 
      OutputClient outClient = new OutputClient(myFactory); 
      //Reference XML data that represents form data 
      FileInputStream fileInputStream = new FileInputStream("C:\\Adobe\\Loan_data.xml"); 
      Document inputXML = new Document(fileInputStream); 
      //Set print run-time options 
      PrintedOutputOptionsSpec printOptions = new PrintedOutputOptionsSpec(); 
      printOptions.setPrinterURI("\\\\Printer1\\Printer"); 
      printOptions.setCopies(2); 

      //Send a PostScript print stream to printer 
      OutputResult outputDocument = outClient.generatePrintedOutput(
        PrintFormat.PostScript, 
        "Loan.xdp", 
        "C:\\Adobe", 
        "C:\\Adobe", 
        printOptions, 
        inputXML); 

      //Write the results of the operation to OutputLog.xml 
      Document resultData = outputDocument.getStatusDoc(); 
      File myFile = new File("C:\\Adobe\\OutputLog.xml"); 
      resultData.copyToFile(myFile); 
     } 
     catch (Exception ee) 
     { 
      ee.printStackTrace(); 
     } 
    } 
} 
0

Проверьте java.awt.print. Это общий API печати в java.

К сожалению, он не ориентирован на работу с содержимым postscript, которое у вас уже есть. Он разработан, чтобы позволить вам «рисовать» на листе бумаги с помощью графических API-интерфейсов java 2d.

2

Вы можете отправить его непосредственно на сетевой принтер на порт 9100. Я написал в блоге об этом здесь:

http://frank.zinepal.com/printing-directly-to-a-network-printer

Проблема заключается в том, что большинство лазерных принтеров не поддерживают PostScript. Обычно вам нужно получить надстройку принтера.