Печать на определенный принтер (IPP URI) в Java - PullRequest
14 голосов
/ 31 октября 2009

Есть ли в Java способ печати на определенный принтер IPP? Все примеры кода и учебники, которые я нашел, фокусируются на том, как напечатать документ определенного типа, используя что-то вроде следующего:

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
PrintService[] pservices =
             PrintServiceLookup.lookupPrintServices(flavor, aset);
if (pservices.length > 0) {
    DocPrintJob pj = pservices[0].createPrintJob();
    try {
        FileInputStream fis = new FileInputStream("test.ps");
        Doc doc = new SimpleDoc(fis, flavor, null);
        pj.print(doc, aset);
    } catch (FileNotFoundException fe) {
    } catch (PrintException e) { 
    }
}

Этот фрагмент просто печатает на первом найденном принтере, который способен печатать документ. В моем случае я хочу найти принтер по его URI, но PrintServiceLookup, похоже, не поддерживает это. Я попытался использовать PrintServiceAttributeSet вместо PrintRequestAttributeSet и добавить атрибут PrinterURI, но это не возвращает никаких принтеров. Я подозреваю, что служба поиска ищет принтер, который может изменить свой URI назначения, а не ищет принтер с этим URI.

В качестве последнего средства я подумал о том, чтобы просто перечислить все PrintService s, возвращаемые lookupPrintServices, но URI отсутствует ни в одном из атрибутов. Имя принтера там, но мне нужен URI.

Для фона моему веб-приложению необходимо распечатать штрих-код на определенном принтере в зависимости от текущего пользователя. Каждый пользователь связан с URI принтера, который указывает на принтер на сервере CUPS. URI принтера - единственная информация, которую я имею, и я не могу ограничить имя принтера, чтобы оно совпадало с URI или подстрокой URI.

Редактировать: Чтобы уточнить, мне не нужно отображать данные, мне просто нужно скопировать большой двоичный объект на заданный принтер. Я не могу понять, как идентифицировать принтер по IP-адресу URI.

Ответы [ 2 ]

13 голосов
/ 02 ноября 2009

Я наконец нашел способ сделать это, используя jipsi:

URI printerURI = new URI("ipp://SERVER:631/printers/PRINTER_NAME");
IppPrintService svc = new IppPrintService(printerURI);
InputStream stream = new BufferedInputStream(new FileInputStream("image.epl"));
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc myDoc = new SimpleDoc(stream, flavor, null);
DocPrintJob job = svc.createPrintJob();
job.print(myDoc, null);

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

UPDATE

DR указывает в комментариях , что у jipsi есть новый home и новое имя.

Cups4J - хорошая альтернатива, но, как следует из названия, она может работать неправильно, если пункт назначения не является сервером CUPS. У меня были хорошие результаты при использовании Cups4J для печати напрямую на термопринтер Zebra.

0 голосов
/ 31 октября 2009

Я не думаю, что вы можете получить принтер так, как вы хотели бы (я думаю, что механизм Java Print предшествует IPP).

Однако, если я правильно помню, вы можете локально отрисовать задание на печать, а затем переслать байты выходного потока на целевой сервер CUPS «вручную». Будет ли это "достаточно хорошо" для вас?

...