Impresión matricial con comandos ESC/P desde Oracle Reports

Aquí estoy de vuelta luego de mucho tiempo con un artículo sobre las configuraciones necesarias para enviar impresiones matriciales desde un reporte creado con Oracle Report Builder.

Oracle Reports nos permite trabajar bastante bien, o al menos eso creo, con impresiones basadas en texto plano y el envío de comandos ESC/P para formateo en tiempo de ejecución del reporte para la impresión de facturas, recibos, cheques, etc. mediante impresoras matriciales.


Requerimientos para envío de impresiones matriciales desde Oracle Reports Server

Antes que nada quiero aclarar que el escenario en el que se probaron estas configuraciones fue en un servidor de reportes Oracle Report Server 11g instalado sobre Weblogic 11g en un sistema operativo Oracle Linux 6.3. Las impresoras utilizadas son unas Epson LX300+II compartidas en máquinas Windows como recursos compartidos y montadas en el servidor como una nueva impresora genérica utilizando el driver Generic -> Raw Queue -> Generic Raw Queue [en] mediante la herramienta System -> Administration -> Printing.

Necesitamos crear un reporte con Oracle Report Builder con las bandas y campos normales con el formato de la factura, y como nuestra impresión será matricial los bordes de las bandas no serán impresas (a menos que explícitamente se lo indiquemos).

Creación del archivo de definición de impresoras .prt para Weblogic

De esto ya había hablado en este artículo donde se creaba un archivo .prt para la impresión de cheques, pero en este caso el objetivo es la impresión de comprobantes tipo facturas, recibos, etc., básicamente comprobantes que tienen cabecera y detalle, y que en ocasiones necesitan formateos en solo partes del texto como ser la impresión del número de comprobante en una letra más grande y esas cosas.

Para la definición del archivo .prt necesitamos saber el tamaño de la letra por defecto con la que queremos imprimir el documento, para lo cual debemos considerar lo siguiente:

El cabezal de la impresora Epson LX-300+ solo se mueve 8 pulgadas, por lo que:
  • Si imprimimos con una configuración de 10 cpi x 8" de movimiento de cabezal tendremos solo 80 caracteres por línea para imprimir nuestra información (letra más grande).
  • Si imprimimos con una configuración de 12 cpi x 8" de movimiento de cabezal tendremos 96 caracteres por línea para imprimir nuestra información (letra intermedia).
  • Si imprimimos con una configuración de 10 cpi en modo condensado x 8" de movimiento de cabezal (o lo que sería lo mismo, 17.1 cpi reales x 8") tendremos 137 caracteres por línea para la impresión (letra chica).
  • Si imprimimos con una configuración de 12 cpi en modo condensado x 8" de movimiento de cabezal (que es igual a 20 cpi reales x 8") tendremos 160 caracteres por línea para la impresión (letra más chica).
Lo mencionado más arriba va resumido en la siguiente tabla:
10   cpi                             x 8" = 80 columnas
12   cpi                             x 8" = 96 columnas
17.1 cpi (10 cpi en modo condensado) x 8" = 137 columnas
20   cpi (12 cpi en modo condensado) x 8" = 160 columnas
Teniendo lo anterior en mente el siguiente paso consiste en definir adecuadamente el archivo .prt. Para facilitar dicha tarea a configuración adjunto un ejemplo de una definición avanzada cuyas directivas detallaré más adelante:
printer "comprobantes"

height   48
width    160

before report  esc hex(30)  esc hex(35)  esc hex(43)hex(30)  esc hex(21)hex(05)

after page

return        ""
linefeed      control(J)

code "bold on"             esc hex(45)
code "bold off"            esc hex(46)
code "italic on"           esc hex(34)
code "italic off"          esc hex(35)
code "underline on"        esc hex(2D)hex(01)
code "underline off"       esc hex(2D)hex(00)

code "01" esc hex(45)
code "02" esc hex(46)
code "03" esc hex(34)
code "04" esc hex(35)
code "09" esc hex(2D)hex(00)
code "10" esc hex(2D)hex(01)

code "31" esc hex(78)hex(00)
code "32" esc hex(78)hex(01)
code "33" esc hex(6B)hex(00)
code "34" esc hex(6B)hex(01)
code "35" esc hex(21)hex(00)
code "36" esc hex(21)hex(01)
code "37" esc hex(21)hex(04)
code "38" esc hex(21)hex(05)

