Aplicação imprimir em impressora local

Boa tarde pessoal,
como posso fazer para que uma aplicação que está rodando no servidor na hora de imprimir saia direto na impressora padrão instalada no computador do cliente?

Depende.

Se o teu cliente é uma aplicação Java, você pode fazer isso utilizando algo como PrinterJob. Funcionaria bem parecido em alguma outra linguagem de programação e com a respectiva biblioteca: O servidor envia para o cliente o que deve ser imprimido como resposta a uma requisição, e o cliente invoca a impressão na rede local. Acho que essa é a forma mais fácil de fazer. Inclusive, dessa forma você aproveita o dialogo de impressão do sistema operacional, sem precisar reinventar a roda.

Agora, se você quer que o servidor envie direto para a impressora do cliente pela rede, sem passar pela aplicação do cliente, temos alguns problemas aqui. Primeiramente, você não sabe se a impressora do cliente está visível pela Internet. Quase sempre ela vai estar ligada a um roteador e disponível na rede local, atrás do NAT do roteador. Você pode configurar o roteador para redirecionar as requisições para um IP específico na rede local, mas aí toda vez que surgir um cliente novo, você (ou o cliente) vai ter que ficar configurando isso. As vezes não se tem acesso ao roteador.

eu acho que ele quer o seguinte… imagine que o sistema dele eh de restaurante, quando o garcon lanca um pedido, o sistema ja disparar a impressao direto na impressora da cozinha. Acredito que seja isso. Eu tambem precisei fazer um projeto assim, mas tudo que testei nao deu certo.

No meu caso era digitar o codigo de um produto, e a impressora argox/zebra ja imprimir a etiqueta. Para mim a unica coisa que faltou foi mandar para impressora.

Da forma que voce sugeriu usando PrinterJob teria que ter um usuario para confirmar as impressoes.

Thimor, eu preciso disso, que a aplicação aberta consiga imprimir direto na impressora local da pessoa.

tudo que achei referente a isso, caso o sistema seja web, eh vc fazer um applet e assina-lo digitalmente. foi o que nao consegui testar. Mas a solucao eh essa.

Já li sobre isso, mas tbm não consegui.

se nao for web, teste esse codigo

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;

public final class Impressora {
    // variavel estatica porque será utilizada por inumeras threads

private static PrintService impressora;

public Impressora() {
    detectaImpressoras();
}
// O metodo verifica se existe impressora conectada e a
// define como padrao.

public void detectaImpressoras() {
    try {
        DocFlavor df = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        PrintService[] ps = PrintServiceLookup.lookupPrintServices(df, null);
        for (PrintService p : ps) {
            if (p.getName() != null && p.getName().contains("HP LaserJet 1020")) {
                System.out.println("Impressora Selecionada: " + p.getName());
                System.out.println("Impressora encontrada: " + p.getName());
                impressora = p;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public synchronized boolean imprime(String texto) {
    // se nao existir impressora, entao avisa usuario
    // senao imprime texto
    if (impressora == null) {
        String msg = "Nennhuma impressora foi encontrada. Instale uma impressora padrão \r\n(Generic Text Only) e reinicie o programa.";
        System.out.println(msg);
    } else {
        System.out.println(texto);
        try {
            DocPrintJob dpj = impressora.createPrintJob();
            InputStream stream = new ByteArrayInputStream(texto.getBytes());
            DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
            Doc doc = new SimpleDoc(stream, flavor, null);
            dpj.print(doc, null);
            return true;
        } catch (PrintException e) {
            e.printStackTrace();
        }
    }
    return false;
}

public synchronized boolean imprime(byte[] bytes) {
    // se nao existir impressora, entao avisa usuario
    // senao imprime texto
    if (impressora == null) {
        String msg = "Nennhuma impressora foi encontrada. Instale uma impressora padrão \r\n(Generic Text Only) e reinicie o programa.";
        System.out.println(msg);
    } else {
        System.out.println(bytes);
        try {
            DocPrintJob dpj = impressora.createPrintJob();
            InputStream stream = new ByteArrayInputStream(bytes);
            DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
            Doc doc = new SimpleDoc(stream, flavor, null);
            dpj.print(doc, null);
            return true;
        } catch (PrintException e) {
            e.printStackTrace();
        }
    }
    return false;
    }
}
1 curtida

Deu certo?

Estou com o mesmo problema. Trabalho como gerente em uma pizzaria e o sistema de caixa só imprime em impressora térmica. No entanto não nos serve pois some toda informação por conta do calor lá na cozinha. Desse modo eu queria imprimir na impressora padrão (Uma HP laserjet que tenho aqui).

image

Essa linha de programação é rodada onde?

Serve para o meu caso?