APEX Office Print (AOP) - Manual del usuario

Versión 3.5 Marzo 2018

1 Acerca de AOP

1.1 Objetivo

APEX Office Print hace que imprimir y exportar (docx, xlsx, pptx, pdf, html, md) en Oracle Application Express (APEX) o simplemente en PL/SQL sea mucho más fácil.

Cree una plantilla en Office, HTML o Markdown, elija datos de su base de datos y combínelos en uno. Puede imprimir fácilmente archivos PDF, documentos de Office, HTML o Markdown en muy poco tiempo. Le ahorra tiempo y esfuerzo al crear plantillas en las que puede integrar fácilmente sus datos.

APEX Office Print (AOP) es un producto de APEX R&D, ubicado en Lovaina, Bélgica.

Somos socios experimentados que lo ayudan a facilitar, mejorar y acelerar su negocio a través de soluciones nuevas e innovadoras. Basados en un profundo conocimiento técnico, nuestra empresa ofrece servicios de TI personalizados para la gestión de datos y procesos comerciales.

1.2 Características Principales de AOP

APEX Office Print se centra en lo siguiente:

  1. Impresión simple     Es rápido, fácil y le ahorra dinero. Es la única solución en el mercado que está completamente integrada con APEX. Por ejemplo, puede imprimir o exportar sus informes interactivos y datos de grillas en un segundo.

  2. Configuración rápida y fácil     Simplemente importas el Plugin de APEX en tu aplicación.

  3. Soporta cualquier tipo de datos     Texto, imágenes, códigos de barras, fórmulas .... es fácil fusionar sus datos con cualquier plantilla que usted cree.

  4. Escalable y seguro     APEX Office Print es un producto escalable y seguro que se adapta a sus necesidades de impresión.

  5. Soporte PL/SQL API     Le da la capacidad de ejecutar y recuperar informes desde el servidor AOP directamente desde su código PL/SQL.

  6. Optimizado para el rendimiento     Gran diseño con los mejores detalles para mejorar la productividad de su negocio.

  7. Flexible     APEX Office Print es un servidor de impresión que le permite crear plantillas en Word, Excel y PowerPoint para cualquier tipo de datos.

1.3 Arquitectura AOP

Es la base de datos (APEX Plugin, PL/SQL API, REST WebService) la que realiza una solicitud al Servidor AOP (ya sea en las instalaciones o en nuestra nube). La plantilla junto con los datos se envía en formato JSON al servidor AOP. El navegador no necesita tener acceso al servidor AOP.

1.4 Cómo funciona (descripción general)

1.5 Cómo funciona (técnico)

El paquete APEX Office Print consta de un componente de servidor, un plugin de Oracle APEX y una API PL/SQL.

La parte del servidor devuelve documentos generados al recibir solicitudes HTTP POST. Estas solicitudes requieren un archivo JSON estructurado que puede por ejemplo, provenir de la base de datos. Los datos de la base de datos en combinación con una plantilla generarán archivos de salida relevantes.

El plugin de Oracle Application Express (APEX) generará las solicitudes HTTP POST para que la parte del servidor comprenda. El plugin hace que sea fácil seleccionar una plantilla, su fuente de datos y el formato de salida directamente desde su aplicación APEX.

La API PL/SQL permite imprimir directamente desde la base de datos Oracle. La API PL/SQL se adapta perfectamente si necesita configurar la impresión automática a través de un job o hacer una combinación de correspondencia.

Una aplicación de ejemplo viene con la descarga, por lo que verá muchos casos de uso en acción.

1.6 Nube vs Local

Hay dos tipos de versiones para comprar:

1.7 Licencia

Este es un software comercial; necesita obtener una licencia válida para usar este software y el plugin en su aplicación. Para la versión local se requiere una licencia por servidor (dirección MAC) con la que está ejecutando APEX Office Print o puede optar por una Enterprise License que no se ajusta a la dirección MAC.

Visite nuestro sitio web https://www.apexofficeprint.com/ para ver los diferentes paquetes.

Incluso puede registrarse para una prueba gratuita para ver AOP en acción.

1.8 Registro y Descarga

  1. Abra https://www.apexofficeprint.com/

  2. Haga clic en el botón "Pruébelo gratis" o "Registrarse"

  1. Ingrese sus detalles

  1. Recibirá un correo electrónico con un enlace de confirmación, haga clic en dicho enlace

  2. Al mismo tiempo, inicie sesión en su Panel de Control de AOP. Seleccione Descargas

  1. Elija el paquete que desea y haga clic para descargarlo

Importante: activación del número de clave de API

En su panel de control AOP, su número de clave exclusivo se puede encontrar en la región de Información de la cuenta en la página de inicio. Este número deberá agregarse a la configuración del plugin para que funcione. Para obtener más información sobre cómo hacer esto, consulte la Sección APEX Plugin.

1.9 Guía de instalación rápida

  1. Descomprime el archivo que descargó de https://www.apexofficeprint.com

  2. Ejecute aop_db_pkg.sql (en el directorio "db") en su esquema de Oracle (SQL Workshop -> SQL Scripts -> Upload -> Select file y presione Upload)

  3. Importe los scripts dynamic_action_plugin_be_apexrnd_aop_da.sql y process_type_plugin_be_apexrnd_aop.sql (en el directorio "plugin") en Componentes Compartidos> Plugins

  4. En la página que desea usar AOP, agregue la Acción Dinámica o el Proceso "APEX Office Print"

2 Aplicación de ejemplo AOP APEX

2.1 Pre-requisitos

APEX Office Print requiere Oracle APEX 5.0.4 o superior. El soporte del Grid Interactivo está incluido en Oracle APEX 5.1 y superior.

Para ejecutar la aplicación de ejemplo de AOP, primero se debe instalar una aplicación empaquetada de Oracle APEX llamada Sample Database Application. El motivo es que el origen y las plantillas están utilizando datos de las tablas (demo_orders, demo_order_items, demo_product_info, ….) los cuales son instalados por la aplicación empaquetada.

Siga estos pasos para instalar la aplicación empaquetada en su espacio de trabajo:

  1. Acceda a su Espacio de Trabajo seleccionado
  2. Seleccione el Creador de Aplicaciones
  3. Seleccione Crear

  1. Seleccione Aplicación Empaquetada

  1. Seleccione Sample Database Application y haga clic en el botón Instalar Aplicación Empaquetada

  1. Seleccione usar ID de aplicación existente     Nota: Cuando seleccionó la reasignación automática de la identificación de la aplicación, debe asegurarse de cambiar los valores de aop_api3_pkg que usa APP_ID y AOP_URL como variables globales.
  2. Seleccione para instalar los Objetos de Soporte
  3. Siga al asistente para completar la instalación.

2.2 Importar la Aplicación de Ejemplo AOP

  1. Acceda a su espacio de trabajo seleccionado
  2. Seleccione el Creador de Aplicaciones
  3. Seleccione Importar
  4. Siga el asistente para finalizar la importación
  5. La aplicación de ejemplo de AOP también instalará todos los objetos de soporte, por lo que después de la importación puede simplemente comenzar a usar la aplicación.

2.3 Prueba de la Aplicación de Ejemplo AOP

La aplicación APEX que viene con AOP muestra diferentes ejemplos de cómo se puede utilizar APEX Office Print dentro de una aplicación.

Al inspeccionar los elementos de estas páginas, puede aprender rápidamente a usar el plugin AOP.

Tenga en cuenta que la aplicación de ejemplo de AOP para APEX 5.0 y 5.1 es diferente.

2.3.1 Solicitud de ejemplo AOP para APEX 5.0

La aplicación de ejemplo AOP consta de 19 partes:

  1. Ejemplo de Impresión

Esta página contiene diferentes botones, todos vinculados a diferentes procesos AOP y acciones dinámicas que muestran diferentes casos de uso del plugin AOP.

  1. Funciones Principales

Esta sección destaca algunos de los diferenciadores clave de APEX Office Print en comparación con otras soluciones de impresión.

  1. Impresión Dinámica

Dinámicamente puede seleccionar su plantilla en Word, Excel o PowerPoint y enviarla según el cliente que seleccionó.

  1. Informes Impresos

Esta sección muestra ejemplos en los que se utiliza un informe clásico e interactivo y una cuadrícula como fuente de los datos. También hay un ejemplo para imprimir etiquetas.     Incluso puede usar una combinación de múltiples informes clásicos e interactivos como fuente de datos. Esta característica es una de las más impresionantes de AOP y no se encuentra en ninguna otra herramienta.

  1. Impresión de Gráficos

Esta sección muestra ejemplos de cómo imprimir gráficos: Línea, Barra, Columna, Pie, Radar, Área, ... Los gráficos son gráficos nativos de Office, por lo que incluso se pueden adaptar después de la creación en Word, Excel y Powerpoint.

  1. Editor de texto enriquecido

También puede escribir sus etiquetas (markup) en un Editor de Texto Enriquecido y AOP entenderá y traducirá la etiqueta (negrita, color, etc.) en la etiqueta nativa de Word. En su plantilla, debe poner un guión bajo delante del nombre de la etiqueta, por ejemplo: {_htmlcontent}

  1. Imágenes

APEX Office Print puede imprimir imágenes en diferentes formatos. Esta pantalla muestra un ejemplo de cómo configurarlo. Para mostrar las imágenes, usted las codifica en base64 y pone un % en su etiqueta, por ejemplo: {%imagen}

  1. QR y Códigos de Barras

APEX Office Print puede imprimir diferentes códigos de Barras y QR. Esta pantalla muestra un ejemplo de cómo configurarlo.

  1. PDF en Línea

Si desea mostrar el PDF en línea en un cuadro de diálogo modal o en cierto div (región), esta página muestra exactamente cómo hacerlo. El valor de la etiqueta data-aop-inline-pdf debe ser el nombre de la acción dinámica que llama a AOP.

  1. Impresión Compleja

La sección Impresión Compleja muestra diferentes casos de uso para Word, Excel y Powerpoint. Hay diferentes plantillas que muestran cómo crear diseños más complejos. También hay algunos ejemplos que muestran algunas características específicas como por ejemplo, cómo utilizar saltos de línea en sus datos o cómo descargar dos documentos al mismo tiempo.

  1. Correspondencia Impresa

Word tiene una función para crear etiquetas mediante la opción de correspondencia. Esta pantalla muestra un ejemplo con algunas etiquetas de tamaño Avery específicas.

  1. Correo Electrónico Impreso

Este ejemplo muestra cómo puede llamar a un procedimiento y enviar un correo electrónico como archivo adjunto. También hay una opción para enviar el correo electrónico y también descargar el archivo.

  1. Ejemplo API PL/SQL

Aquí puede ver la API AOP PL/SQL en acción. Muestra cómo recuperar un documento del servidor AOP y almacenarlo en una tabla personalizada. Esto es extremadamente útil cuando desea programar sus impresiones de trabajo (job) y enviar correos electrónicos automáticos.

  1. Impresión Programada

Puede programar un trabajo para imprimir todos los días, semanas, meses, etc. un informe específico utilizando dbms_scheduler y la API AOP PL/SQL.

  1. Batch Print

Si desea imprimir documentos en lote, esta página muestra tres formas de hacerlo.

El primero generará un documento con las páginas aquí.     Segundo generará múltiples documentos.     Y la última opción generará varios documentos pero los presentará como un archivo zip.

  1. Plantilla y Tipos de Datos

Esta página ofrece una visión general y un ejemplo de las diferentes plantillas y tipos de datos que son posibles dentro del plugin APEX Office Print (AOP) y la API.     El tipo de plantilla define dónde se define su plantilla en docx, xlsx o pptx (tabla, sistema de archivos, URL, APEX, ...). El tipo de datos define dónde se pueden encontrar los datos para combinar con la plantilla (SQL, PL/SQL, JSON, REST, ...).

  1. Uso de AOP

Esta página ofrece una descripción general de las páginas dónde y cómo se utiliza el plugin APEX Office Print (AOP).

  1. Prueba Automatizada

Puede probar automáticamente todos sus documentos en esta pantalla y ver si todas sus plantillas definidas y fuentes de datos se fusionaron correctamente. Esta opción es especialmente útil después de una actualización de AOP u Office.

  1. Plantillas

Aquí puede cargar sus plantillas en una tabla personalizada.

La idea aquí es que en su propia aplicación, permita que las personas creen o actualicen sus propias plantillas y las carguen a la aplicación sin necesidad de que el desarrollador codifique otros documentos.

2.3.2 Aplicación de Ejemplo AOP para APEX 5.1

Para Oracle Application Express (APEX) 5.1, queríamos llevar la aplicación de ejemplo AOP a otro nivel e incluir más información sobre cómo funciona el AOP. Sabemos que leer la documentación no es lo más divertido, así que ponemos mucha información en la aplicación de ejemplo, de modo que navegando a través de ella se aprende sobre AOP.

Las diferentes partes de la aplicación de ejemplo:

  1. Start le explica paso a paso cómo puede lograr que AOP funcione en su propia aplicación.

  1. Tour muestra las diferentes técnicas que puede usar y detalla cuándo usar qué complemento, la API PL/SQL o hacer una solicitud REST manualmente.

  1. Examples muestra diferentes casos de uso de AOP, por lo que puede ver exactamente detrás de escena cómo se usa AOP.

  1. Doc es un enlace a la última versión de nuestra documentación en línea.

  2. More es un enlace a nuestro sitio web donde encontrará el historial de versiones, preguntas frecuentes, tutoriales, etc.

  3. Support abrirá su cliente de correo electrónico predeterminado para que pueda escribirnos.

3 APEX Plugin

3.1 Pre-requisitos

El plugin "APEX Office Print" de APEX requiere Oracle APEX 5.0.4 o superior.

Los plugins AOP se basan en un paquete PL/SQL (aop_api3_pkg) que primero debe compilarse. El plugin en sí mismo solo puede contener 32k de código, y AOP contiene más del doble desde la v2.2.

Para hacer que el paquete esté disponible, vaya a SQL*Plus, SQLcl, SQL Developer o SQL Workshop y ejecute el SQL Script aop_db_pkg.sql que encontrará en el directorio db del zip que descargó.

Alternativamente, puede ejecutar el archivo install.sql que instalará algunos paquetes adicionales que muestran el caso de cómo usar AOP desde PL/SQL.

Si importó la aplicación de ejemplo, los paquetes se instalan automáticamente por medio de los objetos de soporte.

3.2 Importación y los Atributos del Plugin

Siga estos pasos para importar el plugin en su aplicación:

  1. Acceda a su Espacio de Trabajo objetivo
  2. Seleccione el Creador de Aplicaciones
  3. Seleccione la aplicación donde desea importar el plugin > (los plugins pertenecen a una aplicación, no a un espacio de trabajo)
  4. Acceda a Componentes Compartidos > Plugins
  5. Haga clic en Importar >
  6. Explore y ubique el archivo instalador (plugin/process_type_plugin_be_apexrnd_aop.sql)
  7. Complete el asistente.
  8. Haga lo mismo con el plugin de acción dinámica

Siga estos pasos para finalizar la instalación de su plugin al agregar su clave de API del plugin:

  1. Inicie sesión en la Aplicación AOP https://www.apexofficeprint.com
  2. Copie su clave API de la región Información de la Cuenta
  3. Acceda a su Espacio de Trabajo APEX objetivo
  4. Seleccione el Creador de Aplicaciones
  5. Seleccione la Aplicación donde desea importar el plugin (los plugins pertenecen a una aplicación, no a un espacio de trabajo)
  6. Acceda a Componentes Compartidos > Valores de Componentes
  7. Seleccione APEX Office Print (AOP) [Plug-in]
  8. Reemplace el valor actual de la clave API con la clave API AOP que copió en el paso 2

  1. Haga clic en Aplicar
  2. La instalación ahora está completa

Nota de instalación: Para usar la API AOP PL/SQL, es posible que deba configurar su ACL (Access Control List - Lista de Control de Acceso) para permitir el acceso a: http(s)://www.apexofficeprint.com/api

Para obtener más información, consulte la guía de instalación de Oracle APEX: para APEX 5.0 o para APEX 5.1 /apex-5.1/HTMIG/enabling-network-services-in-Oracledb-11g-or-later.htm#HTMIG29160)

En caso de que quiera actualizar algunas configuraciones de plugins, encontrará la configuración del plugin en Componentes Compartidos > Configuración de Plugins > APEX Office Print (AOP) [Plug-in]

Puede cambiar la URL de AOP, la URL de conmutación por error de AOP, la clave de API, la depuración y especificar un paquete donde se especifique esa configuración. Si usa la versión local de AOP, también puede cambiar el Convertidor.

Para generar un PDF, APEX Office Print está utilizando un convertidor externo. De forma predeterminada, se utiliza LibreOffice (disponible en todas las plataformas), pero se puede cambiar a MS Office (solo Windows).

3.3 Cómo utilizar el plugin AOP

Simplemente agregue un nuevo proceso llamado AOP (plugin) en su página APEX una vez que haya completado los pasos en 3.2.

3.4 Demostración de Inicio Rápido

Una vez que el plugin se haya importado a su APEX 5, navegue hasta la aplicación de base de datos de ejemplo - Página 4.

1) Cree un nuevo botón llamado IMPRIMIR y colóquelo a la derecha del botón RESTABLECER.

2) Cree un nuevo proceso (APEX 5.0) o acción dinámica (APEX 5.1) llamado AOP y seleccione como tipo AOP [Plug-in]

