Вопрос

Есть ли в 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возвращается lookupPrintServices, но URI отсутствует ни в одном из атрибутов.Имя принтера есть, но мне нужен URI.

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

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

Это было полезно?

Решение

Наконец я нашел способ сделать это, используя 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);

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

ОБНОВЛЯТЬ

ДР отмечает в Комментарии у Джипси есть новый дом, и новое имя.

Кубки4J — хорошая альтернатива, но, как следует из названия, она может работать неправильно, если местом назначения не является сервер CUPS.Я добился хороших результатов при использовании Cups4J для печати непосредственно на термопринтере Zebra.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top