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]
// Essa classe é a responsavel pela impressao. Ela detecta a impressora// instalada, recebe o texto e o imprime.publicclassImpressaoTXT{//SingletonprivatestaticImpressaoTXTinstance=newImpressaoTXT();privateImpressaoTXT(){// seleciona a impressoradetectaImpressoras();setAtributos();// cria a tarefa de impressaoprintJob=impressora.createPrintJob();//determina o tipo a ser impresso txtdocFlavor=DocFlavor.INPUT_STREAM.AUTOSENSE;}publicstaticImpressaoTXTgetInstance(){returninstance;}// variáveisprivatePrintServiceimpressora;privatePrintRequestAttributeSetprinterAttributes;privateDocPrintJobprintJob;privateDocFlavordocFlavor;publicstaticvoidmain(String[]args){try{ImpressaoTXTimpressao=getInstance();// abre o arquivoFilearquivo=newFile("impressao.txt");FileInputStreamprint=newFileInputStream(arquivo);System.out.println("vai imprimir");impressao.imprime(print);System.out.println("imprimiu");print.close();}// senao conceguircatch(Exceptione){e.printStackTrace();JOptionPane.showMessageDialog(null,"Não foi possível realizar a impressão !!","Erro",JOptionPane.ERROR_MESSAGE);}}publicvoidimprime(InputStreamprint)throwsPrintException{DocdocumentoTexto=newSimpleDoc(print,docFlavor,null);// imprimeprintJob.print(documentoTexto,(PrintRequestAttributeSet)printerAttributes);}/** * O metodo verifica se existe impressora conectada e a define como padrao. */publicvoiddetectaImpressoras(){try{DocFlavordf=DocFlavor.SERVICE_FORMATTED.PRINTABLE;PrintService[]ps=PrintServiceLookup.lookupPrintServices(df,null);for(PrintServicep:ps){System.out.println("Impressora encontrada: "+p.getName());if(p.getName().contains("4200")){System.out.println("Impressora Selecionada: "+p.getName());impressora=p;break;}}}catch(Exceptione){e.printStackTrace();}}/** * Definição dos atributos de impressão * @return */privatePrintRequestAttributeSetsetAtributos(){// determina os atributosPrintRequestAttributeSetprinterAttributes=newHashPrintRequestAttributeSet();// 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 papelMediaSizeNamemediaSizeName=MediaSize.findMedia(80,10000000,MediaPrintableArea.MM);printerAttributes.add(mediaSizeName);returnprinterAttributes;}}
D
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.
S
spranta
Ai não funcionou nem no Windows?
D
denisspitfire
nao… sera que é problema de impressora? voce fez alguma coisa a mais?
D
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
juliocbq
Talvez seja problema de permissão. A máquina virtual pode estar rodando em uma conta limitada.
D
denisspitfire
conta limitada? a conta nao seria do usuario atual? eu consigo imprimir com meu usuario
D
denisspitfire
alterar no arquivo java.policy
colocar este comando nao funciona
permission java.security.AllPermission;
D
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?
S
spranta
Denis, mas para impressora local funcionou entao no windows né. E no Linux?
D
denisspitfire
testei no linux, foi mal a demora. Nao funciona aqui …
D
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?
S
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.
D
denisspitfire
kkk muda um pouco? estou tentando achar um tutorial amigavel aki
D
denisspitfire
Esse código resolve o problema de nao imprimir sendo um jar