3) Establezca la opción Tipo de Datos del plugin en SQL y pegue la siguiente select en el Origen de Datos. Tenga en cuenta el uso del cursor data. Las etiquetas que usa en la plantilla deben estar dentro de este cursor **data.

select
  'file1' as "filename",
  cursor(
    select
      c.cust_first_name as "cust_first_name",
      c.cust_last_name as "cust_last_name",
      c.cust_city as "cust_city",
      cursor(
        select
          o.order_total as "order_total",
          'Order ' || rownum as "order_name",
          cursor(
            select
              p.product_name as "product_name",
              i.quantity as "quantity",
              i.unit_price as "unit_price",
              APEX_WEB_SERVICE.BLOB2CLOBBASE64(p.product_image) as "image"
            from
              demo_order_items i, demo_product_info p
            where
              o.order_id = i.order_id
              and i.product_id = p.product_id
                ) "product"
        from
          demo_orders o
        where
          c.customer_id = o.customer_id
            ) "orders"
    from
      demo_customers c
    where
      customer_id = 1
        ) as "data"
from dual

4) Como Tipo de Salida (Output Type), seleccione docx.

5) Agregar como Condición para el proceso establecido que sólo se ejecute cuando se hace clic en el botón IMPRIMIR.

6) Pulse Guardar y Ejecute la página.

Al hacer clic en el botón Imprimir, debería obtener su primer documento de Word.    Este documento representa una plantilla de inicio basada en sus datos. Verá todas las etiquetas que puede usar y algunas explicaciones más sobre cómo usar expresiones y ciertas características de AOP.    Ahora puede crear su plantilla en MS Word (o Excel o Powerpoint) y usar las etiquetas en su plantilla. Sigue los próximos pasos para hacer esto.

7) Crea tu plantilla en Word y usa las etiquetas que vinieron en el primer documento que obtuviste.

8) Vaya a Componentes Compartidos > Archivos de Aplicación Estáticos y cargue su plantilla

9) Regrese a su página y seleccione el proceso de AOP

10) Cambie el tipo de plantilla a "Archivos de Aplicación Estáticos"

11) En Fuente de la plantilla, ingrese el documento que cargó en el paso 8, p. ej. my_template.docx

12) Ejecuta tu página de nuevo

Al hacer clic en el botón Imprimir, ahora debería obtener su documento de Word basado en su plantilla con las etiquetas reemplazadas por los datos que provienen de la base de datos.

3.5 Opciones del Plugin

Desde AOP v2.3 hay dos plugins incluidos: un plugin de tipo proceso y un plugin de tipo acción dinámica. Si está utilizando APEX 5.1, el plugin Dynamic Action siempre funcionará, mientras que el plugin Process solo funciona si el atributo "Volver a Cargar al Ejecutar" (de la página) está configurado en "Siempre" (tenga en cuenta que este atributo es nuevo en 5.1). Esto se debe a un cambio en la forma en que APEX 5.1 maneja el procesamiento de páginas. Si quiere importar una aplicación APEX 5.0 en 5.1 de manera predeterminada está configurado en "Siempre" en la opción "Volver a Cargar al Ejecutar", pero si crea una nueva aplicación en 5.1, se establece en "Solo Correctos" y por ello el plugin de tipo proceso no funciona.

Hay diferentes opciones de configuración que se pueden usar en AOP.

En las subsecciones a seguir puedes encontrar más detalles para cada uno de ellos.

3.5.1 Tipo de plantilla

Representa la fuente de tus plantillas.

El complemento AOP le permite:

Plantilla de AOP

Generará un documento de Word con una plantilla de inicio basada en los datos (JSON) que se envía.

Archivos de Aplicación Estáticos

Hará referencia a los archivos que encuentre en Componentes Compartidos > Archivos de Aplicación Estáticos

Archivos de Espacio de Trabajo Estáticos

Hará referencia a los archivos que encuentre en Componentes Compartidos > Archivos de Espacio de Trabajo Estáticos

SQL

Consulta que devuelve dos columnas: template_type y file (en este orden)

Función PL/SQL (devolviendo SQL)

Devuelve una instrucción select como con SQL.

Función PL/SQL (devolviendo JSON)

Devuelve el objeto JSON con el siguiente formato:

{
"file":"clob base64 data",
"template_type":"docx,xlsx,pptx"
}

Nombre de Archivo (con la ruta relativa al servidor AOP)

Ingrese la ruta y el nombre de archivo de la plantilla que está almacenada en el mismo servidor AOP que se está ejecutando.

URL (devolución del archivo)

Ingrese la url a su plantilla en docx, xlsx o pptx.

3.5.2 Origen de la Plantilla

Todos los tipos, excepto el tipo de plantilla AOP predeterminada, le permitirán configurar estos seteos. Puede representar un nombre de su archivo o contener código para su SQL y PL/SQL.

Algunos ejemplos de origenes de plantilla se pueden encontrar aquí:

Archivos de Aplicación Estáticos

aop_simple_letter.docx

Archivos de Espacio de Trabajo Estáticos

aop_simple_letter.docx

SQL

select
  a.TEMPLATE_TYPE as template_type,
  apex_web_service.blob2clobbase64(a.TEMPLATE_BLOB) as file
 from aop_template a
where id = 1

Función PL/SQL (devolviendo SQL)

declare
  l_return clob;
begin
  l_return := q'[
    select
      a.TEMPLATE_TYPE as template_type,
      apex_web_service.blob2clobbase64(a.TEMPLATE_BLOB) as file
     from aop_template a
    where id = 1
  ]';
  return l_return;
end;

Función PL/SQL (devolviendo JSON)

declare
  l_return clob;

begin
  l_return := '{ "file": "", "template_type": "docx" }';
  return l_return;
end;

declare
  l_return clob;
  l_template clob;
  l_template_type aop_template.template_type%type;

begin
  select template_type, apex_web_service.blob2clobbase64(template_blob) template
    into l_template_type, l_template
    from aop_template
   where id = :p4_template;

  l_return := '{ "file": "' || replace(l_template,'"', '\u0022') || '",'
           || ' "template_type": "' || replace(l_template_type,'"', '\u0022')
           || '" }';
  return l_return;
end;

Puede usar esta técnica para cargar html como plantilla. Por favor, eche un vistazo a la página 114 de la aplicación de ejemplo.

Nombre de Archivo (con ruta relativa al servidor AOP)

aop_template.docx

URL (devolviendo archivo)

http://apexofficeprint.com/templates/aop_template_d01.docx

3.5.3 Tipo de Datos

El Tipo de Datos indica qué tipo de origen de datos usará.

Las opciones disponibles incluyen:

SQL

Seleccione la instrucción en la que puede usar el cursor para hacer registros anidados. Use "" como alias de nombres de columna para forzar los nombres de columna en minúsculas.

Función PL/SQL (devolviendo SQL)

Devuelve una instrucción select como un SQL.

Función PL/SQL (devolviendo JSON)

Devuelve JSON definido en el ejemplo de URL anterior.

URL (devolviendo JSON)

El Origen debe apuntar a la URL que devuelve el objeto JSON con el siguiente formato: { "filename": "file1", "data":[{...}] } Si la URL está utilizando una llamada APEX ORDS REST automáticamente será envuelto con JSON adicional: {"items":[...]} Todo esto será manejado por el plugin AOP.

Región(es): Informe(s) clásico(s) y/o Interactivo(s) y/o Cuadrícula(s) Interactiva(s) y/o Gráficos

Se utilizarán uno o más informes clásicos y/o interactivos y/o cuadrículas interactivas como fuente de sus datos. El plugin Dynamic Action también tiene la posibilidad de tomar una captura de pantalla de, por ejemplo, un gráfico JET o cualquier otro div (svg/canvas).

3.5.4 Origen de Datos

Depende del tipo de datos seleccionado y puede ser:

SQL

select
  'file1' as "filename",
  cursor(
    select
      c.cust_first_name as "cust_first_name",
      c.cust_last_name as "cust_last_name",
      c.cust_city as "cust_city",
      cursor(
        select
          o.order_total as "order_total",
          'Order ' || rownum as "order_name",
          cursor(
            select
              p.product_name as "product_name",
              i.quantity as "quantity",
              i.unit_price as "unit_price",
              APEX_WEB_SERVICE.BLOB2CLOBBASE64(p.product_image) as "image"
            from
              demo_order_items i, demo_product_info p
            where
              o.order_id = i.order_id
              and i.product_id = p.product_id
                ) "product"
        from
          demo_orders o
        where
          c.customer_id = o.customer_id
            ) "orders"
    from
      demo_customers c
    where
      customer_id = :P4_CUSTOMER_ID
        ) as "data"
from dual

Asegúrese de poner los datos devueltos dentro del cursor data .

select
  'file1' as "filename",
  cursor(
      ***Your Select Statement***
  )
   as "data"
from dual

Función PL/SQL (devolviendo SQL)

El SQL devuelto debe contener los datos dentro del cursor de datos como se muestra arriba.

declare
  l_return clob;
begin
  l_return := q'[
    select
      'file1' as "filename",
      cursor(
        select
          c.cust_first_name as "cust_first_name",
          c.cust_last_name as "cust_last_name",
          c.cust_city as "cust_city",
          cursor(
            select
              o.order_total as "order_total",
              'Order ' || rownum as "order_name",
              cursor(
                select
                  p.product_name as "product_name",
                  i.quantity as "quantity",
                  i.unit_price as "unit_price",
                  APEX_WEB_SERVICE.BLOB2CLOBBASE64(p.product_image) as "image"
                from
                  demo_order_items i, demo_product_info p
                where
                  o.order_id = i.order_id
                  and i.product_id = p.product_id
                    ) "product"
            from
              demo_orders o
            where
              c.customer_id = o.customer_id
                ) "orders"
        from
          demo_customers c
        where
          customer_id = :P4_CUSTOMER_ID
            ) as "data"
    from dual
  ]';
  return l_return;
end;

Función PL/SQL (devolviendo JSON)

Observe cómo el JSON contiene el objeto de datos con los datos reales dentro de él.

declare
  l_cursor sys_refcursor;
  l_return clob;
begin
  apex_json.initialize_clob_output(dbms_lob.call, true, 2) ;
  open l_cursor for
    select 'file1' as "filename",
      cursor
        (select
         c.cust_first_name as "cust_first_name",
         c.cust_last_name as "cust_last_name" ,
         c.cust_city as "cust_city" ,
         cursor
           (select
              o.order_total as "order_total",
              'Order ' || rownum as "order_name" ,
              cursor
              (select
                 p.product_name as "product_name",
                 i.quantity as "quantity" ,
                 i.unit_price as "unit_price" ,
                 apex_web_service.blob2clobbase64(p.product_image) as "image"
               from
                 demo_order_items i,
                 demo_product_info p
               where
                 o.order_id = i.order_id
                 and i.product_id = p.product_id
               ) "product"
            from
              demo_orders o
            where
              c.customer_id = o.customer_id
                and rownum < 2
           )"orders"
         from
           demo_customers c
         where
           customer_id = :P4_CUSTOMER_ID
        ) as "data"
    from dual;
  apex_json.write(l_cursor);
  l_return := apex_json.get_clob_output;
  return l_return;
 end;

URL con ORDS RESTful Web Services

Para esto, necesita crear un nuevo servicio web siguiendo estos pasos:

  1. Abrir el Taller SQL -> Servicios RESTful.

Haga clic en el botón Crear y siga el asistente. Para el Módulo de Servicios RESTful setee

El nombre puede ser de tu preferencia

  1. Para Plantilla de Recurso, ingrese:

  1. Para el Manejador de Recursos, ingrese:

La declaración que usamos en este ejemplo es:

select
  file1' as "filename",
  cursor(
    select
      c.cust_first_name,
      c.cust_last_name,
      c.cust_city,
      cursor(
        select
          o.order_total,
          'Order ' || rownum as order_name,
          cursor(
            select
              p.product_name,
              i.quantity,
              i.unit_price,
              APEX_WEB_SERVICE.BLOB2CLOBBASE64(p.product_image) as image
            from
              demo_order_items i,
              demo_product_info p
            where
              o.order_id = i.order_id
              and i.product_id = p.product_id
                ) product
        from
          demo_orders o
        where
          c.customer_id = o.customer_id
          and rownum < 2
            ) orders
    from
      demo_customers c
    where
      customer_id = :id
        ) as "data"
from dual

4.Finalmente, haga clic en el botón Crear Módulo.

Informe(s) Clásico(s) y/o Interactivo(s) y/o Cuadrícula(s) Interactiva(s)

No definido en el Origen de Datos sino en la opción Identificador Estático de la región (ver 3.5.5)

3.5.5 Identificador Estático de Región

Defina uno o más ID(s) Estáticos de la región de tipo informe (Informe Clásico o Interactivo o Cuadrícula Interactiva). Los identificadores estáticos deben estar separados por una coma. p.ej. classic1,ir1,ir2. Puede establecer el ID estático de la región en los atributos de región. Puede llamar a un informe interactivo específico agregando una barra vertical (pipe) al lado, p.ej. ir1|my_saved_report.

3.5.6 Especial

Las características específicas de APEX Office Print que están disponibles cuando el tipo de datos es SQL o Informe Clásico(s) o Interactivo(s)

Las opciones disponibles incluyen:

Trate todos los números como cadenas - [Treat all numbers as strings] Hay una limitación en APEX con la instrucción SQL del cursor() que no recuerda en qué tipo de datos está la columna. Por lo tanto, al hacer to_char(0.9,'990D00') devolverá 0.9 como número en lugar de como cadena '0.90' . Para resolver esto, habilite esta casilla de verificación y concatene su número con '!FMT!' p.ej. '!FMT!'||to_char(35, '990D00') - !FMT! significa formato.

Alternativamente, si formatea su número con el signo de moneda to_char(35,'FML990D00'), Oracle lo reconocerá como una cadena y no necesita usar esta casilla de verificación.

Reporte como Etiquetas - [Report as Labels] Marque esta casilla en caso de que desee utilizar el origen de datos del Informe Clásico o Interactivo, pero imprímalo como Etiquetas (usando la función de Correos en Word). * esta opción está en desuso desde AOP 3.0 ya que AOP entiende las etiquetas según la plantilla.

II/CI: mostrar los filtros en la parte superior - [IR/IG: Show Filters on top] Cuando hay filtros aplicados al Informe Interactivo/Cuadrícula, esta casilla los imprimirá sobre el informe.

II/CI: Mostrar destacados en la parte superior - [IR/IG: Show Highlights on top] Cuando hay resaltados (highlights) aplicados al Informe Interactivo/Cuadrícula, esta casilla los imprimirá sobre el informe.

II/CI: Mostrar encabezado con filtro (Excel) - [IR/IG: Show header with filter (Excel)] Cuando se marque esta opción, AOP hará que el encabezado del Informe Interactivo/Cuadrícula en Excel sea un filtro.

II/CI: Utilice el Informe Guardado en lugar del Informe en la Sesión - [IR/IG: Use Saved Report instead of Report in Session] Si quiere asegurarse de llamar siempre a un Informe Interactivo/Cuadrícula, sin tener en cuenta lo que la persona está haciendo con él, puede marcar esta casilla y se tomará el Informe Interactivo mencionado (guardado). p.ej. ir1|my_saved_report estaría en tu origen.

II/CI: Repetición de Encabezado en cada Página - [IR/IG: Use Saved Report instead of Report in Session] Cuando la tabla abarca varias páginas, la fila del encabezado se repetirá en cada página.

3.5.7 Nombre de Archivo de Salida [Solo en el Plugin de Proceso]

El nombre del archivo puede ser una cadena codificada o referenciar un elemento APEX. No es necesario que incluya la extensión del archivo. Si se define una extensión de archivo que es diferente al tipo de salida seleccionado, se agregará una nueva extensión al nombre del archivo. Vea además cómo especificar el nombre de archivo de salida en el plugin de Acción Dinámica (Init PL/SQL Code).

Ejemplos de Nombres de Archivos

Estático: mi_archivo (my_file)

Elemento APEX: &P1_FILENAME.

3.5.8 Código Init PL/SQL (Solo en el plugin de Acción Dinámica)

Puede definir variables globales del aop_api3_pkg en esta área.

Por ejemplo, puede establecer el nombre del archivo de salida o una fuente de texto:

aop_api3_pkg.g_output_filename      := 'output';
aop_api3_pkg.g_output_filename      := v('P1_FILENAME');
aop_api3_pkg.g_rpt_header_font_size := '12';

3.5.9 Tipo de Salida

Las opciones disponibles incluyen:

3.5.10 Salida a

Las opciones disponibles incluyen:

Navegador - [Browser]

El navegador descargará el archivo a su carpeta de Descargas.

Procedimiento - [Procedure]

Esta opción llamará a un procedimiento en un formato específico, p.ej. send_email_prc. Esta opción es útil en caso de que no necesite el archivo en su propio disco duro, pero por ejemplo desea enviar el documento automáticamente. En ese caso, puede crear un procedimiento que agregue el documento generado como un archivo adjunto a su apex_mail.send.

En la base de datos, el procedimiento debe tener los siguientes parámetros:

procedure send_email_prc( p_output_blob in blob, p_output_filename in varchar2, p_output_mime_type in varchar2)

Procedimiento y Navegador - [Procedure and Browser]

Esta opción le permite llamar primero a un procedimiento y luego descargar el archivo a su disco duro. Un ejemplo es cuando primero desea almacenar el documento generado en una tabla antes de dejar que el navegador lo descargue.