code "61" esc hex(0F)
code "62" esc hex(12)
code "63" esc hex(50)
code "64" esc hex(4D)
A continuación paso a explicar cada una de las secciones de la configuración del archivo .prt presentado más arriba.
  • Las directivas height y width indican la altura y el anchor del reporte en caracteres, donde el valor asignado a ambas directivas tiene que ser consistente con las directivas de configuración de la impresora enviados más abajo en la sección before report.

  • En la directiva before report se agregan como argumentos todos los comandos esc/p que necesitamos enviar a la impresora para su configuración antes de comenzar la impresión. En este ejemplo se pasan los siguientes argumentos:
    1. esc hex(30): Interespaciado de 1/8 de líneas por pulgada, o lo que sería lo mismo, imprime 8 líneas en una pulgada. Como en la directiva anterior height se ha definido en 48 líneas la altura de la hoja, esto nos indica que la hoja física del comprobante debería tener una altura de 6 pulgadas según nuestra configuración (48/8=6).
    2. esc hex(35): Cancela el modo de letra cursivo por si acaso.
    3. esc hex(43)hex(30): Se le indica a la impresora que la altura de la página es de 48 líneas, ya que el valor hexadecimal de 30 es 48.
    4. esc hex(21)hex(05): Con esta directiva le indicamos que queremos imprimir nuestro comprobante en 20 CPI, o lo que sería lo mismo 12 CPI en modo condensado. También podríamos indicar lo mismo con los comandos esc hex(0F) esc hex(4D) respetando el orden (primero se indica que es condensado y luego de que tamaño, en el ejemplo 12 cpi).

  • Luego se envían las ya tradicionales directivas after page, return y linefeed que cerrarían la configuración obligatoria del archivo .prt.

  • A continuación se agregan las directivas code que son optativas, las mismas nos permiten modificar el formato de impresión de parte del cuerpo del reporte. Hay dos tipos:
    1. Los code bold, italic y underline en sus distintas configuraciones on/off nos permiten asociar los comandos esc/p que se tienen que enviar a la impresora matricial cuando en el reporte hemos puesto negrita, cursiva o subrayado respectivamente en una parte del texto o campo durante la fase de diseño del reporte.
    2. Los code identificados por números nos permite asociar a un código en particular (en este caso he elegido números) ciertos comandos esc/p definidos según nuestra necesidad, que se pueden invocar desde el reporte para modificar parte del cuerpo del reporte para formatear la impresión del comprobante. En mi caso los he usado para imprimir el número del comprobante con otro tamaño y tipo de letra para destacarlo de lo demás.
Para saber que hacen cada uno de los comandos esc/p asociados a las directiva code del archivo .prt les recomiendo consultar los documentos anexados más abajo con las listas de comandos ESC/P disponibles para la impresora Epson LX-300+II.

Recuerden que pueden agregar tantas directivas code personalizadas como que requieran (a excepción de aquellos que usan palabras reservadas como bold, italic, etc), más adelante veremos como invocar desde el Report Builder durante el diseño del reporte.


Desarrollo de reporte en Oracle Report Builder para impresión en formato matricial

Para desarrollar un reporte en Oracle Report Builder que permita imprimir el reporte en formato matricial, o sea, en modo character y no de forma binaria como sería una salida en formato pdf, tenemos que realizar una serie de configuración en las propiedades del reporte y programar ciertos triggers para que todo ello funcione. Los mismos se detallan a continuación:

  • Algo que necesitamos definir correctamente son las propiedades relacionadas al tamaño de la hoja de nuestro reporte que deben ser consistentes con los tamaños de hoja y configuraciones esc/p enviadas a la impresora desde el archivo .prt.
    Como se puede observar en la imagen superior, el ancho de la hoja es de 8 pulgadas y la altura de 6 pulgadas, y más abajo se vuelven a especificar nuevamente el anchor y la altura pero esta vez en columnas (160) y en cantidad de líneas (48) respectivamente que son consistentes con la configuración que hemos adoptado en el archivo .prt (directivas height, width y comandos esc/p esc hex(43)hex(30) y esc hex(21)hex(05)).

  • También tenemos que configurar los parámetros de sistema del reporte :DESFORMAT y :MODE con los valores comprobantes.prt (nombre del archivo de definición de impresoras) y Character respectivamente. Otra opción es evitar la configuración fija y agregar el siguiente código en el disparador BEFORE PARAMETER FORM.
    function BeforePForm return boolean is
    begin
      -- SI EL PARÁMETRO DE SISTEMA DESTYPE ES PRINTER SE CONFIGURAN LOS PARÁMETROS
      -- DESFORMAT Y MODE, EL PRIMERO CON EL NOMBRE DEL ARCHIVO .PRT Y EL SEGUNDO CON
      -- EL TIPO DE SALIDA QUE SERÁ DE TIPO CARACTER.
      IF (:DESTYPE = 'Printer') THEN
        :DESFORMAT  := 'comprobantes.prt';
        :MODE    := 'Character';
      ELSE 
        :MODE := 'Default';
      END IF;
      
      return (TRUE);
    end;
    
    El código asigna los valores adecuados para una impresión matricial cuando el parámetro DESTYPE indica como destino a una impresora (Printer), en caso contrario utilizaría los valores definidos por defecto de dichos parámetros que normalmente suelen generar una salida en pantalla con el formato PDF.

  • Es importante recordar que el reporte solo imprimirá textos cuando se configura el parámetro de sistema MODE con el valor Character, ya que la salida será enteramente en formato texto, a menos que decidamos modificar una serie de propiedades del reporte relacionadas exclusivamente a impresiones en este tipo de formato:
  • Los comandos esc/p de la sección before report del archivo .prt setean la configuración por defecto que la impresora matricial utilizará para imprimir el documento, como es por ejemplo la impresión en letras chicas de 20 CPI (12 CPI en modo condensado). Sin embargo esta configuración y otras más se pueden cambiar dinámicamente cuando se ejecuta el reporte agregando referencias a los identificadores code del archivo .prt en las propiedades Código de Impresora Antes y Código de Impresora Después de un elemento en particular, como por ejemplo para el campo F_NRO_COMPROBANTE1 visible en la siguiente captura:
    Nuevamente queda a cargo de ustedes identificar que comandos esc/p se envían a la impresora para configurarla antes y después de la impresión del número de comprobante mediante las referencias code de la imagen anterior.

Y bueno, esto ha sido todo por hoy y quizás por mucho jaja, espero poder publicar al menos los artículos que están en borradores.

Enlaces a documentos


Fuentes:

Comentarios

Entradas populares