jueves, 17 de septiembre de 2015

Cómo mostrar PDF guardados en nuestro Archivo de Sistemas en Oracle APEX filtrado por Nombre de Archivo

En la entrega de hoy voy a explicar cómo mostrar un archivo PDF que está guardado en nuestro sistema de archivos seleccionando el nombre del archivo a mostrar por medio de un Select List.

Primero de todo vamos a crear una carpeta dentro del c:\ que se llame demopdf y dentro de ella vamos a colocar varios pdf de ejemplo, en mi caso he creado dos archivos llamados: demo1.pdf y demo2.pdf

Desde el SQLplus con credenciales de sysdba, creamos un directorio virtual en nuestra base de datos:

SQL> create or replace directory MY_FILES as 'c:\demopdf';


Luego le damos los permisos adecuados:

Permiso de lectura a anonymous.

SQL> grant read on directory MY_FILES to anonymous;

Grant succeeded.

Permiso de lectura a nuestro esquema.

SQL> grant read on directory MY_FILES to my_schema;

Si no conocemos el nombre de nuestro esquema podemos realizar la siguiente consulta:

SQL> select username from dba_users;

USERNAME
------------------------------
DEMO
DEMO_APEX
CURSO_APEX
APEX_050000
HR
ANONYMOUS
XDB
FLOWS_FILES
APEX_040000
CTXSYS
MDSYS

USERNAME
------------------------------
SYSTEM
SYS
APEX_PUBLIC_USER
XS$NULL
OUTLN

16 rows selected.


En mi caso estoy usando CURSO_APEX

SQL> grant read on directory MY_FILES to CURSO_APEX;

Grant succeeded.

Creamos una aplicación con 2 páginas en blanco. Vamos a asumir que la primer página es donde vamos a mostrar los PDF (id=1) y en la segunda página (id=2) es solo para llamar al procedimiento de aplicación.





En la Página 1 (Documentos PDF) vamos a crear una región de contenido estático llamada Seleccionar PDF y dentro de ella un elemento de tipo Listado de Selección cuyo origen del listado sea una lista estática.

En este caso he creado una lista estática con los nombres de los archivos que he creado de ejemplo: demo1.pdf y demo2.pdf. Claro está que se puede crear una tabla con los archivos que se disponen y que el listado se cargue a través de una lista dinámica.

En el panel de la derecha referente a propiedades del elemento de Selección de Lista P1_NOMBREARCHIVO:

En la sección Configuración:
            Acción de Página al Seleccionar: Submit Page
Nota: configuramos esto para no tener un botón que sumita la página sino que al hacer clic en el elemento P1_NOMBREARCHIVO realice la sumisión de la página y se cargue el pdf seleccionado)

Y en la sección Lista de Valores, configuramos:
            Tipo: Valores Estáticos
            Valores Estáticos: STATIC:demo1.pdf;demo1.pdf,demo2.pdf;demo2.pdf
Guardamos los cambios realizados

Crear Región de contenido estático Mostrar PDF

En esta región vamos a mostrar el PDF embebido en la misma, y para ello en el Origen de la región colocamos el siguiente código:

<div style="width:500px;height:600px;">
<embed height="100%" width="100%" name="embed_content" src="f?p=&APP_ID.:2:&APP_SESSION." type="application/pdf" />
</div>

En la URL de Apex le indicamos la página 2.

Luego, en la página 2 (Proceso) creamos el procedimiento para mostrar el PDF en el punto "Antes de Cabecera"

DECLARE
  l_lob     BFILE;
  l_length  NUMBER;
BEGIN
--
  l_lob :=  BFILENAME('MY_FILES', :P1_NOMBREARCHIVO);
  l_length := DBMS_LOB.getlength(l_lob);
  --
  htp.flush;
  htp.init;
  --
  htp.p('Content-length: ' || l_length);
  --
  htp.p('Content-Disposition: inline; filename="&REQUEST."');
  --
  -- close the headers
  owa_util.http_header_close;
  --
  -- download the BLOB
  wpg_docload.download_file(l_lob);
--
END;




En el cual vamos a indicar que el nombre del archivo se lo daremos con el Elemento
:P1_NOMBREARCHIVO

En la sección Condición indicamos que la página actual es = 2




Cuando Ejecutamos la página 1 nos muestra el PDF seleccionado de nuestro elemento de Selección de Lista.




De este modo podemos ver los PDF en nuestra aplicación APEX que están guardados en nuestro sistema de archivos.

Hasta Pronto!

2 comentarios:

  1. Clarisa, el link al articulo ya no existe. Slds

    ResponderEliminar
    Respuestas
    1. Hola Marco, si, porque este post era parte de los posts publicados en Toad World y al hacer ellos la migracion todos mis posts del año 2015 y 2016 no lo migraron. He actualizado aqui el post para que lo puedas ver. Saludos

      Eliminar