Imprimir arquivo no windows

4 respostas
B

Galera eu tenho um programa que imprime um arquivo automaticamente. Funciona normalmente no linux, mas no windos nao esta acontecendo nada, nem lancando nenhum erro. Eu utilizo a biblioteca Apache POI. Segue meu codigo:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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;
import javax.print.attribute.HashDocAttributeSet;

public class Impressora {

    // variavel estatica porque sera utilizada por inumeras threads
    private static PrintService impressora;

    public Impressora(String nomeImpressora) {
        this.detectaImpressoras(nomeImpressora);
    }
    // O metodo verifica se existe impressora conectada e a
    // define como padrao.
    public void detectaImpressoras(String nomeImpressora) {
        DocFlavor df = DocFlavor.INPUT_STREAM.AUTOSENSE;
        PrintService[] ps = PrintServiceLookup.lookupPrintServices(df, null);
        for (PrintService p : ps) {
            if (p.getName().contains(nomeImpressora)) {
                System.out.println("Impressora Selecionada: " + p.getName());
                impressora = p;
                break;
            }
        }
    }

    public synchronized boolean imprime(File arquivo) throws PrintException, FileNotFoundException {
        // 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 {           
                //cria um trabalho na impressora
                DocPrintJob dpj = impressora.createPrintJob();
                //pega o documento passado como parametro
                FileInputStream stream = new FileInputStream(arquivo);
                //seta os atributos da impressao que na realidade sao vazios null
                HashDocAttributeSet attributes = new HashDocAttributeSet();
                //fala que o documento que vai ser impresso e um PDF
                DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
                //cria o documento que sera impresso
                Doc doc = new SimpleDoc(stream, flavor, attributes);
                //manda imprimir no trabalho criado
                dpj.print(doc, null);
                return true;
        }
        return false;
    }
}

4 Respostas

A

Topico antigo mas vamos lá. Vc conseguiu resolver o problema ? Estou com o mesmo problema.

B

Cara na época eu consegui resolver sim, mas não lembro como e não trabalho mais na empresa para ter acesso ao código…
Se não me engano, os arquivos não imprimiam por falta de permissão do java. Eu utilizava esse código em um applet e tive que autenticar o applet para que o código funcionasse.

A

Então minha aplicação é desktop não sei se pode ser permissão porque funciona no linux mas não funciona no windows

A

RESOLVIDOOOOOO

public static void imprimirPDF(byte[] byteDados, String impressora) throws Exception {
		if (Funcoes.isLinux()) {//Linux impressão direta/rapida, se este bloco for usado para windows a impressão não acontece
			ByteArrayInputStream bais = new ByteArrayInputStream(byteDados);
			PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
			DocAttributeSet das = new HashDocAttributeSet();

			PrintService service = Funcoes.localizarImpressora(impressora);
			DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

			DocPrintJob job = service.createPrintJob();
			Doc doc = new SimpleDoc(bais, flavor, das);
			job.print(doc, pras);
		}
		else {// Windows impressão direta/rapida, se este bloco for usado para linux, a uma grande demora na impressão
			PrinterJob job = PrinterJob.getPrinterJob();
			job.setPrintService(Funcoes.localizarImpressora(impressora));
			PDDocument doc = PDDocument.load(new ByteArrayInputStream(byteDados));
			doc.silentPrint(job);
		}
	}
Criado 17 de fevereiro de 2011
Ultima resposta 11 de mar. de 2014
Respostas 4
Participantes 2