none
Bloquear múltiples impresiones de report viewer (asp.net web form) RRS feed

  • Pregunta

  • Hola a todos, favor su ayuda para solucionar lo siguiente:

    Tengo unos formularios que se generan con report viewer (Versión 14), esto se genera directamente en la aplicación web (no viene de un reporting service),  todo me funciona a la perfección, se visualiza el reporte es exportable e imprimible (buena esa es la funcionalidad clásica y normal).

    Bueno el meollo en el que estoy, es que este reporte solo debe ser imprimible 1 sola vez y no puede ser exportable, quiere decir que:

    1. Clic en botón obtener certificado
    2. Se visualiza en pantalla el certificado (no hay botón de exportación a ningún formato)
    3. Solo existe el botón imprimir
    4. Una vez que se presiona el botón imprimir, directamente mandar a la impresora a que sea impreso (si es posible no permitir introducir N copias de la misma hoja al momento de imprimir)
    5. Al momento de imprimir, en el evento del botón de impresora o como se pueda poder incrustar código, esto con el objetivo de ir a la BD a marcar un campo de una tabla para que ya no se lo pueda volver a iniciar el paso 1, y también para redirigir a otro web form una vez que el doc ya sea haya impreso.

    Quedo agradecido de antemano.


    Roy Sillerico

    domingo, 24 de septiembre de 2017 17:52

Respuestas

  • Se me ocurre que podrías quitarle al ReportViewer los botones de exportar e imprimir (poniendo false en sus propiedades ShowExportControls y ShowPrintButton). Y en su lugar, poner un botón de asp.net para imprimir fuera del ReportViewer. Cuando pulsen ese botón, en el Click en lado servidor, realizas la comprobación de que no hayan imprimido ya, e imprimes desde el servidor usando las APIs del ReportViewer de WinForms (instanciando el objeto por código, sin hacerlo visible) o bien descargando la imagen mediante el WebService de SSRS y mandándola directamente a imprimir con un objeto PrintDocument.

    Esto no valdrá si el servidor no tiene acceso a la misma impresora que el puesto cliente. En ese caso, tendrías que hacer la impresión desde el propio ReportViewer en lado cliente. Con el ReportViewer de WinForms esto se puede hacer por programación, pero creo que el ReportViewer de WebForms no tiene esa opción. Podrías hacer visibe el botón de imprimir, y en cuanto lo pulsen una vez, ocultarlo. No sé si cuando se imprime desde el ReportViewer se hace un Postback y se dispara algún evento en el lado servidor, puedes experimentar con sus varios eventos a ver si alguno se dispara, y en ese caso hacer desde ahí ShowPrintButton=false. Si no fuera así, puedes probar a inyectar algún módulo de asp.net en el pipeline desde el web.config para interceptar la petición http que genera cuando pide la impresión. Esto implica que tendrías que experimentar un poco para averiguar cuál es esa petición y cómo distinguirla de otras que no sean de impresión. Otra opción que se me ocurre es jugar con el DOM en el lado cliente, suponiendo que el ReportViewer se renderice como HTML y por lo tanto el botoncito sea visible desde javascript, en cuyo caso podrías conectarle un evento de lado cliente y ocultarlo desde ahí. Una vez más esto requerirá que investigues un poco, no sé si el contenido interno del ReportViewer se expone como Html o no.

    lunes, 25 de septiembre de 2017 13:32

Todas las respuestas

  • No quisiera molestar, pero ¿eres consciente de que en Windows existe una impresora virtual, de forma que cuando mandas a imprimir algo en realidad te lo salva en un archivo? Me temo que tu pretensión de no permitir que el documento se imprima más de una vez o se salve a un archivo es inviable, salvo que los puestos cliente estén bajo tu control y puedas restringir la configuración del Windows para que no puedan instalar la impresora virtual. Nótese que esto tendría un impacto considerable, por ejemplo, los usuarios no podrían tener Microsoft XPS document writer, ni Microsoft Print to PDF, ni Send-to-OneNote...
    lunes, 25 de septiembre de 2017 8:20
  • Bueno, todo esta dentro de una intranet, y existen solo un número limitado de maquinas que tendrían acceso a este módulo con impresiones restringidas (si podría configurar esas máquinas según lo que dices), y bueno volviendo al tema original, como podría realizar la programación mencionada en la pregunta original???.

    Saludos cordiales.


    Roy Sillerico

    lunes, 25 de septiembre de 2017 13:12
  • Se me ocurre que podrías quitarle al ReportViewer los botones de exportar e imprimir (poniendo false en sus propiedades ShowExportControls y ShowPrintButton). Y en su lugar, poner un botón de asp.net para imprimir fuera del ReportViewer. Cuando pulsen ese botón, en el Click en lado servidor, realizas la comprobación de que no hayan imprimido ya, e imprimes desde el servidor usando las APIs del ReportViewer de WinForms (instanciando el objeto por código, sin hacerlo visible) o bien descargando la imagen mediante el WebService de SSRS y mandándola directamente a imprimir con un objeto PrintDocument.

    Esto no valdrá si el servidor no tiene acceso a la misma impresora que el puesto cliente. En ese caso, tendrías que hacer la impresión desde el propio ReportViewer en lado cliente. Con el ReportViewer de WinForms esto se puede hacer por programación, pero creo que el ReportViewer de WebForms no tiene esa opción. Podrías hacer visibe el botón de imprimir, y en cuanto lo pulsen una vez, ocultarlo. No sé si cuando se imprime desde el ReportViewer se hace un Postback y se dispara algún evento en el lado servidor, puedes experimentar con sus varios eventos a ver si alguno se dispara, y en ese caso hacer desde ahí ShowPrintButton=false. Si no fuera así, puedes probar a inyectar algún módulo de asp.net en el pipeline desde el web.config para interceptar la petición http que genera cuando pide la impresión. Esto implica que tendrías que experimentar un poco para averiguar cuál es esa petición y cómo distinguirla de otras que no sean de impresión. Otra opción que se me ocurre es jugar con el DOM en el lado cliente, suponiendo que el ReportViewer se renderice como HTML y por lo tanto el botoncito sea visible desde javascript, en cuyo caso podrías conectarle un evento de lado cliente y ocultarlo desde ahí. Una vez más esto requerirá que investigues un poco, no sé si el contenido interno del ReportViewer se expone como Html o no.

    lunes, 25 de septiembre de 2017 13:32