Región en Línea (Solo pdf/html/md) - [Inline Region (pdf/html/md only)]

If you want to output a PDF in a certain region or as a pop-up modal dialog, use this option. See section: 2.3.1.9 for more info.

Directorio (en el servidor AOP) - [Directory (on AOP Server)]

Guarde el archivo en un directorio especificado con g_output_directory. El directorio predeterminado en el servidor AOP es outputfiles. Si apunta esto a un directorio en un servidor compartido o a un directorio conocido por Google Drive o Dropbox, puede generar y compartir documentos fácilmente. Tenga en cuenta que el servidor AOP debe habilitar esta opción utilizando el argumento --enable_save. No hace falta decir que esta opción no está disponible mientras se usa la suscripción a la nube.

4 PL/SQL API

4.1 Pre-requisitos

APEX 5.0.4 o superior debe instalarse en la base de datos ya que la API PL/SQL usa algunos paquetes que vienen con APEX, p.ej. apex_json

4.2 Instalar en la Base de Datos

Vaya a SQL Plus, SQLcl, SQL Developer o SQL Workshop y asegúrese de que existan los siguientes paquetes aop_api3_pkg and aop_plsql3_pkg. Como parte de la instalación, esos paquetes deberían haberse compilado.

4.3 Cómo Utilizarlo

Puede llamar a AOP directamente desde PL/SQL. APEX Office Print viene con dos formas diferentes de llamar a AOP; un paquete es aop_api3_pkg que también se utiliza detrás de escena en el plugin APEX y el otro en aop_plsql3_pkg. aop_plsql3_pkg es especialmente útil cuando solo quiere hacer la llamada al plugine del servidor AOP o a la nube.

Junto a los dos paquetes anteriores, también ofrecemos dos paquetes adicionales que muestran cómo hacer las llamadas pl/sql. Vea los paquetes aop_sample3_pkg y aop_test3_pkg.

4.4 Parámetros

aop_api3_pkg

Variables globales que se pueden establecer

-- Call to AOP
g_proxy_override          varchar2(300) := null;  -- null=proxy defined in the application attributes
g_transfer_timeout        number(6)     := 1800;  -- default of APEX is 180
g_wallet_path             varchar2(300) := null;  -- null=defined in Manage Instance > Instance Settings
g_wallet_pwd              varchar2(300) := null;  -- null=defined in Manage Instance > Instance Settings
g_output_filename         varchar2(100) := null;  -- output
g_language                varchar2(2)   := 'en';  -- Language can be: en, fr, nl, de
g_logging                 clob          := '';    -- ability to add your own logging: e.g. "request_id":"123", "request_app":"APEX", "request_user":"RND"
g_debug                   varchar2(10)  := null;  -- set to 'Local' when only the JSON needs to be generated, 'Remote' for remore debug
g_debug_procedure         varchar2(4000):= null;  -- when debug in APEX is turned on, next to the normal APEX debug, this procedure will be called
                                                  -- e.g. to write to your own debug table. The definition of the procedure needs to be the same as aop_debug
-- AOP settings for Interactive Report (see also Printing attributes in IR)
g_rpt_header_font_name    varchar2(50)  := '';    -- Arial - see https://www.microsoft.com/typography/Fonts/product.aspx?PID=163
g_rpt_header_font_size    varchar2(3)   := '';    -- 14
g_rpt_header_font_color   varchar2(50)  := '';    -- #071626
g_rpt_header_back_color   varchar2(50)  := '';    -- #FAFAFA
g_rpt_header_border_width varchar2(50)  := '';    -- 1 ; '0' = no border
g_rpt_header_border_color varchar2(50)  := '';    -- #000000
g_rpt_data_font_name      varchar2(50)  := '';    -- Arial - see https://www.microsoft.com/typography/Fonts/product.aspx?PID=163
g_rpt_data_font_size      varchar2(3)   := '';    -- 14
g_rpt_data_font_color     varchar2(50)  := '';    -- #000000
g_rpt_data_back_color     varchar2(50)  := '';    -- #FFFFFF
g_rpt_data_border_width   varchar2(50)  := '';    -- 1 ; '0' = no border
g_rpt_data_border_color   varchar2(50)  := '';    -- #000000
g_rpt_data_alt_row_color  varchar2(50)  := '';    -- #FFFFFF for no alt row color, use same color as g_rpt_data_back_color
-- Call to URL data source
g_url_username            varchar2(300) := null;
g_url_password            varchar2(300) := null;
g_url_proxy_override      varchar2(300) := null;
g_url_transfer_timeout    number        := 180;
g_url_body                clob          := empty_clob();
g_url_body_blob           blob          := empty_blob();
g_url_parm_name           apex_application_global.vc_arr2; --:= empty_vc_arr;
g_url_parm_value          apex_application_global.vc_arr2; --:= empty_vc_arr;
g_url_wallet_path         varchar2(300) := null;
g_url_wallet_pwd          varchar2(300) := null;
-- IP Printer support
g_ip_printer_location     varchar2(300) := null;
g_ip_printer_version      varchar2(300) := '1';
g_ip_printer_requester    varchar2(300) := nvl(apex_application.g_user, USER);
g_ip_printer_job_name     varchar2(300) := 'AOP';
-- Convert characterset
g_convert                 varchar2(1)  := 'N';        -- set to Y if you want to convert the JSON that is send over; necessary for Arabic support
g_convert_source_charset  varchar2(20) := null;       -- default of database 
g_convert_target_charset  varchar2(20) := 'AL32UTF8';  
-- Output
g_output_directory        varchar2(200) := '.';       -- set output directory on AOP Server
                                                    -- if . is specified the files are saved in the default directory: outputfiles

Llamada de Función

function plsql_call_to_aop( p_data_type in varchar2 default c_source_type_sql, p_data_source in clob, p_template_type in varchar2 default c_source_type_apex, p_template_source in clob, p_output_type in varchar2, p_output_filename in out nocopy varchar2, p_output_type_item_name in varchar2 default null, p_output_to in varchar2 default null, p_procedure in varchar2 default null, p_binds in wwv_flow_plugin_util.t_bind_list default c_binds, p_special in varchar2 default null, p_aop_remote_debug in varchar2 default 'No', p_output_converter in varchar2 default null, p_aop_url in varchar2, p_api_key in varchar2, p_app_id in number default null, p_page_id in number default null, p_user_name in varchar2 default null, p_init_code in clob default 'null;', p_output_encoding in varchar2 default c_output_encoding_raw, p_failover_aop_url in varchar2 default null, p_failover_procedure in varchar2 default null) return blob;

Tenga en cuenta que algunos otros procedimientos y funciones están disponibles en el paquete que podrían ser útiles.

aop_plsql3_pkg

function make_aop_request( p_aop_url in varchar2 default g_aop_url, p_api_key in varchar2 default g_api_key, p_json in clob, p_template in blob, p_output_encoding in varchar2 default 'raw', -- change to raw to have binary, change to base64 to have base64 encoded p_output_type in varchar2 default null, p_output_filename in varchar2 default 'output', p_aop_remote_debug in varchar2 default 'No') return blob;

4.5 Ejemplo

Ejemplo con aop_api3_pkg

declare
  l_binds           wwv_flow_plugin_util.t_bind_list;
  l_return          blob;
  l_output_filename varchar2(100) := 'output';
begin
  -- define bind variables
  l_binds(1).name := 'p_id';
  l_binds(1).value := '1';

  l_return := aop_api3_pkg.plsql_call_to_aop (
                p_data_type       => 'SQL',
                p_data_source     => q'[
                  select
                    'file1' as "filename",
                    cursor(
                      select
                        c.cust_first_name as "cust_first_name",
                        c.cust_last_name as "cust_last_name",
                        c.cust_city as "cust_city",
                        cursor(select o.order_total as "order_total",
                                      'Order ' || rownum as "order_name",
                                  cursor(select p.product_name as "product_name",
                                                i.quantity as "quantity",
                                                i.unit_price as "unit_price", APEX_WEB_SERVICE.BLOB2CLOBBASE64(p.product_image) as "image"
                                           from demo_order_items i, demo_product_info p
                                          where o.order_id = i.order_id
                                            and i.product_id = p.product_id
                                        ) "product"
                                 from demo_orders o
                                where c.customer_id = o.customer_id
                              ) "orders"
                      from demo_customers c
                      where customer_id = :p_id
                    ) as "data"
                  from dual
                ]',
                p_template_type   => 'SQL',
                p_template_source => q'[
                   select template_type, template_blob
                    from aop_template
                   where id = 1
                ]',
                p_output_type     => 'docx',
                p_output_filename => l_output_filename,
                p_binds           => l_binds,
                p_aop_url         => 'http://www.apexofficeprint.com/api/',
                p_api_key         => '1C511A58ECC73874E0530100007FD01A',
                p_app_id          => 232);
end;

Ejemplo con aop_plsql3_pkg

declare
  l_template        blob;
  l_output_file     blob;
begin
  select template_blob
    into l_template
    from aop_template
   where id = 1;

  l_output_file := aop_plsql3_pkg.make_aop_request(
                     p_json        => '[{ "filename": "file1", "data": [{ "cust_first_name": "APEX Office Print" }] }]',
                     p_template    => l_template,
                     p_output_type => 'docx',
                     p_aop_remote_debug => 'Yes');
end;

En aop_sample3_pkg encontrará los ejemplos anteriores y puede ejecutarlos con el siguiente comando:

begin aop_sample3_pkg.call_aop_plsql3_pkg; aop_sample3_pkg.call_aop_api3_pkg; end;

Tenga en cuenta que hay más ejemplos en aop_sample3_pkg, por lo que vale la pena verificarlo.

5 Llamada Manual (REST)

5.1 Descripción General

Detrás de escena, el plugin APEX está creando un archivo JSON que se enviará al servidor AOP. A continuación encontrará más detalles sobre la estructura JSON que se utiliza. Al comprender esta estructura JSON, puede interactuar manualmente con el servidor AOP en caso de que desee codificar en PL/SQL u otros idiomas.

5.2 Archivo JSON

El archivo JSON es un archivo que sigue la estructura JSON estándar (http://json.org/).

Este archivo JSON contiene un objeto JSON, lo que significa que comienza con { y termina con }. Este objeto JSON contiene cuatro objetos JSON obligatorios llamados "template", "output", "files", "api_key" y algunos objetos opcionales "versión", "logging", "apex_version", "aop_remote_debug" e "ipp". El propósito de cada objeto ahora será explicado.

5.2.1 El objeto "version"

Este objeto contiene la versión del formato AOP JSON utilizado. La versión actual es 3.4 y hacia atrás por lo tanto es opcional. Esto se usará para futuras actualizaciones y si la versión más nueva no es compatible con versiones anteriores.

5.2.2 El objeto "template"

Este objeto tiene la información necesaria sobre la plantilla. Contiene:

JSON Explicación
"file" Este contiene la plantilla que se utilizará, codificada en base64.
"filename" Esta opción es para usuarios locales. La plantilla definida por este objeto se usará para el procesamiento. Tenga en cuenta que el nombre de archivo contiene una ruta relativa desde donde se ejecuta el servidor (o la carpeta/directorio que contiene la aplicación) o una ruta absoluta.
"template_type" Esto indica qué tipo de plantilla se está utilizando. Debe ser "docx", "pptx", "xlsx", "html" o "md".
"html_template_content" Desde AOP 3.4, es posible pasar html como plantilla. Esto es equivalente a usar la etiqueta {_html} en word para crear la plantilla que luego se pasa nuevamente al AOP con los datos para la representación.
"orientation" nada o "landscape". Si se proporciona landscape, el contenido de la plantilla html se representará en una plantilla word A4 horizontal. Solo se tiene en cuenta cuando se proporciona html_template_content. Si los objetos "file" y "filename" no están presentes en el objeto "template", entonces el servidor responderá con un archivo de plantilla personalizado "template_type" creado a partir de este archivo JSON dado. Actualmente, solo admite la generación de plantillas de Word, Excel y Powerpoint.

5.2.3 El objeto "output"

Este objeto tiene la información necesaria para producir un archivo de salida del archivo JSON dado. Contiene:

JSON Explicación
"output_type" Esto indica qué tipo de tipo de archivo de salida se requiere. Puede ser el mismo que template_type ("docx", "pptx", "xlsx", "html", "md"), "pdf" o cualquier otro archivo de salida compatible con libreoffice/openoffice. Predeterminado: lo mismo que template_type.
"output_encoding" Esto indica qué tipo de codificación de salida se desea para el archivo de salida. Debe ser "raw" o "base64".
"output_converter" Esto indica qué software se debe usar para convertir a pdf. El servidor ApexOfficePrint usa LibreOffice. Los usuarios locales pueden usar MS Office pero primero tendrán que hacer algunas configuraciones. Valores disponibles: "officetopdf" (solo Windows) o "libreoffice" (Windows, Linux, OSX)

5.2.3 "api_key"

El valor de esta clave es la clave api dada por ApexOfficePrint. Solo aplicable para usuarios del servicio.

5.2.4 Matriz "file"

Esta matriz contiene los datos que se usarán para la plantilla dada. Si esta matriz contiene más de un objeto, los archivos de salida, que se generan utilizando la misma plantilla para cada elemento, se devolverán en un archivo zip. Esta matriz contiene objetos JSON con los siguientes campos:

JSON Explicación
"filename" Este campo contiene el nombre del archivo de salida.
"data" Esta matriz (que contiene un objeto) u objeto, contiene los datos que se reemplazarán en la plantilla.

Ejemplo que muestra un archivo JSON básico que debe rellenarse con datos:

{
    "template": {
           "filename"               :"template.docx",
           "template_type"          :"docx"
    },
    "output": {
           "output_encoding"        :"raw",
           "output_type"            :"docx"
    },
    "files": [{
             "filename"             :"file1",
             "data"                 : [{...}]
    }]
}

5.2.5 El objeto "logging"

Cuando se inicia AOP con --enable_printlog, creará un archivo en el servidor llamado server_printjob.log. Puede agregar información de registro adicional junto al AOP que está registrando de forma predeterminada, agregando claves y valores adicionales en el objeto de registro.

Por ejemplo:

    "logging": {
        "template_filename": "AOP template",
        "output_filename": "output.docx"
    }

5.2.6 El objeto "ipp"

AOP admite imprimir directamente en una impresora IP utilizando esta configuración. Si su impresora IPP es compatible con archivos PDF, sus documentos serán convertidos a pdf y enviados a la impresora IPP. Si su impresora no es compatible con PDF y es compatible con Postscript, entonces el PDF generado es convertido a pdf usando pdftops. Necesita descargar las herramientas de xpdf desde: https://www.xpdfreader.com/download.html. Asegúrese de que el pdftops binario esté en la variable PATH. Puede descargar ejecutables desde apexofficeprint.com para verificar si su impresora IPP es compatible con PDF/postscript. La estructura es:

    "ipp": {
        "location": "http://10.0.14.223:631/",
        "version": "1.1",
        "requester": "YOUR NAME",
        "job_name": "AOP"
    }

6 Plantillas

Las plantillas son archivos de oficina estándar en los que las etiquetas se reemplazarán por datos estructurados del archivo JSON. Estas etiquetas están bastante estandarizadas para .docx, .pptx o .xlsx, sin embargo, existen algunas diferencias sutiles. Todos son capaces de manejar expresiones de JavaScript angular, sobre las cuales seguirán algunos de los conceptos básicos.

6.0 Descripción de Etiqueta (Tag)

En la tabla a continuación se incluye una descripción general de las etiquetas disponibles y su soporte en Word, Excel y PowerPoint, respectivamente. Para obtener más información sobre cada etiqueta, consulte las secciones que siguen.

Tag Word Excel PowerPoint HTML Markdown
{data_string}
{data_string_with_cell_markup$} No No No
{-labels} No No No No
{_htmlcontent} No No Sí (por defecto) Sí (por defecto)
{!slide_loop} No No No No
{!excelsheet_loop} No No No No
{#data_loop} … {/data_loop} No
{=table_row_loop} … {/table_row_loop} No No No No
{%imageKey}
{&#124;barcode} No No
{&#124;qrcode} No No
{$chart} No No No
{&interactive_report} No No No
{&interactive_grid&} No No No
{&lt;rightToLeft} No es Necesario No es Necesario No es Necesario No es Necesario
{+footnote} No No No No
{*hyperlink} No No

Nota: las etiquetas no pueden comenzar con un número y deben comenzar con un carácter alfabético (a-z, A-Z)

6.1 Plantilla Word (docx)

Estas plantillas pueden contener las siguientes etiquetas:

6.1.1 Etiquetas {data_string}

Use esta etiqueta, {data_string}, será reemplazado por el valor de la clave "data_string" en el archivo JSON.

6.1.1.1 Ejemplo Data string

Dado el archivo JSON con el siguiente contenido:

    {
        "template": {
               "filename"               :"template.docx",
               "template_type"          :"docx"
        },
        "output": {
               "output_encoding"        :"raw",
               "output_type"            :"docx"
        },
        "files": [{
                 "filename"             :"output",
                 "data": [{
                         "first_name"   :"DemoName",
                         "last_name"    :"DemoLastName",
                         "city"         :"DemoCity"
                  }]
        }]
    }

y template.docx con el siguiente contenido:

{last_name} {first_name} {city}

resultará en:

DemoLastName DemoName DemoCity

Dado que la plantilla y los objetos de salida de json no cambiarán, estos se omitirán en los ejemplos que figuran a continuación.

6.1.2 Etiquetas {%imagekey}

Esta etiqueta es igual que {data_string}, pero en su lugar, reemplazada por una cadena, esta etiqueta se reemplaza por una imagen que se coloca en el valor de la clave "imagekey" después de la codificación base64. Tenga en cuenta que imagekey es solo una variable. Una etiqueta de imagen se representa con "%" después del corchete. También puede especificar un ancho fijo y la altura agregando los siguientes valores "imagekey_width" y "imagekey_height". Si desea escalar su imagen proporcionalmente, puede usar las etiquetas "imagekey_max_width" y "imagekey_max_height". Se crea un ejemplo en la aplicación de ejemplo AOP que muestra cómo funciona. La imagen clave es pic, por lo que podemos usar pic_max_width por ejemplo.

6.1.2.1 Ejemplo etiqueta Image

Reemplace /...code..../ por la cadena codificada en base64 de la imagen

    {
        ...
        "files":[{
                 "filename"        :"output",
            "data":[{
                  "product_name"   :"Wallet",
                  "price"          :"$500.00",
                  "pic"            :"/...code..../",
                  "pic_max_width"  : 100,
                  "pic_max_height" : 100
            }]
        }]
    }

con plantilla:

Product Image Price
{product_name} {%pic} {price}

resultará en:

Consejo: en caso de que quiera hacer que sus imágenes sean iguales en tamaño, puede usar PL/SQL para cambiar el tamaño de sus imágenes. Aquí hay un ejemplo para poner el tamaño de la imagen a un máximo de 200px.

declare
  l_img blob;
begin
  select image
    into l_img
    from my_table
   where id = 1 for update;
  ordsys.ordimage.process(l, 'maxscale=200 200');
  update my_table
     set image = l
   where id = 1;
end;

6.1.3 Etiquetas {|barcode} / {|qrcode}

Esta etiqueta será reemplazada por el código de barras o QR creado con los datos de la clave llamada "barcode" o "qrcode". Tenga en cuenta que estas también son variables. Las etiquetas de código de barras o qrcode están representadas por | después de las llaves. Si esta etiqueta se encuentra en el documento, debe haber claves de soporte adicionales que contengan las opciones para estas etiquetas. Estas opciones son:

  1. key_type, p.ej. "barcode_type" si la clave utilizada es "barcode".    Este campo contiene el tipo de código de barras requerido. Las opciones son:      "codabar"      "code128"      "code39"      "ean13"      "upc-a"      "upc-e"      "qrcode"

  2. key_height, p.ej. "barcode_height" si la clave utilizada es "barcode".    Este campo contiene la altura de la imagen generada.    El valor predeterminado es 200 para QR y 50 para el resto.

  3. key_width, p.ej. "barcode_width" si la clave utilizada es "barcode".    Este campo contiene el ancho de la imagen generada. El valor predeterminado es 200.

  4. key_version (sólo para código QR), p.ej. "qrcode_version" si la clave utilizada es "qrcode". Este campo contiene la versión del código QR que se utilizará. Valor predeterminado 4.    Información Adicional: http://www.qrcode.com/en/about/version.html

  5. key_errorcorrectlevel (sólo para código QR), p.ej. "qrcode_errorcorrectlevel" si la clave utilizada es "qrcode". Este campo contiene el nivel de que el código QR debe ser recuperable.    Las opciones son:    "L" (hasta 7% de daño)    "M" (hasta 15% de daño)    "Q" (hasta 25% de daño)    "H" (hasta 30% de daño)    Información Adicional: http://www.qrcode.com/en/about/error_correction.html

  6. key_cellsize (sólo para código QR), p.ej. "qrcode_cellsize". Este campo contiene el tamaño de punto de un módulo.    El valor predeterminado es 4.    Información Adicional: http://www.qrcode.com/en/howto/cell.html

6.1.3.1 Ejemplo etiqueta Barcode

Dado el archivo JSON:

     {
        ...
        "files":[{
                 "filename"           :"output",
            "data":[{
                  "product_name"      :"Wallet",
                  "product_code"      :"18965478321456",
                  "product_code_type" :"ean13",
                  "product_link"      :"https://www.google.be/search?q=wallet",
                  "product_link_type" :"qrcode"
            }]
        }]
    }

y la plantilla como:

resultará en:

Para los códigos de barras, en lugar de hacer lo anterior, también puede optar por instalar una fuente de código de barras, por ejemplo, Free 3of9 or http://www.dafont.com/3of9-barcode.font. Las fuentes de código de barras son más efectivas que las imágenes. Consulte la otra sección para obtener más información sobre el idioma y el soporte de fuentes.

6.1.4 Etiquetas {$chart}

Esta etiqueta será reemplazada por el gráfico creado usando los datos de la clave llamada "chart". Tenga en cuenta que esta clave es una variable. Los gráficos están representados por $ después de la llave. Si esta etiqueta se encuentra en el documento, el objeto de gráfico en el json debe seguir cierta estructura. Primero, un objeto opcional con clave "opciones" para determinar las opciones para el gráfico. Las opciones predeterminadas son:

    defaultOptions = {
            width: 5486400 / 9525, // width of the chart
            height: 3200400 / 9525, // height of the chart
            grid: true, // if a grid should be shown
            border: true, // if a border should be shown
            title: false,
            legend: {
                showLegend: true, // if the legend should be shown
                position: 'r'  // 'l' for left, 'r' right, 'b' bottom, 't' top
            },
            axis: {
                x: {
                    orientation: 'minMax', // or "maxMin"
                    min: undefined, // a specific number
                    max: undefined, // a specific number
                    type: undefined, // or "date"
                    date: { //date options
                        format: 'unix',
                        code: 'mm/yy',
                        unit: 'months',
                        step: '1'
                    },
                    showValues: true //options to disable showing the values in axis

                },
                y: {
                    orientation: 'minMax',
                    mix: undefined,
                    max: undefined,
                    showValues: true // options to disable showing the values in axis
                 },
                y2: { //If using multiple charts and axis on the right side
                orientation: 'minMax',
                mix: undefined,
                max: undefined,
                showValues: true // options to disable showing the values in axis
                }
            }
        }

En segundo lugar, el tipo de gráfico debe determinarse mediante la tecla "type". Se admite la generación de los siguientes tipos de gráficos:

6.1.4.1 Línea - [Line]

Este es un gráfico normal donde los datos están conectados con líneas. Se pueden generar múltiples líneas. La clave del gráfico debe contener dentro una matriz con el nombre "lines" con los datos de las líneas que se deben generar y el nombre de la línea. P.ej.:

    "chart": {
            "lines": [
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "4.3"
                        },
                        {
                            "x": "day 2",
                            "y": "2.5"
                        },
                        {s
                            "x": "day 3",
                            "y": "3.5"
                        }
                    ],
                    "name": "line 1"
                },
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "2.4"
                        },
                        {
                            "x": "day 2",
                            "y": "4.4"
                        },
                        {
                            "x": "day 3",
                            "y": "1.8"
                        }
                    ],
                    "name": "line 2"
                }
            ],
            "type": "line"
        }

