Печать Java непосредственно на сетевой принтер Postscript

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

Спасибо, Дэйв

Можете ли вы привязать это к конкретной ОС?

James Van Huis 24.11.2008 23:52

Ну, я разрабатываю на Ubuntu и развертываю либо на Ubuntu, либо на WinXP. Я надеялся рассматривать принтер как устройство с IP-адресом, избегая, таким образом, всей чуши, связанной с O / S.

David Jaquay 25.11.2008 00:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
2
12 958
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Этот пример показывает вам, как отправить файл на сетевой принтер, но требует наличия библиотеки 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();
        }
    }
}

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

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

Ответ принят как подходящий

откройте сокет TCP для порта LPR на целевом принтере.

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

не забудьте про перевод строки, когда закончите.

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

На самом деле протокол lpr / lpd - это нечто большее, чем просто передача данных по конвейеру. Некоторое время назад я написал реализацию Java в sourceforge.net/projects/jlpr.

Tony Edgecombe 21.09.2009 12:30

Если вы действительно хотите использовать протокол LPR на порту 515, то приведенный выше код Тони необходим и работал у меня. Однако для принтеров, поддерживающих необработанный порт 9100, вы действительно просто открываете сокет и выгружаете данные. Может быть таким же простым, как (в Linux) nc [ip-address] 9100 <something.txt

Franjo Markovic 27.02.2020 00:46

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

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

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

не могли бы вы поделиться этой ссылкой еще раз, она не работает

George 02.10.2013 17:07

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

RedGrittyBrick 06.11.2015 15:06

Другие вопросы по теме