Imprimindo no Linux

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?

posta o código para darmos uma olhada

[code]// 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;
}
}
[/code]

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.

Ai não funcionou nem no Windows?

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

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?

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

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

alterar no arquivo java.policy

colocar este comando nao funciona

permission java.security.AllPermission;

é 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?

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

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

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?

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.

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

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.

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