resultando en:

6.1.4.2 Barra - [bar]

Para generar el gráfico de barras, el objeto de gráfico debe contener dentro una matriz con el nombre "bars". Esta matriz contiene los objetos con datos sobre la barra y el nombre de la barra. Por ejemplo, dado lo siguiente:

    ...
    "chart": {
        "bars": [
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "4.3"
                    },
                    {
                        "x": "day 2",
                        "y": "2.5"
                    },
                    {
                        "x": "day 3",
                        "y": "3.5"
                    }
                ],
                "name": "bar 1"
            },
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "2.4"
                    },
                    {
                        "x": "day 2",
                        "y": "4.4"
                    },
                    {
                        "x": "day 3",
                        "y": "1.8"
                    }
                ],
                "name": "bar 2"
            }
        ],
        "type": "bar"
    }
    ...

resultando en:

El gráfico de barras simple (Single Bar) se genera de la siguiente manera:

    ...
    "chart": {
        "bars": [
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "4.3"
                    },
                    {
                        "x": "day 2",
                        "y": "2.5"
                    },
                    {
                        "x": "day 3",
                        "y": "3.5"
                    }
                ],
                "name": "bar 1"
            }
        ],
        "type": "bar"
    }
    ...

resultando en:

6.1.4.3 barStacked

Esto es como un gráfico de barras, pero las barras de la misma categoría se apilarán. Por ejemplo, dado lo siguiente:

     ...
    "chart": {
        "bars": [
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "4.3"
                    },
                    {
                        "x": "day 2",
                        "y": "2.5"
                    },
                    {
                        "x": "day 3",
                        "y": "3.5"
                    }
                ],
                "name": "bar 1"
            },
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "2.4"
                    },
                    {
                        "x": "day 2",
                        "y": "4.4"
                    },
                    {
                        "x": "day 3",
                        "y": "1.8"
                    }
                ],
                "name": "bar 2"
            }
        ],
        "type": "barStacked"
    }
    ...

resultando en:

6.1.4.4 barStackedPercent

Esto es como un gráfico de barras apiladas, pero el eje x estará expresado en porcentaje. Por ejemplo, dado lo siguiente:

     ...
    "chart": {
        "bars": [
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "4.3"
                    },
                    {
                        "x": "day 2",
                        "y": "2.5"
                    },
                    {
                        "x": "day 3",
                        "y": "3.5"
                    }
                ],
                "name": "bar 1"
            },
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "2.4"
                    },
                    {
                        "x": "day 2",
                        "y": "4.4"
                    },
                    {
                        "x": "day 3",
                        "y": "1.8"
                    }
                ],
                "name": "bar 2"
            }
        ],
        "type": "barStacked"
    }
    ...

resultando en:

6.1.4.5 Columna - [column]

Esto producirá un gráfico de columnas normal. El objeto gráfico debe contener dentro una matriz con el nombre "columns" con objetos que contienen los datos y el nombre de la columna. P.ej.:

         "chart": {
            "columns": [
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "4.3"
                        },
                        {
                            "x": "day 2",
                            "y": "2.5"
                        },
                        {
                            "x": "day 3",
                            "y": "3.5"
                        }
                    ],
                    "name": "column 1"
                },
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "2.4"
                        },
                        {
                            "x": "day 2",
                            "y": "4.4"
                        },
                        {
                            "x": "day 3",
                            "y": "1.8"
                        }
                    ],
                    "name": "column 2"
                }
            ],
            "type": "column"
        }

resultando en:

Se puede generar un gráfico simple de columnas con el siguiente json:

        "chart": {
            "columns": [
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "4.3"
                        },
                        {
                            "x": "day 2",
                            "y": "2.5"
                        },
                        {
                            "x": "day 3",
                            "y": "3.5"
                        }
                    ],
                    "name": "column 1"
                }
            ],
            "type": "column"
        }

resultando en:

6.1.4.6 columnStacked

Esto producirá un gráfico de columnas apiladas. El objeto gráfico debe contener dentro una matriz con el nombre "columns" con objetos que contienen los datos y el nombre de la columna. P.ej:

         "chart": {
            "columns": [
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "4.3"
                        },
                        {
                            "x": "day 2",
                            "y": "2.5"
                        },
                        {
                            "x": "day 3",
                            "y": "3.5"
                        }
                    ],
                    "name": "column 1"
                },
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "2.4"
                        },
                        {
                            "x": "day 2",
                            "y": "4.4"
                        },
                        {
                            "x": "day 3",
                            "y": "1.8"
                        }
                    ],
                    "name": "column 2"
                }
            ],
            "type": "columnStacked"
        }

resultando en:

6.1.4.7 columnStackedPercent

Esto generará un gráfico de porcentajes apilados de columnas. El objeto gráfico debe contener dentro una matriz con el nombre "columns" con objetos que contienen los datos y el nombre de la columna. P.ej:

        "chart": {
            "columns": [
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "4.3"
                        },
                        {
                            "x": "day 2",
                            "y": "2.5"
                        },
                        {
                            "x": "day 3",
                            "y": "3.5"
                        }
                    ],
                    "name": "column 1"
                },
                {
                    "data": [
                        {
                            "x": "day 1",
                            "y": "2.4"
                        },
                        {
                            "x": "day 2",
                            "y": "4.4"
                        },
                        {
                            "x": "day 3",
                            "y": "1.8"
                        }
                    ],
                    "name": "column 2"
                }
            ],
            "type": "columnStackedPercent"
        }

resultando en:

6.1.4.8 pie

Esto producirá un gráfico circular. El objeto gráfico debe contener dentro una matriz con el nombre "pies" con un elemento que contiene los datos y el nombre del gráfico circular. P.ej:

         "chart": {
            "pies": [
                {
                    "data": [
                        {
                            "x": "Order 1",
                            "y": 1890
                        },
                        {
                            "x": "Order 2",
                            "y": 2380
                        },
                        {
                            "x": "Order 3",
                            "y": 1640
                        },
                        {
                            "x": "Order 4",
                            "y": 1090
                        },
                        {
                            "x": "Order 5",
                            "y": 950
                        },
                        {
                            "x": "Order 6",
                            "y": 1515
                        },
                        {
                            "x": "Order 7",
                            "y": 905
                        },
                        {
                            "x": "Order 8",
                            "y": 1060
                        },
                        {
                            "x": "Order 9",
                            "y": 730
                        },
                        {
                            "x": "Order 10",
                            "y": 870
                        }
                    ],
                    "name": "pie 1"
                }
            ],
            "type": "pie"
        }

resultando en:

6.1.4.9 radar

Esto producirá un gráfico de radar. El objeto de gráfico debe contener dentro una matriz con el nombre "radars" con un elemento que contiene los datos y el nombre del gráfico de radar. P.ej:

         "chart": {
            "radars": [
                {
                    "data": [
                        {
                            "x": "Order 1",
                            "y": 1240
                        },
                        {
                            "x": "Order 2",
                            "y": 380
                        },
                        {
                            "x": "Order 3",
                            "y": 840
                        },
                        {
                            "x": "Order 4",
                            "y": 490
                        },
                        {
                            "x": "Order 5",
                            "y": 1230
                        }
                    ],
                    "name": "radar 1"
                }
            ],
            "type": "radar"
        }
        }

resultando en:

6.1.4.10 area

Esto producirá un gráfico de área. El objeto de gráfico debe contener una matriz dentro con el nombre "areas" con un elemento que contiene los datos y el nombre del gráfico de área. P.ej:

     "chart": {
        "areas": [
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "4.3"
                    },
                    {
                        "x": "day 2",
                        "y": "2.5"
                    },
                    {
                        "x": "day 3",
                        "y": "3.5"
                    }
                ],
                "name": "area 1"
            },
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "2.4"
                    },
                    {
                        "x": "day 2",
                        "y": "4.4"
                    },
                    {
                        "x": "day 3",
                        "y": "1.8"
                    }
                ],
                "name": "area 2"
            }
        ],
        "type": "area"
    }

resultando en:

6.1.4.11 Dispersión [scatter]

Esto producirá un diagrama de dispersión. El objeto de gráfico debe contener una matriz denominada "scatters" con un elemento que contiene los datos y el nombre del gráfico de dispersión. Similar a los gráficos anteriores, sin embargo, el eje x debe contener solo números.

6.1.4.13 Burbujas [bubble]

Esto producirá un gráfico de burbujas. El objeto gráfico debe contener una matriz dentro con el nombre "bubbles" con un elemento que contiene los datos y el nombre del diagrama de burbujas. Sin embargo, es similar a los gráficos anteriores, los datos ahora pueden contener un valor de tamaño para determinar el tamaño de una burbuja. Ejemplo JSON:

{
    "chart": {
        "bubbles": [
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "4.3",
                        "size":"1"
                    },
                    {
                        "x": "day 2",
                        "y": "2.5",
                        "size":"3"
                    },
                    {
                        "x": "day 3",
                        "y": "3.5",
                        "size":"2"
                    }
                ],
                "name": "Bubble series 1"
            },
            {
                "data": [
                    {
                        "x": "day 1",
                        "y": "2.4",
                        "size":"4"
                    },
                    {
                        "x": "day 2",
                        "y": "4.4",
                        "size":"5"
                    },
                    {
                        "x": "day 3",
                        "y": "1.8",
                        "size":"1"
                    }
                ],
                "name": "Bubble series 2"
            }
        ],
        "type": "bubble"
    }
}

resultando en:

6.1.4.14 stock

