Imprimindo no Linux

17 respostas
S

Prezados,

Construi uma classe simples de impressão utilizando o pacote Java Print Service.
Funciona normalmente no Windows.
No entanto, no Linux, independente da impressora que eu use, não dá certa a impressão.
Sempre que eu mando imprimir, a impressora chega a ser acionada, de forma que ela puxa o papel, mas ela não imprime nada, só puxa o papel e solta.
E no fim, o SO (Ubuntu) exibe uma mensagem de erro:
[color=red]Erro na impressora
Houve um problema no processamento do documento “Java Printing”[/color]

Alguém já passou por isso?

17 Respostas

D

posta o código para darmos uma olhada

S
// Essa classe é a responsavel pela impressao. Ela detecta a impressora
// instalada, recebe o texto e o imprime.
public class ImpressaoTXT {

	//Singleton
	private static ImpressaoTXT instance = new ImpressaoTXT();
	private ImpressaoTXT(){
    	// seleciona a impressora
		detectaImpressoras();
		setAtributos();
		// cria a tarefa de impressao
		printJob = impressora.createPrintJob();
		//determina o tipo a ser impresso txt
		docFlavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
	}
    public static ImpressaoTXT getInstance() {
        return instance;
    }

    // variáveis
	private PrintService impressora;
	private PrintRequestAttributeSet printerAttributes;
	private DocPrintJob printJob;
	private DocFlavor docFlavor;
	public static void main(String[] args) {

		try {
			ImpressaoTXT impressao = getInstance();

			// abre o arquivo
			File arquivo = new File("impressao.txt");
			FileInputStream print = new FileInputStream(arquivo);
			System.out.println("vai imprimir");
			impressao.imprime(print);
			System.out.println("imprimiu");
			print.close();
		}
		// senao conceguir
		catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null,
					"Não foi possível realizar a impressão !!", "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
	}

	public void imprime(InputStream print) throws PrintException {
		Doc documentoTexto = new SimpleDoc(print, docFlavor, null);
		// imprime
		printJob.print(documentoTexto,	(PrintRequestAttributeSet) printerAttributes);
	}
	/**
	 * 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) {
				System.out.println("Impressora encontrada: " + p.getName());
				if (p.getName().contains("4200")) {
					System.out.println("Impressora Selecionada: " + p.getName());
					impressora = p;
					break;
				}
			}
		} catch (Exception e) {

			e.printStackTrace();
		}
	}

	/**
	 * Definição dos atributos de impressão
	 * @return
	 */
	private PrintRequestAttributeSet setAtributos() {
		// determina os atributos
		PrintRequestAttributeSet printerAttributes = new HashPrintRequestAttributeSet();
		// quantidades de copias ****** opcional
//		printerAttributes.add(new Copies(1));
//		modelo do papel ****** opcional
//		printerAttributes.add(MediaSizeName.ISO_A4);
//		printerAttributes.add(new MediaPrintableArea(0, 0, 54, 85, MediaPrintableArea.MM));
//		printerAttributes.add(new PrinterResolution(300, 300, PrinterResolution.DPI));
		//defindo o tamanho do papel
		MediaSizeName mediaSizeName = MediaSize.findMedia(80, 10000000, MediaPrintableArea.MM);
		printerAttributes.add(mediaSizeName);
		return printerAttributes;
	}
}
D

estranho que aqui nao funcionou testei no windows mesmo trocando o nome da impressora para ela ser selecionada e nem deixando os sets de configuração sem comentario. nao da pra testar, engraçado que ela fala que imprimiu e isso acontece só depois de enviar o comando de impressao.

S

Ai não funcionou nem no Windows?

D

nao… sera que é problema de impressora? voce fez alguma coisa a mais?

D

a customização é. Retirar os comentarios(ou nao) e colocar o nome da minha impressora certo? para quando ela fazer aquele laço iterando entre as impressoras achadas ela pegar o nome certo?

J

Talvez seja problema de permissão. A máquina virtual pode estar rodando em uma conta limitada.

D

conta limitada? a conta nao seria do usuario atual? eu consigo imprimir com meu usuario

D

alterar no arquivo java.policy

colocar este comando nao funciona

permission java.security.AllPermission;

D

é isso ae… quando uso uma impressora que esta em rede nao funciona talvez pelo permissionamento. E agora? kkk é por causa da rede ou por causa do permissionamento?

S

Denis, mas para impressora local funcionou entao no windows né. E no Linux?

D

testei no linux, foi mal a demora. Nao funciona aqui …

D

engraçado que no windows quando voce transforma em um jar ele chega até selecionar a impressora mas nao consegue imprimir… será que tem alguma relação?

S

No windows funciona sem problemas, já no linux, não vai.
Acabei mudando a implementação aqui.
Estava usando a Java Printing Service e não dava certo, dai testei com a Java 2D Print API, e ai sim o Linux aceitou.
Complica um pouco porque muda bem né. Tenho agora que mandar meu ticket de entrada para um componente swing (invisível) e dele chamar o método print.
Pelo menos funcionou no linux, mas gostaria muito de saber porque o Java Printing Service, com um código tão báscio (hello world) não funciona no Linux. Se alguém souber posta ai, mas desde já, vai a dica para se alguém passar pelo que eu passei, testar com a Java 2D Print API que vai dar certo no Linux.

D

kkk muda um pouco? estou tentando achar um tutorial amigavel aki

D

Esse código resolve o problema de nao imprimir sendo um jar

package impressao;

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

public class PrintPDFFactory {

    private static PrintService impressora;  

    public void printPDF(File f){

        try{
            DocFlavor dflavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
            PrintService[] impressoras = PrintServiceLookup.lookupPrintServices(dflavor, null);
            for(PrintService ps : impressoras){
                System.out.println("Impressora Encontrada: "+ps.getName());
                if(ps.getName().contains("MP-4000 TH")){
                    System.out.println("Impressora Selecionada: "+ps.getName());
                    impressora = ps;
                    break;
                }
            }
            DocPrintJob dpj = impressora.createPrintJob();  
            FileInputStream fis = new FileInputStream(f);
            byte[] buffer = new byte[fis.available()];
            int buff = 0;
            while((buff = fis.available()) != 0){
                fis.read(buffer, 0, buff);
            }
            System.out.println(new String(buffer));
            InputStream stream = new ByteArrayInputStream(buffer);  
            DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;  
            Doc doc = new SimpleDoc(stream, flavor, null);  
            dpj.print(doc, null);
            
        }catch (Exception e) {
            e.printStackTrace();
        }

    }
    
    public static void main(String[] args) {
        PrintPDFFactory pdffactory = new PrintPDFFactory();
        pdffactory.printPDF(new File("c:/XML/atores.txt"));
    }
}

só que quando eu mando um pdf já era.

D

em uma outra impressora nao aparece erro só aparece pagina em branco

Criado 18 de maio de 2012
Ultima resposta 21 de mai. de 2012
Respostas 17
Participantes 3