Imprimindo no Linux

17 respostas
spranta

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

denisspitfire

posta o código para darmos uma olhada

spranta
// 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;
	}
}
denisspitfire

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.

spranta

Ai não funcionou nem no Windows?

denisspitfire

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

denisspitfire

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.

denisspitfire

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

denisspitfire

alterar no arquivo java.policy

colocar este comando nao funciona

permission java.security.AllPermission;

denisspitfire

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

spranta

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

denisspitfire

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

denisspitfire

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?

spranta

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.

denisspitfire

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

denisspitfire

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.

denisspitfire

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