Pergunta

Existe alguma maneira em Java para imprimir em uma impressora IPP específico? Todo o código de amostra e tutoriais que eu encontrei foco sobre como imprimir um determinado tipo de documento, usando algo como o seguinte:

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) { 
    }
}

Este trecho simplesmente imprime para a primeira impressora descobriu que é capaz de imprimir o documento. No meu caso, eu quero para procurar uma impressora por seu URI, mas PrintServiceLookup não parece apoiar esta. Eu tentei usar um PrintServiceAttributeSet, em vez de PrintRequestAttributeSet, e adicionando um atributo PrinterURI, mas que não retorna todas as impressoras. Eu suspeito que o serviço de pesquisa está procurando uma impressora que pode mudar seu destino URI, em vez de olhar para a impressora com o URI.

Como último recurso, eu pensei sobre apenas enumerar através de todos os PrintServices retornados por lookupPrintServices, mas o URI não é em qualquer um dos atributos. O nome da impressora está lá, mas eu preciso da URI.

Para o fundo, o meu webapp precisa imprimir um código de barras para uma impressora específica, com base no usuário atual. Cada usuário é associado a uma impressora URI, que aponta para uma impressora em um servidor CUPS. A impressora URI é a única informação que tenho, e eu não posso restringir o nome da impressora para corresponder ao URI ou um substring da URI.

Editar: Para esclarecer um pouco, eu não precisam processar os dados, eu só precisa copiar uma bolha a uma determinada impressora. A parte que eu não consigo entender é como identificar uma impressora por seu IPP URI.

Foi útil?

Solução

Eu finalmente encontrei uma maneira de fazer isso, usando 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);

Eu tenho que admitir que estou desapontado por ter que usar uma biblioteca de 3-parte para fazer algo aparentemente tão simples como imprimir em uma impressora específica.

Atualizar

DR aponta nos comentários que jipsi tem um novo casa , e um novo nome.

Cups4J é uma boa alternativa, mas como o nome indica, pode não funcionar corretamente se o destino for não um servidor CUPS. Eu tive bons resultados usando Cups4J para imprimir diretamente para uma impressora térmica Zebra.

Outras dicas

Eu não acho que você pode obter uma impressora a maneira que você gostaria de (acho que o mecanismo de Java Imprimir antecede IPP).

Você pode, no entanto, se bem me lembro ser capaz de tornar o seu trabalho de impressão localmente e, em seguida, enviar os bytes do fluxo de saída para o servidor CUPS alvo "à mão". Será que isso é "suficientemente bom" para você?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top