imprimir en el lado del cliente

hola hace poco me tope con un problema con los reportes hechos en ireport usando una aplicacion web JSF, pues bien los reportes se necesitan imprimir sin mostrarlos en un formato especifico ya que son tiket, pero cuando lleno mi reporte no funciona el imprimirlo ya que lo imprimiria en el servidor.

he estado buscando ciertas soluciones algunas usan un servlet y visualizarlos en pagina jsp pero lo que necesito es imprimirlo sin visualizar nada
otra solucion es con aplets pero de estos no tengo conocimiento de como funcionan. noce si ya les ha pasado este problema y como lo solucionaron.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de radamanthys360

Media Solucion

Hola soy yo de nuevo estube investigando y encontre esta media solucion mi proyecto es en jsf , pues bien porque digo que es una media solucion porque no hace todavia lo que yo quiero por el momento aca el codigo

JasperPrint llenarReporte = llenarReporte(lista, nombreReporte); // mi objeto jasper print
FacesContext fcontext = FacesContext.getCurrentInstance(); // instacio el faces context
ExternalContext econtext = fcontext.getExternalContext(); // obtengo el contexto externo de la aplicacion
JRExporter exporter = null;
HttpServletResponse response = (HttpServletResponse) econtext.getResponse();
ServletOutputStream out = response.getOutputStream();
response.setContentType("application/pdf");
exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, llenarReporte);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
exporter.exportReport();
fcontext.responseComplete();

hasta aca funciona perfectamente el problema es que me tira el pdf en la misma pagina y noce como podria tirarlo en una nueva pagina y esa nueva pagina lo imprima de un solo sin que el usuario tenga que hacerlo por el mismo.

seguire buscando como solucionar esos puntos regreso cuando tenga la solucion

Imagen de darklatiz

Podria Usar iText para imprimir...

Una forma podría ser que utilizaras iText, pero el camino será un poco más largo, y requiere un poco de interacción con el usuario ya qué le aparecerá el dialogo o pantalla para que imprima el documento.

Lo primero que tienes que hacer es obtener tu reporte en un arreglo de bytes.

...
bytes = JasperRunManager.runReportToPdf(reportStream, parameters, new JRBeanCollectionDataSource(dummy(), false));
PdfReader reader = new PdfReader(bytes);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, baos);
PdfWriter writer = stamper.getWriter();
PdfAction action = new PdfAction(PdfAction.PRINTDIALOG);
writer.setOpenAction(action);
stamper.close();
...

En la variable baos se encuetra el documento modificado y una vez que se abra el documento aparecerá el dialogo para imprimir el documento, pero esto no es lo que quieres, tu quieres que haga un impresión silenciosa pero para esto debes de tener en cuenta tu ambiente, como estas trabajando en una aplicación WEB todo el código java que metas se ejecutara en el servidor, entonces si quieres que la impresión ocurra del lado del cliente es necesario un poco de configuración, programación del lado del cliente y dependiendo de los usuarios que tengas esta configuración la vas a tener que replicar en cada una de las maquinas clientes aquí te dejo una liga que explica como hacer un impresión silenciosa utilizando iText además de que tienes que hacer una configuración extra en las máquinas del cliente. Tal vez cómo comentas un applet es la solución que buscas.

Otra solución que tal vez te podría servir, claro suponiendo que tu aplicación correrá par aun grupo determinado de usuarios y localizados, es la de utilizar un servicio de impresión por medio de JMS y utilizando javax.print aunque claro se me hace mucho para una simple impresión. Saludos y espero te sirvan estos tips.

Imagen de radamanthys360

Gracias

OK investigare lo de iText fijate que logre que mostrara el pdf en otra ventana pensando a futuro ya que es posible que me pidan que solo muestre el reporte ,al formulatio de jsf con el atributo target="_blank" se muestra el pdf con la opcion de imprimir claro refresco con javascript el formulario.

Tambien estaba pensando comunicar el aplets con el servidor para que el imprima el reporte ya que necesito que lo imprima en una impresora destinada a ese cliente.

Luego comento como le di solucion

Imagen de radamanthys360

Otra duda

hola en lo que estube buscando como hacer esto en un aplets me ha saltado una duda , yo tengo una clase java debes de un servlet ya que uso faces context para obtener el ServletOutputStream y con eso generar el pdf, pero yo quiero mandarle el jasper print al aplets no tengo ni idea si se pueda hacer.....

Imagen de radamanthys360

Solucion

Hola quiero comentarles la solucion a la que llegue pues bien el sistema esta en un servidor remoto el cual tiene impresoras asignadas en su red donde el servidor puede accesar a ellas, asi se soluciono el problema de imprimir de un solo, aunque si el impresor esta local es donde trae problemas ahi tendria que desarrollarse con un aplets y servlets.

este es un Ejemplo de como comunicar un aplets y servlets
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=applets...

caso inverso
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=seriali...

y si solo necesitamos guardar el reporte
http://marceloagustini.wordpress.com/2011/01/05/reportes-en-jee-con-jasp...
este usa Primefaces para descargar el archivo pero se puede de forma directa.

y si lo queremos mostrar en una sola pagina hacemos esto
JasperPrint llenarReporte = llenarReporte(lista, nombreReporte); // mi objeto jasper print
FacesContext fcontext = FacesContext.getCurrentInstance(); // instacio el faces context
ExternalContext econtext = fcontext.getExternalContext(); // obtengo el contexto externo de la aplicacion
JRExporter exporter = null;
HttpServletResponse response = (HttpServletResponse) econtext.getResponse();
ServletOutputStream out = response.getOutputStream();
response.setContentType("application/pdf");
exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, llenarReporte);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
exporter.exportReport();
fcontext.responseComplete();

si lo queremos guardar añadimos el header que lo queremos attachment o en inline para verlo directamente eso es todo espero que sea de ayuda.

Imagen de Nopalin

Yo creo que mal entendiste el

Yo creo que mal entendiste el concepto. Mira el jsf es una tecnologia para crear páginas web. Una vez creada la página web en el servidor, manda el codigo html generado al cliente. El codigo puede contener ademas css, java script etc. Pero quien ejecuta la máquina virtual es el servidor nos los clientes. Los clientes son simples navegadores web que no instancian la jvm.

Si quieres imprimir en el cliente, tienes que usar rutinas javascript, no se si jsf tenga instrucciones para generar ese tipo de codigo en java script, pero lo que si se es que si lo mandas a imprimir con el codigo de java, como se ejecuta en el servidor, lo enviará a la impresora predeterminada del servidor.

Sobres

Imagen de radamanthys360

Asi es gracias por despejar

Asi es gracias por despejar mi duda por un momento entendi mal o lo tome por otro rumbo pero gracias y bueno asi aprende y se solucionan los problemas

Imagen de rugi

Creo que alguien ya había

Creo que alguien ya había hecho esta pregunta..... sólo que, no logro encontrar el hilo.

Bueno, el punto es...
Los archivos .PDF pueden llevar scripts en sus cabeceras, con esto puedes indicar que se mande a imprimir sin tener que visualizarlo.

Te saldrá el cuadro de diálogo de la impresora (segun el sistema operativo que uses) pero, al menos ya no se desplegará... lo cual entiendo
es el requerimiento que tienes.

Si el sistema operativo cliente es windows, seguramente puedes hacer un puente entre un applet y código javaScript que te permita usar a su vez algun activex para que tengas control completo sobre la impresora.

Saludos!
---