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