Esto producirá un gráfico de acciones. El objeto gráfico debe contener una matriz dentro con el nombre "stocks" con un elemento que contiene los datos y el nombre del gráfico de acciones. Aquí en lugar del valor y, debe darse los valores de volumen, abrir, cerrar, alto y bajo. El formato del eje x también se puede dar. El eje x contiene la fecha que comienza usando la notación 1900, es decir, 1 representará el 1 de enero de 1900, [más información] (https://support.office.com/en-us/article/Change-the-date-system-format-or-two-digit-year-interpretation-aaa2159b-4ae8-4651-8bce-d4707bc9fb9f).

Ejemplo:

  {
          "chart": {
            "stocks": [
              {
                "data": [
                  {
                    "x": "1",
                    "volume": "70",
                    "open": "44",
                    "high": "55",
                    "low": "11",
                    "close": "25"
                  },
                  {
                    "x": "2",
                    "volume": "120",
                    "open": "25",
                    "high": "57",
                    "low": "12",
                    "close": "38"
                  },
                  {
                    "x": "3",
                    "volume": "150",
                    "open": "38",
                    "high": "57",
                    "low": "13",
                    "close": "50"
                  },
                  {
                    "x": "4",
                    "volume": "135",
                    "open": "50",
                    "high": "58",
                    "low": "11",
                    "close": "35"
                  },
                  {
                    "x": "5",
                    "volume": "148",
                    "open": "34",
                    "high": "58",
                    "low": "25",
                    "close": "43"
                  }
                ],
                "name": "s"
              }
            ],
            "type": "stock",
            "options":{
              "axis":{
                "x":{
                  "date":{
                    "unit":"days",
                    "step":1,
                    "code":"dd"
                  }
                }
              }
            }
          },
          "name": "Stocks"
        }

resultando en:

6.1.4.11 Combining Charts

Es posible combinar múltiples gráficos. Por ejemplo, una columna y un gráfico de líneas. Si se desea un segundo eje de valor en el lado derecho, entonces los valores se deben dar como y2 en lugar de y. El tipo debe ser "múltiple" y el gráfico debe contener una matriz dentro denminada "multiples" que contiene los diferentes gráficos definidos previamente. Es posible combinar más de 2 tipos de gráficos, pero solo puede haber dos ejes de valores. Un ejemplo se da a continuación:

     "chart": {
        "multiples": [
            {
                "columns": [
                    {
                        "data": [
                            {
                                "x": "day 1",
                                "y": "4.3"
                            },
                            {
                                "x": "day 2",
                                "y": "2.5"
                            },
                            {
                                "x": "day 3",
                                "y": "3.5"
                            }
                        ],
                        "name": "bar 1"
                    },
                    {
                        "data": [
                            {
                                "x": "day 1",
                                "y": "2.4"
                            },
                            {
                                "x": "day 2",
                                "y": "4.4"
                            },
                            {
                                "x": "day 3",
                                "y": "1.8"
                            }
                        ],
                        "name": "bar 2"
                    }
                ],
                "type": "column"
            },
            {
                "lines": [
                    {
                        "data": [
                            {
                                "x": "day 1",
                                "y2": "43"
                            },
                            {
                                "x": "day 2",
                                "y2": "25"
                            },
                            {
                                "x": "day 3",
                                "y2": "35"
                            }
                        ],
                        "name": "line 1"
                    },
                    {
                        "data": [
                            {
                                "x": "day 1",
                                "y2": "24"
                            },
                            {
                                "x": "day 2",
                                "y2": "44"
                            },
                            {
                                "x": "day 3",
                                "y2": "18"
                            }
                        ],
                        "name": "line 2"
                    }
                ],
                "type": "line"
            }
        ],
        "options": {
            "border": true,
            "grid": true,
            "height": 700,
            "legend": {
                "position": "r",
                "showLegend": true
            },
            "title": false,
            "width": 500
        },
        "type": "multiple"
    }       

resultando en:

6.1.5 Etiquetas {#data_loop} … {data_loop}

Usando la etiqueta de apertura {#data_loop} y la etiqueta de cierre {/data_loop}, podemos hacer un bucle dentro de la matriz JSON llamada "data_loop", lo que significa que los elementos que están dentro de las etiquetas se repetirán para cada elemento de la matriz. Nuevamente, al igual que en la etiqueta de imagen, "data_loop" es una variable. Una etiqueta de bucle se representa con "#" después del corchete.

6.1.5.1 Ejemplo General Data loop

Dado el archivo JSON con el siguiente contenido:

    {
        ...
        "files":[{
               "filename"           :"output",
                "data":[{
                       "people":[{
                              "first_name" :"DemoName1",
                              "last_name"  :"DemoLastName1",
                              "city"       :"DemoCity1"},
                       {
                              "first_name" :"DemoName2",
                              "last_name"  :"DemoLastName2",
                              "city"       :"DemoCity2"},
                       {
                              "first_name" :"DemoName3",
                              "last_name"  :"DemoLastName3",
                              "city"       :"DemoCity3"}
                       ]
                }]
        }]
    }

y template.docx con el siguiente contenido:

The name of the employees are: {#people}{first_name}{last_name} from city {city}. {/people}

will result in:

The name of the employees are: DemoName1 DemoLastName1 from City DemoCity1. DemoName2 DemoLastName2 from City DemoCity2. DemoName3 DemoLastName3 from City DemoCity3.

6.1.5.2 Ejemplo Bucle en Tabla

Usando los datos anteriores, si la plantilla se cambia a:

el resultado será:

6.1.5.3 Bucles con numeración

Usando los datos anteriores, si la plantilla se cambia a:

el resultado será:

6.1.5.4 Bucles con viñetas

Lo mismo se puede hacer con viñetas::

el resultado será:

6.1.6 Expresiones AngularJS simples

También se admiten expresiones angularJS simples que pueden realizar operaciones matemáticas simples.

Se puede encontrar una lista completa de expresiones angularJS en https://docs.angularjs.org/guide/expression.

6.1.6.1 Expresiones Simples

Expresiones como {num1 + num2} imprimirán la suma de num1 y num2. Se permiten divisiones, multiplicaciones, sumas y restas.

Si la clave dada tiene un valor booleano, entonces puede usar {#boolean key} ... {/boolean key} para imprimir el contenido dentro de las etiquetas si el valor de la clave booleana es verdadero. Para la negación se usa {^ boolean key}...{/boolean key}. El contenido dentro de estas etiquetas se imprimirá si la clave booleana tiene falso como valor o si la clave booleana no existe o si la clave booleana es una matriz vacía.

6.1.6.2 Comparación Cadena/Numero

También puede verificar el valor de las claves con {#key=='value'}...{/key=='value'}. El contenido dentro de las etiquetas solo se imprimirá si el valor de la clave es igual a "valor". ¡Observe aquí en {#key=='value'}, que se usan comillas simples rectas!

Los números también se pueden comparar de la misma manera que las cadenas {#key>;50}...{/key>;50}. El contenido dentro de las etiquetas solo se imprimirá si el valor de la clave es mayor que 50. Los siguientes operadores son compatibles: <,>,<=,>=,==,!=

6.1.6.3 Operador condicional y de comparación

Otra forma de comparar variables es la siguiente: {key=='value' ? key2:key3}. De esta forma, también pueden insertarse otras claves/variables. Esto imprimirá el valor de key2 si la expresión es verdadera y key3 si la expresión es falsa.

Posibles operadores condicionales son:

6.1.6.4 Ejemplo Condicional

Para el JSON dado en el ejemplo a continuación {currency=='EUR'?'€'+price:price+'$'} imprime €50 si es verdadero y 50$ si es falso y la variable de precio dada es 50.

Dado el archivo JSON con el siguiente contenido:

    {
        ...
                 "data":[{
                       "product":[{
                              "product_name" :"Business Shirt",
                              "quantity"     :3,
                              "unit_price"   :50,
                              "onstock"      :true,
                              "cur"          :"EUR"
                       },
                       {
                              "product_name" :"Trousers",
                              "quantity"     :3,
                              "unit_price"   :80,
                              "onstock"      :false,
                              "cur"          :"USD"
                       },
                       {
                              "product_name" :"Jacket",
                              "quantity"     :3,
                              "unit_price"   :15,
                              "onstock"      :true,
                              "cur"          :"USD"
                       },
                       {
                              "product_name" :"Blouse",
                              "quantity"     :3,
                              "unit_price"   :60,
                              "onstock"      :false,
                              "cur"          :"EUR"
                       }]
                }]
    }

y plantilla con el siguiente contenido:

resultando en:

6.1.7 Impresión de Etiquetas

AOP también proporciona una forma de imprimir las etiquetas en un documento de Word. Para hacerlo, puede crear un documento con etiquetas yendo a Opciones de Correspondencia y luego a Etiquetas. Complete las etiquetas en el campo de dirección y elija el tipo de etiqueta haciendo clic en la opción Etiqueta. Se puede generar un documento haciendo clic en Nuevo documento. Sin embargo, actualmente, si las etiquetas se están imprimiendo, esperamos que el documento solo contenga etiquetas y ninguna otra información, y que las claves de etiqueta no se usen más de una vez. Dado el archivo JSON:

    ...
        "data": {
            "labels": [
                {
                    "city": "city1",
                    "first_name": "firstname1",
                    "last_name": "lastname1",
                    "title": "Mr.",
                    "tracking_number_text": "TN49775377172",
                    "tracking_number": "TN49775377172",
                    "tracking_number_type": "code128",
                    "zip_code": 6981
                },
                ...
                {
                    "city": "city12",
                    "first_name": "firstname12",
                    "last_name": "lastname12",
                    "title": "Mr.",
                    "tracking_number_text": "TN49709864775",
                    "tracking_number": "TN49709864775",
                    "tracking_number_type": "code128",
                    "zip_code": 9740
                }
            ]
        }
    ...

y plantilla:

producirá:

Tenga en cuenta que en la primera celda necesita agregar la etiqueta {labels}. Ver también la aplicación de ejemplo.

6.1.8 Etiqueta HTML

Las etiquetas HTML también se pueden convertir a Word. La etiqueta que se debe usar es {_key}, por lo tanto, subrayado seguido de la clave que tiene contenido HTML en JSON. Las etiquetas que actualmente son compatibles son:


: in order to introduce breaks (newline)

..

: represents a paragraph .. : bold text .. : bold text .. : strike through .. : underline .. : italics

..

: heading 1

..

: heading 2

..

: heading 3

..

: heading 4
..
: heading 5
..
: heading 6 .. : subscript .. : superscript
    ..
: ordered list : unordered list
  • ..
  • : list item ..
    : table (including th, tr, td) .. : caption : image
     .. 
    : preformatted text

    <span style="..">..</span> : text between the span will have the style defined, background-color, color, font-size and font-family are supported.
    

    P. ej.: Dada la siguiente clave dentro de los datos:

        "htmlcontent": "<p>This is text coming from the database / session in HTML format.
        <br />It supports:
        </p>
        <ol>
        <li>Lists</li>
        <li><strong>Bold</strong></li>
        <li><em>Italic</em></li>
        <li><u>Underline</u></li>
        <li><s>Strikethrough</s></li>
        <li>Sub<sub>script</sub></li>
        <li><sup>Super</sup>script</li>
        <li><span style="color:#FF0000">Text Color</span></li>
        <li><span style="background-color:#FFFF00">Background Text Color</span>
        </li>
        </ol>
    
        <h1>Heading 1</h1>
        <h2>Heading 2</h2>
        <h3>Heading 3</h3>
        <h4>Heading 4</h4>
        <p>Normalt text with<span style="font-family:comic sans ms,cursive"> Font Change</span></p>
        <p><span style="font-family:courier new,courier,monospace">Code font</span>
        </p>"
    

    y la plantilla:

    producirá:

    6.1.9 Etiqueta Informe Interactivo (IR)

    {&interactive} será reemplazado en la plantilla dada por el informe interactivo que se ha seleccionado en APEX. Además del informe interactivo simple, hay otras tres opciones que se pueden seleccionar: Control Break, Group By, Pivot. Esos serán ilustrados a continuación. Tenga en cuenta que la etiqueta que se reemplaza es {&interactive}, independientemente de cuál de las opciones anteriores se seleccione en APEX. Para un ejemplo concreto, ver la sección 11.

    Division de Control: haciendo clic en Acciones y seleccionando División de Control, se puede seleccionar una o más columnas en las que se debiera dividir la tabla. Para fines de ilustración, supongamos que seleccionamos Cantidad.

    Esto divide la tabla en particiones según el valor de la columna seleccionada. Por lo tanto, las filas que comparten el mismo valor para Cantidad se agruparán en la misma partición. La tabla resultante se puede ver a continuación:

    Como nota final, esta opción también admite la aplicación de agregados en los datos de la tabla.

    Agrupar Por: Al hacer clic en Acciones y seleccionar Agrupar Por, se puede seleccionar una o más columnas en las que se deberían agrupar los datos de la tabla. Para fines de ilustración, supongamos que seleccionamos Cantidad. Además, se pueden aplicar una o más funciones en los datos de la tabla. En este ejemplo, solicitamos la suma del precio unitario para cada grupo.

    El resultado es una nueva tabla con una columna por cada columna seleccionada en la que los datos deben agruparse, y una columna por cada función seleccionada que se aplicará a los datos del grupo.

    La tabla resultante se puede ver a continuación:

    Además, se puede seleccionar una etiqueta y un formato personalizados para cada columna de función y se puede realizar una suma sobre los valores de cada columna de función.

    Pivot: Al hacer clic en Acciones y seleccionar Pivot, se le solicita al usuario que seleccione al menos una columna pivot, al menos una columna de fila y al menos una función sobre una columna en particular. Es importante tener en cuenta que la columna de fila, la columna de pivot y la columna de función deben ser diferentes. Para el ejemplo, seleccionamos Cantidad como columna dinámica, Nombre del producto como columna de fila y sumamos el Precio unitario como una función.

    La tabla resultante se puede ver a continuación:

    Las opciones adicionales admitidas en este caso son las mismas que en Agrupar Por.

    Gráfco: AOP también puede imprimir su vista Gráfico de informes interactivos directamente en su plantilla utilizando {\$interactive}.

    El resultado en Powerpoint se puede ver a continuación:

    Tenga en cuenta que este es un gráfico de PowerPoint nativo, por lo que puede adaptarlo, agrandarlo, cambiar colores, etc. directamente en Powerpoint.

    6.1.10 Múltiples Informes Interactivos en una plantilla

    En este caso, la plantilla debe tener etiquetas de la forma {&interactive_1},{&interactive_2} y estas etiquetas serán reemplazadas por los correspondientes informes interactivos. Se pueden seleccionar muchos informes interactivos dando sus identificadores estáticos en un orden particular (ir1,ir2,...) y es en ese orden que sus datos se insertarán en la plantilla. Por lo tanto, {&interactive _1} se reemplaza por los datos en el primer informe interactivo (Id estático:ir1) y de manera similar para {&interactive_2} que serán reemplazados por los datos en el segundo informe interactivo (Id estático :ir2) y así sucesivamente.

    El resultado se puede ver a continuación:

    6.1.11 Fondo de celda de la tabla

    Puede dar un fondo a una celda en una tabla en Word usando la columna seguida de _cell_background_color. La etiqueta en la plantilla debe terminar con $.

     cursor(select p.product_name as "product_name",
                                  i.quantity as "quantity",
                                  case
                                  when i.quantity between 1 and 2 then '#00FF00'
                                  when i.quantity between 2 and 3 then '#00FF00'
                                  else '#0000FF'
                                  end as "quantity_cell_background_color",
                                  i.unit_price as "unit_price"
                             from demo_order_items i, demo_product_info p
                            where o.order_id = i.order_id
                              and i.product_id = p.product_id
                          ) "backcolor"
    

    6.1.12 Etiqueta Right to Left

    En palabras al sustituir el contenido en lenguaje escrito de derecha a izquierda como árabe, la etiqueta {&rightToLeft} se puede utilizar para formatear correctamente el idioma. Si el contenido sustituto no contiene ningún carácter de idioma de derecha a izquierda, se comportará como una etiqueta de sustitución normal.

    6.1.12 Etiqueta Footnote

    Se puede usar una etiqueta de nota al pie para insertar notas al pie. La etiqueta debería comenzar con el símbolo "+". Por ejemplo, dada la siguiente plantilla:

    y los datos de la siguiente manera:

    {
        "quote":"Only I can change my life. No one can do it for me.",
        "person":"Carol Burnett"
    }
    

    resultando:

    Desde AOP3.3 la característica de hipervínculo es añadida usando una etiqueta que comienza con un * como: {* tag}. Dada la plantilla:

    Y el dato:

    {
      "name": "Support",
      "company_url": "https://www.apexofficeprint.com",
      "company_url_text": "APEX RND",
      "mail": "support@apexofficeprint.com"
    }
    

    resultando en:

    Los hipervínculos de correo se detectan automáticamente y mailto: se agregarán para que funcione el enlace. El texto del hipervínculo puede darse dando datos adicionales que finalicen con _text. por ejemplo: {*tag_text}. (ver json arriba).

    Este hipervínculo también funcionará cuando se desee un PDF de salida.

    Tenga en cuenta que en Excel se agregará el hipervínculo, pero el estilo permanecerá normal. Puede cambiar el estilo de etiqueta en la plantilla si desea otro estilo. En Word se tomará su estilo de hipervínculo predeterminado. Si desea otro estilo, puede cambiar el estilo de la etiqueta y agregar la opción tag_preserve_tag_style:true en los datos.

    6.2 Plantilla Powerpoint (pptx)

    Para archivos de plantilla pptx, las mismas etiquetas son compatibles como en la plantilla docx. Se debe prestar atención al usar las etiquetas "#", "%", "signo de dólar" y "\^", es decir, deben estar en su propio campo de texto. La posición del campo de texto determinará dónde comenzará la esquina superior izquierda del gráfico y la imagen. La repetición de una diapositiva de plantilla se hace especificando qué matriz se debe enlazar con la etiqueta "!" después del corchete, por ejemplo {!products} para repetir sobre matriz de producto. Si no se declara ninguno, el objeto raíz se toma como una matriz. Múltiples etiquetas "!" no están permitidas en una diapositiva.

    Dado el archivo JSON con el siguiente contenido:

         {
            "template": {
                "template_type": "pptx",
                "filename": "demo.pptx"
            },
            "output": {
                "output_encoding": "raw",
                "output_type": "pptx"
            },
            "files": [
                {
                    "filename": "output",
                    "data": [
                        {
                            "slide_title": "Slides Per Product",
                            "company_name": "Company A",
                            "product": [
                                {
                                    "product_name": "Business Shirt",
                                    "quantity": 3,
                                    "unit_price": 50
                                },
                                {
                                    "product_name": "Trousers",
                                    "quantity": 3,
                                    "unit_price": 80
                                },
                                {
                                    "product_name": "Jacket",
                                    "quantity": 3,
                                    "unit_price": 15
                                },
                                {
                                    "product_name": "Blouse",
                                    "quantity": 3,
                                    "unit_price": 60
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    

    y la plantilla pptx de la siguiente manera:

    dará como resultado lo siguiente para la primera diapositiva:

    Como solo hay un elemento en el objeto raíz JSON, esto solo se repite una vez. En la diapositiva de la plantilla 2, hemos especificado la matriz de productos como nuestra matriz de bucles con la etiqueta {!product}. Como hay 4 objetos en nuestra matriz de productos, esta plantilla se repetirá cuatro veces. El resultado es el siguiente:

    6.3 Plantilla Excel (xlsx)

    En las plantillas xslx, se pueden usar algunas de las mismas etiquetas que los tipos anteriores de plantillas, como se muestra en la tabla de resumen al comienzo de esta sección. El formato JSON debe contener los mismos elementos de metainformación (por ejemplo, template_type, filename, ...) y la información de datos se almacena en archivos/datos.

    Las etiquetas regulares se pueden usar con la palabra clave correspondiente en el archivo JSON entre corchetes, como en las plantillas docx y pptx. Las plantillas xlsx pueden recorrer los elementos de una lista utilizando la misma técnica que en la plantilla docx: {#loop_element} para ingresar al bucle y {/loop_element} para cerrarlo. Las celdas que están en el rectángulo delimitado por estas dos etiquetas se colocarán en bucle y se rellenarán utilizando los datos disponibles en el archivo JSON. Los bucles anidados son posibles (sin embargo, tenga en cuenta que debe permanecer dentro del rectángulo formado por el bucle "principal" - vea la nota después del ejemplo a continuación). El estilo se copiará de la plantilla al archivo generado en consecuencia. Al igual que con las plantillas docx, las expresiones angularJS simples se pueden utilizar para realizar operaciones matemáticas.

    Ejemplo de Xlsx:

    Dado el archivo JSON con el siguiente contenido:

         {
            "template": {
            "template_type": "xlsx",
            "filename": "simple.xlsx"
            },
            "output": {
            "output_encoding": "raw",
            "output_type": "xlsx"
            },
            "files": [
            {
                "filename": "file1",
                "data": [
                    {
                        "cust_first_name": "Albert",
                        "cust_last_name": "Lambert",
                        "cust_city": "St. Louis",
                        "orders": [
                            {
                                "order_total": 310,
                                "order_name": "Casual Shop's Order",
                                "product": [
                                    {
                                        "product_name": "Shirt",
                                        "quantity": 3,
                                        "unit_price": 50
                                    },
                                    {
                                        "product_name": "Trousers",
                                        "quantity": 2,
                                        "unit_price": 80
                                    }]
                            },
                            {
                                "order_total": 200,
                                "order_name": "Sport Shop's order",
                                "product": [
                                    {
                                        "product_name": "Sport's shoes",
                                        "quantity": 2,
                                        "unit_price": 100
                                    }]
                            }]
                    }]
            }]
        }
    

    y la plantilla xlsx de la siguiente manera:

    Nota: en el ejemplo anterior, la etiqueta de cierre {/orders} debe estar en la última columna. De lo contrario, los bucles hijos dentro de {#orders}...{/orders}, en este caso {#product}…{/product}, no podrían generar dentro del rectángulo formado entre las etiquetas de su bucle principal o padre ({#orders}…{/orders}).

    Informe Interactivo en Excel: a partir de la versión 2.2, todas las funcionalidades admitidas en Word con respecto al informe interactivo también se admiten en Excel. A modo ilustrativo, tomemos esta plantilla como entrada:

    El resultado de la salida es:

    AOP 3.0 y versiones posteriores también admiten configuraciones de celda de JSON al usar _ en su etiqueta. Por ejemplo, cuando tiene una columna "etiqueta", si usa "tag_font_color":"#1782A6" establecerá el color de la Fuente. Al usar "tag_cell_background": "#1DF248", establece el color de fondo, cuando usa "text_wrap":"y" se configurará si el texto está envuelto, etc. Puede encontrar una lista completa de características en la aplicación de ejemplo para APEX 5.1. Con AOP 3.3 y superior también puede generar hojas automáticamente usando {!tag} en el campo A1.

    7 Estructura SQL

    7.1 Cómo escribir consultas SQL y asignarlas a documentos de plantilla

    Po favor, consulte la imagen a continuación que contiene la consulta SQL y la plantilla correspondiente.

    El plugin AOP admite expresiones de cursor PL/SQL que se pueden usar en sus plantillas como "bucles de datos".

    El lado izquierdo corresponde a la consulta SQL que utilizamos en nuestro ejemplo de demostración. El lado derecho es nuestra plantilla de Word.

    En la consulta SQL, verá tres cursores internos llamados datos, pedidos y productos.

    La idea es que cada cliente encuentre pedidos y productos y los muestre como una carta de factura.

    El cursor de datos es una parte estándar de la estructura AOP JSON y debe estar presente en todas las consultas SQL. Al mismo tiempo, no tiene que especificarlo como un bucle en su plantilla. Para obtener más detalles al respecto, consulte la Sección 9 de este Manual.

    Otros dos nombres de cursor pueden ser de su preferencia siempre que se reflejen en su plantilla.

    ¿Por qué tenemos la sintaxis del cursor?

    Esta es la manera en que el motor AOP combina sus datos con sus plantillas.

    En nuestro ejemplo de plantilla, desea mostrar los detalles del cliente (cursor de datos) y luego mostrar todos sus pedidos (cursor de pedidos) con productos (cursor del producto) para que cada uno represente un cursor separado.

    Esto significa que queremos poder crear un bucle para pedidos y un bucle separado para productos. Esto es exactamente lo que hemos hecho en esta plantilla.

    La forma en que funciona el bucle de plantilla de AOP es mediante la notación {#loop element}….{/loop element}. En la plantilla, tenga en cuenta que estamos utilizando lo siguiente:

    "Thank you for shopping at. We have following products reserved for you:

    {#orders}{#product}
        - {product_name}{/product}
    The total amount of your order is €{order_total}.
    {/orders}"
    

    Primero abra el bucle de Pedidos luego abra el bucle de Producto y luego realice una numeración de viñetas para todos los productos. Antes de cerrar el bucle de Producto, cerrar el bucle Pedidos.

    Una vez que crea su consulta SQL, es muy fácil implementarla en su plantilla siguiendo unas simples reglas de etiquetado dependiendo del tipo de plantilla que esté creando.

    8 Servidor (sólo On-Premise)

    8.1 Instalación

    APEX Office Print está utilizando un convertidor externo. De forma predeterminada, se utiliza LibreOffice (disponible en todas las plataformas), pero se puede cambiar a MS Office (solo Windows). Uno de estos productos debe instalarse en el mismo servidor donde también instalará APEX Office Print.

    Puede registrarse y luego iniciar sesión en https://www.apexofficeprint.com. Vaya a Descargas y descargue el paquete On Premise para su plataforma. Actualmente admitimos Linux, Windows y OSX.

    Descomprime el archivo descargado, de esa forma usted verá un directorio v3.0

    Vaya al directorio v3.0/server y copie el archivo ejecutable en el servidor donde desea que AOP se ejecute en un directorio de su elección.

    Archivos ejecutables:

    Decida en qué puerto desea que se ejecute AOP. De forma predeterminada, está utilizando el puerto 8010. Puede cambiarlo más tarde (por ejemplo, APEXOfficePrintRH64 -p 5555).

    Si desea ejecutar la versión de prueba local de AOP, puede omitir el paso de activación.
    La versión local de AOP en modo de prueba funcionará con Word y PDF, pero contiene una marca de agua de prueba.
    La versión en la nube de AOP (100 días gratis) no tiene limitaciones.
    

    El siguiente paso solo es necesario cuando compraste AOP, no es necesario ejecutar en modo de prueba (ejemplo de Linux):

    Para iniciar APEX Office Print:

    Opciones de conversión PDF:

    LibreOffice se puede descargar desde https://www.libreoffice.org. Asegúrese de descargar LibreOffice 5 o superior y no se instala ninguna versión anterior de LibreOffice. Una vez completada la instalación de LibreOffice, compruebe si puede ejecutar soffice--version en una terminal.

    Debería ver algo como:

    LibreOffice 5.4.4.2 22b09f6418e8c2d508a9eaf86b2399209b0990f4

    Si eso falla, asegúrese de que la variable de entorno PATH contiene el directorio de LibreOffice (directorio bin). También puede crear un enlace simbólico para soffice, p.ej.

    ln -s /opt/libreoffice5.4/program/soffice /usr/sbin/soffice

    Si está en Windows, puede elegir LibreOffice o MS Office. En caso de que desee utilizar MS Office, asegúrese de tener instalado MS Office 2003 o superior y también instalar OfficetoPDF(directa descarga), que permite ejecutar conversiones desde la línea de comando. Nota: Coloque el archivo ejecutable de OfficetoPDF en la misma carpeta que AOP.

    Después de instalar LibreOffice o MS Office, reinicie AOP.

    Opción de código de barras:

    Antes de AOP 3.1, era necesario instalar una herramienta externa para poder generar códigos de barras, pero desde AOP 3.1 y superior ya no es necesario. Todos los componentes necesarios están dentro de AOP.

    Prueba de conexión a AOP:

    Asegúrese de que el servidor de la base de datos se pueda conectar al puerto donde se está ejecutando AOP. Si no, abra el puerto para que el servidor de la base de datos pueda conectarse al servidor web: puerto (tenga en cuenta que no necesita abrirlo para todos, solo para el servidor de la base de datos está bien)

    Por ejemplo, ejecutando curl webserver:port

    $ curl 127.0.0.1:8010

    La instalación en la parte del servidor ahora está completa.

    En el archivo comprimido descargado, también hay una aplicación de ejemplo (directorio de la aplicación) que puede importarse o puede importar el plugin AOP (directorio del plugin) en su aplicación. La única configuración para definir el servidor web es el puerto donde se ejecuta AOP y el convertidor que está utilizando (LibreOffice, MS Office). Puede hacerlo en Componentes Compartidos > Otros Componentes > Valores de Componente. Luego seleccione APEX Office Print(AOP)Plug-in, cambie la URL AOP y seleccione el convertidor apropiado.

    8.2 Configuración

    Se pueden usar los siguientes parámetros:

    -p o --port puede establecer un puerto diferente que el servidor debería estar ejecutando en

    Ejemplo: para ejecutar AOP en el puerto 8015 ejecutar:

    APEXOfficePrintRH64 -p 8015 (o ./APEXOfficePrintRH64 -p 8015)

    8.3 Desbloquear versión de prueba

    Por defecto, AOP se ejecutará en la versión TRIAL.

    Solo se pueden crear plantillas de Word en la versión de prueba de AOP. Una vez que haya decidido un nivel de licencia, el producto se puede activar ejecutando -a o --activate:

    \$ APEXOfficePrintRH64 -a

    Le solicitará un correo electrónico. Utilice el mismo correo electrónico que utilizó cuando se suscribió a una licencia en https://www.apexofficeprint.com/

    Cuando vuelva a ejecutar AOP, mostrará las nuevas plantillas con licencia que puede usar.

    Si no hay conexión a Internet, o si algo sale mal con la activación, puede ponerse en contacto con support@apexofficeprint.com y enviarnos su dirección MAC del servidor en el que desea instalarlo. Le enviaremos el archivo de licencia por correo electrónico. Agregue ese archivo en el mismo directorio de AOP y reinicie AOP para obtener la versión completa.

    Para obtener la dirección MAC, puede usar los siguientes comandos:

    8.4 Opciones de Servidor

    Para ver todas las opciones disponibles, ejecuta ./APEXOfficePrintRH64 -h

    Following parameters can be used:       -a or --activate : Activate the software       -h or --help : Show this menu       -p or --port : For giving in the running port default: 8010                            Example: APEXOfficePrint -p 5555       -i or --instances : The number of instances of AOP to start                            Giving 0 will start max instances available       -s or --startat : Directory to start at       --license : The location of license file.                            Default looks at the startup directory       -v or --version : Show the current version of AOP       -d or --debug : Save stack trace       --enable_printlog : Log data about the printjobs to server_printjob.log       --silent : Do everything quietly even start message       --verbose : Log what AOP is currently doing (console needed)       --idle_timeout : Allowed PDF conversion time, default is 120 sec, 0 is no time-out       --https_key : The key for the https certificate       --https_cert : The certificate to use while using https --https_port : The port for the https server to run on Having a key/cert but no port will make the https server use the port from -p/--port (or the default) Example: .. -p 80 --https_port 443 -https_key ... http runs on port 80, https on port 443 Example: .. -p 80 --https_key ... https runs on port 80, no regular http       --enable_save : This enables the options write to disk                            Default: outputfiles dir of AOP directory       --ignore_parallel : Ignores parallel conversion on enterprise license

    8.5 Ejecutando como Servicio en Windows

    Usando Microsoft Office como convertidor de PDF

    Si desea utilizar Microsoft Office como convertidor de PDF para sus documentos, debemos hacer algunas modificaciones antes de poder utilizar ApexOfficePrint como servicio.

    32-Bit Windows

    Creación de directorio

    Cree un directorio "Desktop" si aún no existe en \ "C:\Windows\system32\config\systemprofile\Desktop"

    Configuración de DCOM
    1. Desde Ejecutar/Run (Windows + R), escriba dcomcnfg

    2. Navegue hasta Component Services > Computers > My Computer > DCOM Config

    1. Ubique "Microsoft Excel Application" y haga clic con el botón secundario en las propiedades de la misma

    2. Navegue a Security Tab y Customize los Launch and Activation Permissions y Edit

    3. Compruebe que no se estén ejecutando instancias de excel.exe antes de cambiar las propiedades, cierre las aplicaciones que ejecutan Excel o vaya al administrador de tareas y elimine los procesos de excel.exe.

    1. Agregue el usuario actual (escriba el usuario actual, haga clic en los nombres de verificación y haga clic en Aceptar) y otorgue permiso para Lanzamiento Local y Activación Local

    2. Vaya a Identity Tab y cambie la opción del botón de radio a "The User"

    3. Haga lo mismo para "Microsoft PowerPoint Slide".

    4. Haga lo mismo para "Microsoft Word 97-2003 Document".

    Establecer permisos de directorio
    1. Navegue a: "C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft".

    2. Haga clic derecho y vaya a Propiedades

    3. En la pestaña Seguridad, agregue el usuario actual y otorgue los permisos Modificar, Leer & Ejecutar, Mostrar el contenido de la carpeta, Leer y Escribir.

    4. Haga lo mismo para "C:\Windows\Temp\".

    64-Bit Windows

    Creación de Directorio

    Cree un directorio "Desktop" si aún no existe en:

    "C:\Windows\system32\config\systemprofile\Desktop" y "C:\Windows\SysWOW64\config\systemprofile\Desktop"

    Configuración DCOM
    1. Desde Ejecutar (Windows + R), escriba dcomcnfg (si su Microsoft Office es de 32 bit abra la línea de comando y cambie el directorio a "C:\Windows\SysWOW64" y ejecute "mmc comexp.msc/32" command)

    2. Navegue hasta Component Services > Computers > My Computer > DCOM Config

    1. Ubique "Microsoft Excel Application" y haga clic con el botón secundario en las propiedades de la misma

    2. Navegue hasta Security Tab y Customize los Launch and Activation Permissions y Edit

    3. Compruebe que no se estén ejecutando instancias de excel.exe antes de cambiar las propiedades, cierre las aplicaciones que ejecutan Excel o vaya al administrador de tareas y elimine los procesos de excel.exe.

    1. Agregue el usuario actual (escriba el usuario actual, haga clic en los nombres de verificación y haga clic en Aceptar) y otorgue permiso para Local Launch y Local Activation

    2. Vaya a Identity Tab y cambie la opción del botón de radio a "The Interactive User" o "The Launching User" (inicio automático)

    3. Haga lo mismo para "Microsoft PowerPoint Slide".

    4. Haga lo mismo para "Microsoft 97-2003 Document".
    Establecer permisos de directorio

    Navegar a:

    1. "C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft".

    2. Haga clic derecho y vaya a Propiedades

    3. En la pestaña Seguridad, agregue el usuario actual y otorgue los permisos Modificar, Leer & Ejecutar, Mostrar el contenido de la carpeta, Leer y Escribir.

    4. Haga lo mismo para:

    "C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft"

    1. Haga lo mismo para "C:\Windows\Temp\".

    Usando LibreOffice como convertidor pdf

    No se requieren pasos adicionales.

    Administrar el servicio

    Tenga en cuenta que también puede agregar parámetros adicionales, por ejemplo, para el puerto en el que debería ejecutarse y el directorio de inicio.

    nssm.exe install APEXOfficePrint %0\..\..\APEXOfficePrintWin64.exe --port 8090 -s D:\apexofficeprint

    8.6 Ejecute APEX Office Print al inicio o como Servicio en Linux

    Después de reiniciar el servidor donde está instalado APEX Office Print, debe asegurarse de ejecutar también el comando APEXOfficePrintRH64. Si desea automatizar el inicio de AOP, puede crear en init.d. Por ejemplo: /etc/init.d/aop-server

    #!/bin/bash
    #
    # Apex Office Print (AOP) Server
    #
    # chkconfig: 345 70 30
    # description: AOP is a print server for Oracle Application Express and PL/SQL
    # processname: APEXOfficePrint
    
    # Source function library.
    . /etc/init.d/functions
    
    RETVAL=0
    AOP_HOME=/opt/aop/v3.0/server
    AOP_PROCESS_NAME=APEXOfficePrint
    AOP_EXECUTABLE_NAME=APEXOfficePrintRH64
    AOP_PORT=8010
    LIBREOFFICE_HOME=/opt/libreoffice5.4
    
    PATH=$LIBREOFFICE_HOME/program:$PATH
    export PATH
    
    start() {
            echo -n "Starting $AOP_PROCESS_NAME "
            echo -n "Current path is $PATH"
            $AOP_HOME/$AOP_EXECUTABLE_NAME -p $AOP_PORT -s $AOP_HOME &amp;
            RETVAL=$?
            eco
            return $RETVAL
    }
    
    stop() {
            echo -n "Shutting down $AOP_PROCESS_NAME: "
            pkill $AOP_PROCESS_NAME
            RETVAL=$?
            eco
            return $RETVAL
    }
    
    status() {
            echo -n "TODO: Print $AOP_PROCESS_NAME status here... "
            RETVAL=$?
            return $RETVAL
    }
    
    case "$1" in
        start)
            comienzo
            ;;
        stop)
            detener
            ;;
        status)
            estado
            ;;
        restart)
            detener
            comienzo
            ;;
        *)
            echo "Usage: $prog {start|stop|status|restart}"
            exit 1
            ;;
    esac
    exit $RETVAL
    

    En caso de que necesite instalar LibreOffice en Linux, aquí están los pasos (vea también otra sección):

    # download LibreOffice for the PDF converter
    cd /tmp
    wget http://download.documentfoundation.org/libreoffice/stable/5.4.4/rpm/x86_64/LibreOffice_5.4.4_Linux_x86-64_rpm.tar.gz
    
    # make sure no old versions exist
    yum remove openoffice* libreoffice*
    
    # extract tar
    tar -xvf LibreOffice_5.4.4_Linux_x86-64_rpm.tar.gz
    
    # install
    cd /tmp/LibreOffice_5.4.4.2_Linux_x86-64_rpm/RPMS/
    yum localinstall *.rpm
    
    # install some missing dependencies (depending your linux version this is not necessary)
    yum install cairo.x86_64
    yum install cups.x86_64
    yum install mesa-libGL.x86_64
    
    # install Java dependency (not necessary if you already have Java)
    yum install java-1.8.0-openjdk.x86_64
    
    # create symbolic link
    ln -s /opt/libreoffice5.4/program/soffice /usr/sbin/soffice
    

    8.7 Errores de Instalación

    Error de puerto de instalación de Linux

    Si encuentra este error:

    -------------------------------------------------     Error on Thu Feb 04 2016 19:33:35 GMT-0800 (PST)     -------------------------------------------------     listen EADDRINUSE

    Significa que el puerto que intentó ejecutar el servidor AOP ya está ocupado y necesita cambiarlo ejecutando este comando::

    ./APEXOfficePrintRH64 –p xxxx (replace xxxx by a free port)

    8.8 Docker image

    Pre-requisitos

    Defina una red de Docker, si todavía no tiene una

    docker network create my_network
    

    Asegúrate de que tu contenedor de la base de datos Oracle esté en esta red

    docker network connect my_network oracle
    

    Comience su contenedor de ORDS en esta red

    docker run -t -i \
    --name ords \
    --network=my_network \
    -e DATABASE_HOSTNAME="oracle" \
    -e DATABASE_PORT="1521" \
    -e DATABASE_SERVICENAME="ORCLPDB1" \
    -e DATABASE_PUBLIC_USER_PASS=oracle \
    -e APEX_LISTENER_PASS=oracle \
    -e APEX_REST_PASS=oracle \
    -e ORDS_PASS=oracle \
    --volume /docker/apex/images:/usr/local/tomcat/webapps/i \
    -p 8181:8080
    ords/ords_apex:3.0.9
    

    Descargue el AOP docker image

    docker pull apexrnda/apexofficeprint
    

    Activación de APEX Office Print la primera vez (solo licencia Gold, no necesaria para la licencia Enterprise). Este paso solo es necesario una vez.

    docker run -it \
    --name apexofficeprint \
    --network=my_network \
    -p 8010:8010 \
    -v /docker/apexofficeprint/:/apexofficeprintstartup/ \
    apexrnd/apexofficeprint \
    -s /apexofficeprintstartup/
    -a
    

    En caso de que tenga una Licencia Enterprise, agregue el archivo aop.license en el directorio que especificó, en el siguiente ejemplo es /docker/apexofficeprint/

    Inicie un contenedor AOP en la red de su contenedor de base de datos Oracle

    docker run -d \
    --name apexofficeprint \
    --network=my_network \
    -p 8010:8010 \
    -v /docker/apexofficeprint/:/apexofficeprintstartup/ \
    apexrnd/apexofficeprint \
    -s /apexofficeprintstartup/
    

    Ahora debería poder conectarse al servidor APEX Office Print yendo a http://apexofficeprint:8010/. Usted puede ver este video para ver lo anterior en acción.

    Crear un ACL para APEX_050100 en el contenedor AOP

    empezar
     DBMS_NETWORK_ACL_ADMIN.append_host_ace (
        host       => 'apexofficeprint',
        lower_port => 8010,
        upper_port => 8010,
        ace        => xs$ace_type(privilege_list => xs$name_list('http'),
                                  principal_name => 'APEX_050100',
                                  principal_type => xs_acl.ptype_db));
    end;
    

    Configurar el plugin de APEX

    Vaya a Componentes Compartidos > Valores de Componentes > APEX Office Print y ponga en la URL de AOP una referencia a su contenedor de docker, p.ej. http://apexofficeprint:8010/

    9 Tutoriales

    Usted puede verificar la página de tutoriales de APEX Office Print para ver tutoriales y videos (contenido en inglés).

    10 Solución de problemas

    10.1 La salida genera documentos de Office no válidos

    En caso de que los documentos de Office no estén abiertos como se esperaba, probablemente haya un problema con el JSON que se envió al servidor de AOP. Si se ejecuta en la nube de AOP, puede habilitar la depuración remota, a la que puede acceder cuando inicie sesión en su panel de APEX Office Print en https://www.apexofficeprint.com. Si está ejecutando la versión local de AOP, en el servidor hay un archivo server_error.log que contiene los errores que se encontraron durante el procesamiento. El primer paso es verificar ese archivo para más información. A continuación, asegúrese de que su JSON sea válido comprobando el JSON en, por ejemplo, http://jsonlint.com o haciendo Remote Debug (consulte más adelante en este documento)

    10.2 JSON no válido generado por apex_webservice.make_rest_request

    Asegúrese de que esté instalado APEX 5.0.4 o superior. Para descargarlo, inicie sesión en support.oracle.com.

    10.3 JSON no válido generado por apex_json

    Asegúrese de instalar un parche adicional para APEX 5.0.4 PSE 24341756 o para APEX 5.1.0 PSE 25650850 o para APEX 5.1.1 PSE 25853436 disponible en https://support.oracle.com. Esos parches solucionarán problemas con apex_json que se usa detrás de escena en AOP.

    También podría generarse el error en la base de datos Oracle (en 12.1.0.2). Un parche está disponible en https://support.oracle.com; buscar el parche #21424376. No experimentará este problema en 11.2.0.4 o 12.2.

    Al usar la función PL/SQL que devuelve JSON, puede generarse un error en apex_plugin_util, que se puede solucionar aplicando el parche 26048323.

    Finalmente, si todavía tiene problemas, use ORDS (SQL Workshop > RESTful Services) como su fuente de datos. ORDS generará JSON en lugar de apex_json y AOP utilizará ese JSON en su lugar (consulte 3.5.4 Origen de datos - URL con ORDS RESTful Web Service).

    10.4 Ejecutando en Oracle Cloud

    Si está ejecutando en Oracle Cloud, debe usar HTTPS en la configuración del Componente AOP y cuando llame al paquete aop_api3_pkg. Use https://www.apexrnd.be/aop como la URL.

    10.5 Archivo PDF Inválido

    Si está ejecutando la versión local de AOP, verifique un archivo en el servidor llamado server_error.log o server_uncaugt_exceptions.log y vea qué error obtiene. Intente ejecutar su ejemplo en el mismo formato que su plantilla. Si esto también falla, hay un problema con el JSON o la plantilla. Verifique su plantilla y datos nuevamente. Si recibe su documento correctamente, pero el PDF no funciona, hay un problema para encontrar LibreOffice o MS Office. Asegúrese de que esos programas estén instalados correctamente. Intente hacer una conversión manual en la línea de comando de esas herramientas y vea si eso funciona. De lo contrario, verifique el error e intente reinstalar. También puede realizar la depuración remota (consulte más adelante en este documento), que ayudará a identificar el problema real. Si todo falla, contáctese con support@apexofficeprint.com.

    10.6 ORA-29273: Solicitud HTTP fallida

    ORA-29273: HTTP request failed ORA-06512: at "SYS.UTL_HTTP", line 1130 ORA-24247: network access denied by access control list (ACL)

    Asegúrese de que el esquema APEX_050000 o APEX_050100 tengan los derechos para conectarse a APEX Office Print (http(s)://www.apexofficeprint.com para la versión de Cloud o su url local en el caso de la versión local). La secuencia de comandos para corregir el problema se puede encontrar aquí: APEX 5.0 o para APEX 5.1 (use el script correcto para su versión de la base de datos - para uso XE antes de 12c)

    10.7 ORA-29024: Error de validación del certificado

    ORA-29273: HTTP request failed ORA-06512: at "SYS.UTL_HTTP", line 1130 ORA-29024: Certificate validation failure

    En caso de que ejecute HTTPS, debe tener en cuenta los certificados. Hay dos formas de evitar esto:

    Aquí hay un ejemplo cuando en el plugin debe especificar una dirección local: http://apexrnd.localdomain/aop/

        ServerName apexrnd.localdomain     ServerAlias apexrnd.localdomain     RewriteEngine On     ProxyVia On     ProxyRequests Off     SSLProxyEngine On     ProxyPass /aop/ https://www.apexofficeprint.com/api/     ProxyPassReverse /aop/ https://www.apexofficeprint.com/api/     

    10.8 Error al generar Excel y Powerpoint con AOP Trial

    Si no activa la versión local de AOP, se ejecutará en modo de prueba. Este modo no puede generar archivos xlsx y pptx, pero funcionará con docx y pdf, pero esos resultados contendrán una marca de agua de prueba. La versión gratuita de 100 días en la nube no está limitada y puede hacer todo lo que esté a su alcance. Cuando compra APEX Office Print, puede activar su versión local y se eliminarán todas las restricciones.

    10.9 Cómo leer y convertir documentos (docx, xlsx, pptx, pdf) en Linux

    Necesitas instalar LibreOffice https://www.libreoffice.org/download/libreoffice-fresh/. Los pasos para hacer esto se detallan a continuación:

    Haga una conexión a su servidor con ssh o putty, pero asegúrese de no reenviar ni tunelizar su X Display.

    Instalar paquetes de soporte:

    yum install wget

    Descargar LibreOffice

    cd /tmp     wget http://download.documentfoundation.org/libreoffice/stable/5.4.2/rpm/x86_64/LibreOffice_5.4.2_Linux_x86-64_rpm.tar.gz

    Instalar LibreOffice

    tar xzvf LibreOffice_5.4.2_Linux_x86-64_rpm.tar.gz     cd LibreOffice_5.4.2.2_Linux_x86-64_rpm/RPMS     yum localinstall .rpm     - or you can do rpm -ivh .rpm

    Agregue LibreOffice al perfil de su usuario (ya que necesita para poder encontrar soffice)

    vi /etc/profile     export PATH=$PATH:/opt/libreoffice5.4/program     source /etc/profile

    O agregue un enlace simbólico a LibreOffice

    ln -s /opt/libreoffice5.4/program/soffice /usr/sbin/soffice

    Compruebe la versión de LibreOffice e intente ejecutar una conversión

    soffice --version     soffice --headless --invisible --convert-to pdf --outdir /tmp aop_interactive.docx

    Si obtiene: Fontconfig warning: ignoring UTF-8: not a valid region tag

    echo "$LC_CTYPE"     |-> you probably have UTF-8 defined; unset it     export LC_CTYPE=""

    Asegúrese de reiniciar APEX Office Print después de instalar LibreOffice.

    Nota: a veces vemos que LibreOffice no genera el mismo PDF que genera MS Office, pero descubrimos que LibreOffice cada vez está más en línea, por lo que recomendamos utilizar la última versión de LibreOffice.

    Nota: Dependiendo de la versión de conversión de LibreOffice a HTML desde docx, xlsx, pptx podría incluir las imágenes como base64 o incluir un enlace.

    10.10 ORA-31011: XML parsing failed, ORA-19202: Error occurred in XML processing, LPX-00651: VM Stack overflow

    Necesita instalar un parche adicional para APEX 5.0.4 que solucionará este problema. Busca en https://support.oracle.com para PSE 24341756.

    10.11 Se produjo un error al adquirir la licencia

    Recibirá: "Ocurrió un error al adquirir una licencia. Asegúrese de que su clave API sea correcta y de que tenga suficientes créditos de impresión. Póngase en contacto con AOP si el problema persiste".

    Esto significa que se quedó sin créditos. Vaya a https://www.apexofficeprint.com y actualice su paquete o envíe un correo electrónico a support@apexofficeprint.com para ver qué podemos hacer para su caso.

    10.12 SyntaxError: token inesperado P en JSON en la posición 0

    Si está utilizando APEX 5.1, el plugin de Acción Dinámica siempre funcionará, mientras que el plugin de Procesos puede generar este error. Cuando coloque el proceso en la parte de Procesamiento, solo funcionará si el atributo "Volver a Cargar al Ejecutar" (de la página) está configurado en "Siempre" (tenga en cuenta que este atributo es nuevo en 5.1). Esto se debe a un cambio en la forma en que APEX 5.1 maneja el procesamiento de páginas. Si quiere importar una aplicación APEX 5.0 en 5.1 de manera predeterminada está configurado para "Volver a Cargar al Ejecutar" en "Siempre", pero si crea una nueva aplicación en 5.1, se establece en "Solo Correctos" y luego el plugin de proceso no funciona. Alternativa puede poner el proceso de AOP después del encabezado y hacerlo condicional, el cual funcionará independientemente de la configuración de "Volver a Cargar al Ejecutar".

    10.13 Problemas con Oracle XE

    Cuando utilice Oracle XE, asegúrese de tener el permiso de ejecución en el paquete UTL_HTTP.

    GRANT EXECUTE ON SYS.UTL_HTTP TO my_user;     GRANT EXECUTE ON SYS.UTL_FILE TO my_user;

    Si recibe "ORA-20000: Problema devuelto por el Servicio AOP (llamada REST). Verifique los registros en el servidor. Código HTTP devuelto:. (Código: -29273)", consulte la sección 10.6.

    10.14 Soporte para el lenguaje chino y otros idiomas y fuentes

    Si necesita caracteres especiales o soporte de idiomas, asegúrese de que las fuentes y los idiomas necesarios estén en su sistema. Por ejemplo, para agregar soporte chino en RHEL Linux hacer:

    yum install "@Chinese Support"

    Además, si desea instalar fuentes adicionales, aquí hay un buen enlace. Nuestro AOP Cloud también admite fuentes Google Noto.

    Instalar una fuente no es más que instalar la fuente en su sistema. Entonces, por ejemplo, en (RedHat) Linux copiamos los archivos *.ttf (o directorio) a /usr/share/fonts/ y ejecutamos "fc-cache -f -v"

    Según si tiene una GUI (Linux/Windows), puede hacer doble clic en la fuente e instalarla en su sistema. Si su sistema reconoce, MS Office o LibreOffice deberían poder usarlo para la conversión de PDF.

    Para los códigos de barras, también puede optar por instalar una fuente de código de barras, por ejemplo Free 3of9 o http://www.dafont.com/3of9-barcode.font. Las fuentes de código de barras son más efectivas que las imágenes.

    10.15 Ejecución de AOP instalado en un único esquema pero compartido en varios esquemas

    Es posible instalar AOP solo una vez y llamarlo desde otros lugares. Para hacer esto, después de instalar AOP - vaya al paquete AOP_API3_PKG y AOP_PLSQL3_PKG y elimine el AUTHID CURRENT_USER y vuelva a compilar.

    10.16 Ejecución on-premise de AOP bajo HTTPS

    Desde la versión AOP 3.1, AOP se puede configurar para usar el servidor HTTPS. Los archivos tanto de clave como de certificado se pueden proporcionar al AOP usando los argumentos --https_key and --https_cert.

    Para versiones anteriores, sin embargo, recomendamos configurar un Apache Reverse Proxy el cual está haciendo SSL frente a AOP. Desde Apache hasta AOP no estaría cifrado, pero si está en la misma máquina que Apache y el puerto de AOP no está abierto y solo puede acceder a él el localhost, creemos que está seguro.

    Para evitar el acceso a AOP que no sea Apache Reverse Proxy, puede hacerlo (en Linux):

    iptables -A INPUT -p tcp --dport 8010 -s 127.0.0.0/8 -j ACCEPT
    iptables -A INPUT -p tcp --dport 8010 -j DROP
    

    (en lugar de DROP usted puede usar también REJECT)

    Entonces eso significa que solo un programa en localhost (como Apache) puede conectarse al puerto 8010, todos los demás son rechazados.

    10.17 La URL solicitada ha sido prohibida

    Si está en APEX, fuerce que todas las conexiones salientes sean HTTPS configurando: Gestionar Instancia -> Seguridad -> Protocolo HTTP -> Requerir HTTPS Saliente -> No.

    Asegúrese de llamar a AOP también con HTTPS. Si estas llamando a AOP en la Nube https://www.apexofficeprint.com/api asegúrese de cargar el certificado en su base de datos o configurar un proxy en su extremo.

    10.18 La salida de PDF dejó de funcionar repentinamente

    Probablemente, el proceso de LibreOffice o MS Office está atascado. Una forma de resolver esto es ejecutar un script que compruebe los procesos de larga ejecución y que los mate. Si está utilizando AOP Cloud, póngase en contacto con support@apexofficeprint.com.

    10.19 Mapa o Gantt o Otro div no en la salida

    En algunas ocasiones, los divs no se capturan suficientemente bien, por lo que no aparecen en la salida. Por ejemplo, el indicador JET podría no tomarse. Estamos buscando una solución para una versión futura.

    10.20 ORA-29273: HTTP request failed ORA-12535: TNS:operation timed out

    Verifique su firewall si permite la conexión saliente de la base de datos al servidor AOP. Si agregó el puerto AOP a las reglas del firewall, asegúrese de reiniciar el daemon.

    Si está utilizando un proxy, asegúrese de especificar el proxy en Componentes Compartidos > Atributos de Definición de Aplicación > Servidor Proxy o especifique la variable global en AOP_API3_PKG.g_proxy_override.

    Consulte también más adelante en este documento en el capítulo 15 Depuración de conexiones al servidor AOP.

    10.21 La fuente en PDF es diferente de la fuente en mi plantilla de Word

    Esto probablemente se deba al hecho de que la fuente que eligió en Word está disponible en su computadora local, pero no en el servidor. Si instala esa fuente también en el servidor donde se ejecuta AOP, debería hacer bien la conversión. Consulte también 10.14 Soporte para el lenguaje chino y otros idiomas y fuentes.

    10.22 La generación de mi documento es lenta

    Tendría que averiguar dónde pierde tiempo:

    Si la conclusión es que todo es lo más rápido posible, aconsejamos para aquellos informes que tarden mucho tiempo, que se ejecuten en segundo plano con un job. También puede programar los informes para que se ejecuten durante la noche y almacenar los resultados en una tabla.

    11 Depuración en APEX

    AOP está totalmente equipado con mensajes de depuración de APEX, por lo que cuando active la depuración en su aplicación APEX verá muchas llamadas AOP: .... También puede especificar una variable global g_debug_procedure si desea llamar a su propio procedimiento de depuración que, por ejemplo, registra la información en su propia tabla. Si usa Logger, también puede habilitar el registrador yendo al paquete aop_api3_pkg y estableciendo g_logger_enabled en true.

    12 Depuración en PL/SQL

    Si está programando informes o llamando a los paquetes AOP con PL/SQL, puede depurar directamente desde PL/SQL. Aquí hay un ejemplo:

    declarar
      l_binds           wwv_flow_plugin_util.t_bind_list;
      l_return          blob;
      l_output_filename varchar2(100) := 'output';
    empezar
      -- remove previous debug
      apex_debug.remove_debug_by_age(
        p_application_id  => 232,
        p_older_than_days => -1);
    
      -- create an APEX session with the debug enabled
      aop_api3_pkg.create_apex_session(
        p_app_id       => 232,
        p_enable_debug => 'Y');
    
      l_return := aop_api3_pkg.plsql_call_to_aop (
                    p_data_type       => aop_api3_pkg.c_source_type_rpt,
                    p_data_source     => 'ir1',
                    p_template_type   => aop_api3_pkg.c_source_type_apex,
                    p_template_source => 'aop_interactive.docx',
                    p_output_type     => 'pdf',
                    p_output_filename => l_output_filename,
                    p_binds           => l_binds,
                    p_aop_url         => 'http://www.apexofficeprint.com/api/',
                    p_api_key         => '1C511A58ECC73874E0530100007FD01A',
                    p_app_id          => 232,
                    p_page_id         => 5,
                    p_init_code       => 'aop_api3_pkg.g_language := ''en'';');
    end;
    /
    

    13 Depuración Remota

    Si recibe un error y necesita ayuda, siga los siguientes pasos:

    1) Vaya a su aplicación a Componentes Compartidos > Valores de Componentes > APEX Office Print (AOP) [Plug-in] y habilite la depuración remota (vea la captura de pantalla de parámetros)

    Nota 1: encuentre su clave API cuando inicia sesión en su tablero en https://www.apexofficeprint.com

    Nota 2: asegúrese de que el esquema APEX_050000 o APEX_050100 tenga los derechos para conectarse a http(s)://www.apexofficeprint.com

    2) Ejecute su informe de nuevo.

    3) Iniciar sesión en https://www.apexofficeprint.com y vaya a Depuración Remota

    4) Haga clic en la lupa y se mostrará el JSON que se generó detrás de escenas y que se envía al plugin del servidor AOP.

    5) Investigue el JSON recibido:

    -) JSON is valid, and valid outpu: así es como debería ser.

    -) JSON is invalid: esto probablemente se deba a su versión de APEX. Si está por debajo de APEX 5.1.2, necesita un parche relacionado a apex_json.

    -) JSON is valid, but invalid Office file (Word, Excel, Powerpoint): esto significa que AOP no podía combinar sus datos con la plantilla que ya ha proporcionado. Si la plantilla y la salida solicitada tienen el mismo formato (por ejemplo, su plantilla está en Word y solicita un documento de Word); revise su plantilla nuevamente si todas las cadenas de sustitución son correctas. Si crees que todo está bien, haz clic en el botón "Sent to Support" y ponte en contacto con support@apexofficeprint.com.

    -) JSON is valid, but invalid PDF (or other output format): si la plantilla y el formato de salida son diferentes, una conversión está pasando a cargo de LibreOffice o MS Office. O bien la conversión falla, o lo más probable es que el archivo inicial antes de la conversión ya estaba mal. Para seguir depurando, configure el formato de salida con el mismo formato que su plantilla y vuelva a ejecutar su informe. Si el resultado no es válido, siga los pasos anteriores (consulte JSON es válido, pero el archivo de Office no es válido). Si el resultado es correcto, haga clic en el botón "Sent to Support" y envíe un correo electrónico a support@apexofficeprint.com, ya que significa que hay un error en la conversión.

    14 Depuración Local

    Si recibe un error y necesita ayuda, siga los siguientes pasos:

    1. Vaya a su aplicación a Componentes Compartidos > Valores de Componentes > APEX Office Print (AOP) [Plug-in] y configure Debug a Local.

    2. Ejecute su informe nuevamente. Se descargará un archivo JSON en lugar del informe. Este JSON es lo que se envía al plugin del servidor AOP detrás de escenas.

    3. Investigue el JSON recibido:

    -) JSON is valid, and valid outpu: así es como debería ser.

    -) JSON is invalid: esto probablemente se deba a su versión de APEX. Si está por debajo de APEX 5.1.2, necesita un parche relacionado a apex_json.

    -) JSON is valid, but invalid Office file (Word, Excel, Powerpoint): esto significa que AOP no podía combinar sus datos con la plantilla que ya ha proporcionado. Si la plantilla y la salida solicitada tienen el mismo formato (por ejemplo, su plantilla está en Word y solicita un documento de Word); revise su plantilla nuevamente si todas las cadenas de sustitución son correctas. Si crees que todo está bien, haz clic en el botón "Sent to Support" y ponte en contacto con support@apexofficeprint.com.

    -) JSON is valid, but invalid PDF (or other output format): si la plantilla y el formato de salida son diferentes, una conversión está pasando a cargo de LibreOffice o MS Office. O bien la conversión falla, o lo más probable es que el archivo inicial antes de la conversión ya estaba mal. Para seguir depurando, configure el formato de salida con el mismo formato que su plantilla y vuelva a ejecutar su informe. Si el resultado no es válido, siga los pasos anteriores (consulte JSON es válido, pero el archivo de Office no es válido). Si el resultado es correcto, haga clic en el botón "Sent to Support" y envíe un correo electrónico a support@apexofficeprint.com, ya que significa que hay un error en la conversión.

    1. Si no encontró una solución usted mismo, envíe el archivo JSON a support@apexofficeprint.com

    15 Depuración de conexiones al servidor AOP

    Abra un ventana de command promp o shell y ejecute AOP en modo verbose:

    ./APEXOfficePrintRH64 —-verbose
    

    Copie el archivo test.json a su servidor donde AOP está ejecutandose en la carpeta /tmp

    En otra ventana de command promp o shell vaya a la carpeta /tmp y ejecute:

    curl -X POST -H 'Content-Type: application/json' -d @test.json http://127.0.0.1:8010/ > output.docx
    

    Esto debería mostrar el resultado siguiente y ha creado un archivo output.docx

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  164k  100 68310  100   97k   335k   492k --:--:-- --:--:-- --:--:--  494k
    

    Compruebe el primer shell, AOP debería haber impreso:

    Prinjob received.     Sending back response.     Prinjob completed.

    Intente ejecutar el mismo comando curl pero con su nombre de servidor

    curl -X POST -H 'Content-Type: application/json' -d @test.json http://<your server name>:8010/ > output.docx
    

    Lo mismo que antes para la salida.

    Vaya al servidor de la base de datos copie el archivo test.json en la carpeta /tmp y ejecute nuevamente el comando curl

    curl -X POST -H 'Content-Type: application/json' -d @test.json http://<your server name>:8010/ > output.docx
    

    Esto debería hacer lo mismo que antes.

    Vaya a APEX > Taller de SQL, y trate de conectarse al servidor AOP

    select apex_web_service.make_rest_request('http://<your server name>:8010/', 'GET') from dual
    

    Intente generar un primer documento, ajuste la secuencia de comandos a continuación a su configuración y ejecute

    declarar
      l_return          blob;
      l_output_filename varchar2(100) := 'output';
    
    empezar
      aop_api3_pkg.g_proxy_override := null; -- set the proxy if you use that
    
      l_return := aop_api3_pkg.plsql_call_to_aop (
                    p_data_type       => 'SQL',
                    p_data_source     => q'[
                      seleccionar
                        'file1' as "filename",
                        cursor(
                          select 'hello world' as "string"
                            from dual
                        ) as "data"
                      from dual
                    ]',
                    p_template_type   => null,
                    p_template_source => null,
                    p_output_type     => 'docx',
                    p_output_filename => l_output_filename,
                    p_aop_url         => 'http://<your server name>:8010/', -- change to the AOP server
                    p_api_key         => '',
                    p_app_id          => 232); -- change to the AOP sample app number
      sys.htp.p(dbms_lob.getlength(l_return));
    end;
    

    En el shell donde se ejecuta AOP, debería ver la conexión entrante.

    Es de esperar que los pasos a continuación le brinden más información sobre la falla de su conexión para que pueda corregirla en consecuencia.

    16 FAQ

    -) ¿El AOP debe ir en su propio servidor, el servidor de la base de datos o el servidor de la aplicación (ORDS)?

    Tu puedes elegir. Tener AOP en el mismo servidor que la máquina de la base de datos es más performante y fácil ya que no tiene conexiones de red a otros servidores. Si instala AOP en su propio servidor, puede dimensionar y supervisar mejor ese servidor. El AOP en el servidor de aplicaciones es otra opción, siempre que la base de datos se pueda conectar al plugin del servidor AOP, el servidor AOP no necesita ser accesible desde el exterior (clientes). Por lo tanto, l selección depende de qué es más cómodo para ti.

    -) ¿Hay algo especial que tengamos que ver con AOP para que funcione con SSL?

    Puede agregar un proxy reverse para SSL o puede especificar el certificado https al iniciar el servidor AOP. La mayoría de las personas no hacen SSL, ya que solo es la base de datos la que necesita acceder al plugin del servidor AOP, por lo que normalmente ni siquiera pasa la red a otros lugares. Sin embargo, AOP puede comenzar en modo SSL si el certificado SSL y su clave se proporcionan a través del argumento --https_key y --https_cert.

    -) ¿Qué tanto recursos necesita? ¿Se consume una gran cantidad de CPU, RAM o espacio en el disco duro?

    Depende de la cantidad de impresiones que haga ... AOP inicialmente consume aproximadamente 200 MB de RAM, pero dependiendo de las impresiones puede llegar hasta 2 GB (un límite que ponemos). Puede enviar un correo electrónico a support@apexofficeprint.com si desea un servidor AOP que pueda consumir más memoria (hasta 4, 8 o 16 GB). La CPU no es mucho en comparación con las especificaciones en estos días y el espacio en el disco duro es de aproximadamente 200 MB. El ejecutable es de aproximadamente 200 MB y podríamos crear algunos archivos temporales (durante la conversión de PDF) y un archivo de registro y error.

    -) ¿Tengo que instalar LibreOffice cuando necesitamos solo resultados de Word y Excel?

    No, LibreOffice o MS Office solo se usan cuando desea convertir de un formato a otro. Entonces Word-Word o Excel-Excel está trabajando sin él. Pero si quiere hacer, por ejemplo, Word -> PDF, necesita LibreOffice o MS Office.

    -) ¿Puede AOP imprimir directamente en una impresora?

    AOP 3.1 y superior incluye la capacidad de imprimir directamente en una impresora IP, siempre que esté disponible desde el servidor en el que se ejecuta el AOP. Si desea imprimir en una impresora local, compruebe la aplicación de ejemplo cómo imprimir en una región en línea, agregando un poco de JavaScript a la acción dinámica, puede permitir que el navegador aparezca automáticamente con una ventana de impresión.

    -) ¿Se puede repetir el encabezado de tabla en Word y Excel?

    Sí, esta es una configuración en Office. Cuando hace clic con el botón derecho en su fila de encabezado en Word, puede ir a Propiedades de tabla - Fila y marcar "Repetir como fila de encabezado en la parte superior de cada página". Se da un ejemplo en la página 113 de la aplicación de ejemplo.

    -) ¿AOP admite Pivots en Excel?

    Sí, puede usar la función de transposición en Excel para pivotar sus datos.

    -) ¿Por qué hay una diferencia entre una salida en Word y PDF?

    Al pasar de Word a PDF, usamos un convertidor externo: MS Office o LibreOffice. Puede ser que si su plantilla se compiló en su escritorio en MS Office (Word), pero su servidor está usando LibreOffice (Linux), una fuente es diferente o hay cambios mínimos. La forma más sencilla de descubrir cuál es la diferencia es abrir la plantilla en LibreOffice en su escritorio y ver por qué LibreOffice la trata de manera diferente. En la mayoría de los casos de uso funciona muy bien yendo de uno a otro, pero a veces está en los detalles.

    -) ¿Puedo instalar el plugin de APEX en alguna parte para que todas mis aplicaciones tengan acceso a él?

    Puede instalar el paquete de PL/SQL aop_api3_pkg en un esquema público. El plugin de Oracle APEX en sí mismo aún lo tendría que importar en cada aplicación APEX en la que quiera usarlo, pero el plugin puede apuntar al paquete público.

    17 Plantillas de Ejemplo

    A continuación ilustramos algunas plantillas de ejemplo y el resultado generado.

    Ejemplo 1

    Esta es la plantilla de entrada:

    Este es el resultado después de que AOP haya procesado la plantilla y los datos dados:

    Ejemplo 2

    Esta es la plantilla de entrada:

    Este es el resultado después de que AOP haya procesado la plantilla y los datos dados:

    Ejemplo 3

    Esta es la plantilla de entrada:

    Este es el resultado después de que AOP haya procesado la plantilla y los datos dados:

    Ejemplo 4

    Esta es la plantilla de entrada:

    Este es el resultado después de que AOP haya procesado la plantilla y los datos dados:

    Derechos de autor

    Copyright © 2015-2018, APEX R&D

    Todos los derechos reservados.

    Autores: Dimitri Gielis, Sunil Tandan y Lino Schildenfeld

    Traducción de la documentación del software al Español: Clarisa J. Maman Orfali

    Este software y la documentación relacionada se proporcionan bajo un acuerdo de licencia que contiene restricciones de uso y divulgación que están protegidas por las leyes de propiedad intelectual. Excepto lo expresamente permitido en su acuerdo de licencia o permitido por la ley, no puede usar, copiar, reproducir, traducir, transmitir, modificar, licenciar, transmitir, distribuir, exhibir, interpretar, publicar o mostrar cualquier parte, en cualquier forma, o por cualquier medio. Se prohíbe la ingeniería inversa, el desmontaje o la descompilación de este software, a menos que lo exija la ley para la interoperabilidad. La información contenida en este documento está sujeta a cambios sin previo aviso y no se garantiza que esté libre de errores. Si encuentra algún error, infórmenos por escrito.