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




Я не уверен, что вы сможете обойтись без дополнительной библиотеки.
Этот пример показывает вам, как отправить файл на сетевой принтер, но требует наличия библиотеки 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.
Если вы действительно хотите использовать протокол LPR на порту 515, то приведенный выше код Тони необходим и работал у меня. Однако для принтеров, поддерживающих необработанный порт 9100, вы действительно просто открываете сокет и выгружаете данные. Может быть таким же простым, как (в Linux) nc [ip-address] 9100 <something.txt
Вы можете отправить его прямо на сетевой принтер через порт 9100. Я написал об этом сообщение в блоге здесь:
http://frank.zinepal.com/printing-directly-to-a-network-printer
Проблема в том, что большинство лазерных принтеров не поддерживают PostScript. Обычно для этого необходимо приобрести дополнительный принтер.
не могли бы вы поделиться этой ссылкой еще раз, она не работает
Большинство лазерных принтеров бюджетный не поддерживают PostScript. По моему опыту, большинство лазерных принтеров бизнес-класса в настоящее время включают эмуляцию PostScript уровня 3.
Можете ли вы привязать это к конкретной ОС?