Como criar e assinar um applet para imprimir direto na impressora padrão?

Pessoal, estou com um problema de arquitetura e gostaria de uma ajuda. É o seguinte:

Eu tenho uma classe que imprime direto na impressora padrão, funciona localmente blz, segue o código:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Impressao.java
 *
 * Created on 07/03/2012, 14:54:13
 */

package applet;

import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.FontKey;
import net.sf.jasperreports.engine.export.JRPrintServiceExporter;
import net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter;
import net.sf.jasperreports.engine.export.PdfFont;

/**
 *
 * @author user
 */
public class Impressao extends javax.swing.JApplet {

    /** Initializes the applet Impressao */
    public void init() {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void mensagem(){
        JOptionPane.showMessageDialog(this, "Eu sou um appletwewewe!","Título",JOptionPane.INFORMATION_MESSAGE);
    }

    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();

        jButton1.setText("click aqui!!");
        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                clickAqui(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(131, 131, 131)
                .addComponent(jButton1)
                .addContainerGap(186, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(119, 119, 119)
                .addComponent(jButton1)
                .addContainerGap(151, Short.MAX_VALUE))
        );
    }// </editor-fold>                        
    //private String caminhoRelatorio = "C:\\Documents and Settings\\user\\Desktop\\build\\classes\\applet\\reciboEmprestimo.jasper";
   private String caminhoRelatorio = "/home/user/NetBeansProjects/Applet/build/classes/applet/reciboEmprestimo.jasper";
   public void gerarRelatorioEImprimir() {
   List<ReciboEmprestimoBean> lista = new ArrayList<ReciboEmprestimoBean>();
   ReciboEmprestimoBean recibo = new ReciboEmprestimoBean();
   recibo.setAno("2001");
   recibo.setBiblioteca("Biblioteca Central");
   recibo.setClassificacao("769");
   recibo.setCodigoBarras("22056");
   recibo.setDataPrevistaDevolucao("23/03/2012");
   recibo.setDataSaida("09/03/2012");
   recibo.setEdicao("1");
   recibo.setNomeUsuario("Deivid Landim");
   recibo.setTitulo("Missão impossível");
   recibo.setVolume("2");

   JOptionPane.showMessageDialog(null, "Passou1");
   lista.add(recibo);
     HashMap parametros = new HashMap();
		try {
	        //Lista todas impressoras até encontrar a enviada por parametro
			//response.sen
                JOptionPane.showMessageDialog(null, "Teste01");
	        InputStream inStream = new FileInputStream(caminhoRelatorio);
                JOptionPane.showMessageDialog(null, inStream);
	        JRBeanCollectionDataSource jrDataSource = new JRBeanCollectionDataSource(lista);
                if(lista.size() > 0){
                    JOptionPane.showMessageDialog(null, lista.get(0).getBiblioteca());
                }
                
                JOptionPane.showMessageDialog(null, jrDataSource);
	        JasperPrint print = JasperFillManager.fillReport(inStream, parametros, jrDataSource);
                JOptionPane.showMessageDialog(null, "Teste4");

	        HashMap fontMap = new HashMap();
	        FontKey key = new FontKey("Courier", true, false);
	        PdfFont font = new PdfFont("COMICBD.TTF", "Cp1252", true);
	        fontMap.put(key, font);




	        JRExporter exporter = new JRPrintServiceExporter();
	        exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
	        exporter.setParameter(JRExporterParameter.FONT_MAP, fontMap);
	        exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG, Boolean.FALSE);
	        exporter.setParameter(JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG, Boolean.TRUE);
	        exporter.exportReport();


	    } catch (JRException e) {
	        gerarExcessao(e);
	    } catch (Exception e) {
	       gerarExcessao(e);
	    }
	}
   public static void gerarExcessao(Exception e){
			try {
                            JOptionPane.showMessageDialog(null, "ex01");
				StringWriter sw = new StringWriter();
				PrintWriter pw = new PrintWriter(sw);
				e.printStackTrace(pw);
                                 JOptionPane.showMessageDialog(null, "ex02");
                                JOptionPane.showMessageDialog(null, sw.toString());
				sw.close();
				pw.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
	}
    private void clickAqui(java.awt.event.MouseEvent evt) {                           
        gerarRelatorioEImprimir();
       // mensagem();
    }                          


    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    // End of variables declaration                   

}

Essa classe usa alguns jars que são eles:

jasperreports-3.0.0.jar
commons-logging-1.0.4.jar
commons-validator-1.3.1.jar
commons-beansutils-1.7.0.jar
commons-collections-3.2.jar

Esse projeto está sendo feito no netbeans.

O problema é o seguinte: Eu tenho que criar uma aplicação que imprime um comprovante
direto na impressora, mas tem que ser em um projeto web com tomcat e jsp, então a solução
que estou pensando é fazer com Applet, então como eu devo fazer para criar um jar e colocar em
uma página jsp para executar assim que acontecer a ação do botão.

Desde já agradeço.

Se alguém tiver outra solução que não seja com Applet, aceito sugestões.

Normalmente o que se faz é gerar o PDF no servidor, e mostrar uma página com esse PDF para o cliente web imprimir. Nunca vi uma applet sair gerando o PDF e imprimir na impressora padrão - até porque as bibliotecas necessárias são muito pesadas, além da quantidade de memória disponível para uma applet usar ser muito reduzida, então normalmente, mesmo que você conseguisse fazer isso (assinar todos os jars, achar a impressora padrão etc) isso costuma dar muitos problemas na prática.
Não recomendo, hoje em dia, usar applets. Acho que dão mais problemas que resolvem.

[quote=entanglement]Normalmente o que se faz é gerar o PDF no servidor, e mostrar uma página com esse PDF para o cliente web imprimir. Nunca vi uma applet sair gerando o PDF e imprimir na impressora padrão - até porque as bibliotecas necessárias são muito pesadas, além da quantidade de memória disponível para uma applet usar ser muito reduzida, então normalmente, mesmo que você conseguisse fazer isso (assinar todos os jars, achar a impressora padrão etc) isso costuma dar muitos problemas na prática.
Não recomendo, hoje em dia, usar applets. Acho que dão mais problemas que resolvem. [/quote]

Pois é, mas no meu caso o cliente exige que seja impresso direto na impressora, será que existe alguma maneira
ou terei que convence-lo a usar PDF ?.

não da p/ exibir o conteúdo em um jsp e solicitar 1 javascript p/ imprimir?

att,

[quote=pedruhenrik]não da p/ exibir o conteúdo em um jsp e solicitar 1 javascript p/ imprimir?

att,[/quote]

Já tentei fazer assim, mas com eu faria para setar o local da impressão para não imprimir no
meio da página? e outra coisa ele imprime o endereço da página.

Opa, neste momento to tentando fazer a mesma coisa.

Basicamente, consigo imprimir textos diretoro na impressora e tambem direto na impressora matricial em raw.
To me quebrando agora pra imprimir o PDF. Tente usar a classe ICEPDF, foi a menor q encontrei até agora e que faz a impressão de forma silenciosa, isto é, sem pedir a tela de OK, na hora de imprimir.

Dentro dele tem um comando que pega o PDF direto da URL, 

Document pdf = new Document();
pdf.setUrl(new URL(urlfinal));

O problema é: Pelo que entendi até agora, se tu nao tiver um applet assinado, não vai funciona. Eu até assinei o meu com o Netbeans, mas parece q precisa estar assinado pra valer mesmo. Criei uma conta na StartCom, tu precisa ali de um certificado nivel 2. Ainda to esperando eles liberarem o meu, tu tem de desenbolsar uns 60 dólares.


Outra forma q to tentando agora é enviar direto pelo javascript o arquivo sem fazer com que o applet tenha de acessar a URL,
pdf.setInputStream(arquivo, “lalala.pdf”);

ma ainda to emperrado com isso.

bom é issoae, espero q tenha pelo menos te passado algum caminho…

meu msn: beethoven@warchalking.com.br

se funcionar, logo vai ta no sistema q tamo montando www.a00s.com

inteh

Cara vc sabe se é possivel a applet apos execução de determinada ação fechar o navegador? Por exemplo, eu fiz uma applet de impressão direta, e gostaria q apos a impressao ela fosse fechada !!! tem como ?

Olá

Você poderia usar javascript neste caso

function close_window() {
close();
}

entretanto neste caso devera aparecer uma janela de confirmacao.

Outra forma, seria procurar o id do navegador e encerrar a applicacao com o applet, soh que dae o applet teria de tar rodando com permissao, Talvez o javascript seja a forma mais simples.

Thiago Maia
www.a00s.com