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';
Directory created.

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;
Grant succeeded.

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

SQL> select username from dba_users;

En mi caso estoy usando CLARTECH.

SQL> grant read on directory MY_FILES to CLARTECH;
Grant succeeded.

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

En la Página con ID 2 (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 P2_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 P2_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:600px;height:400px;">
<embed height="100%" width="100%" name="embed_content" src="f?p=&APP_ID.:3:&APP_SESSION." type="application/pdf" />
</div>

En la URL de APEX le indicamos la página 3.

Necesitamos habilitar en nuestra aplicación que se pueda embeber los frames, para ello vamos a Componentes Compartidos –> Atributos de Seguridad –> Seguridad del Explorador:

En la opción Incluir en Marcos seleccionamos: Permitir del Mismo Origen.

Luego, en la página con ID 3 (Proceso) creamos el procedimiento para mostrar el PDF en el punto de procesamiento «Antes de Cabecera»

DECLARE
   l_blob    BLOB;
   l_bfile   BFILE;
BEGIN
   DBMS_LOB.createtemporary (l_blob, TRUE, DBMS_LOB.SESSION);
   l_bfile := BFILENAME ('MY_FILES', :P2_NOMBREARCHIVO);
   DBMS_LOB.fileopen (l_bfile);
   DBMS_LOB.loadfromfile (l_blob, l_bfile, DBMS_LOB.getlength (l_bfile));
   DBMS_LOB.fileclose (l_bfile);

   OWA_UTIL.mime_header ('application/pdf',
                         bclose_header      => FALSE);
   ------------------------------------------------------------------------
   -- establecer la longitud del contenido
   ------------------------------------------------------------------------
   HTP.p ('Content-length: ' || DBMS_LOB.getlength (l_blob));
   OWA_UTIL.http_header_close;
   ------------------------------------------------------------------------
   -- descargar el archivo y mostrarlo en el navegador
   ------------------------------------------------------------------------
   WPG_DOCLOAD.download_file (l_blob);
   ------------------------------------------------------------------------
   -- liberar recursos
   ------------------------------------------------------------------------
   DBMS_LOB.freetemporary (l_blob);

EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      NULL;
END;

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

En la sección Condición del lado del Servidor indicamos que la página actual es = 3

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

 

 

 

 

 

También podemos, en vez de crear una segunda página para que se ejecute el proceso, crear un procedimiento en nuestra base de datos desde el SQL Developer/SQLplus o directamente desde el Taller de SQL:

CREATE OR REPLACE PROCEDURE mostrar_archivos AS
  l_blob BLOB;
  l_bfile BFILE;
BEGIN
DBMS_LOB.createtemporary (l_blob, TRUE, DBMS_LOB.SESSION);
l_bfile := BFILENAME ('MY_FILES',apex_util.get_session_state('P2_NOMBREARCHIVO'));
DBMS_LOB.fileopen (l_bfile);
DBMS_LOB.loadfromfile (l_blob, l_bfile, DBMS_LOB.getlength (l_bfile));
DBMS_LOB.fileclose (l_bfile);

OWA_UTIL.mime_header ('application/pdf',
bclose_header => FALSE);
------------------------------------------------------------------------
-- establecer la longitud del contenido
------------------------------------------------------------------------
HTP.p ('Content-length: ' || DBMS_LOB.getlength (l_blob));
OWA_UTIL.http_header_close;
------------------------------------------------------------------------
-- descargar el archivo y mostrarlo en el navegador
------------------------------------------------------------------------
WPG_DOCLOAD.download_file (l_blob);
------------------------------------------------------------------------
-- liberar recursos
------------------------------------------------------------------------
DBMS_LOB.freetemporary (l_blob);

EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
END;

Luego vamos a crear un procedimiento que se ejecute On Demand, para ello vamos a Componentes Compartidos –> Procesos de Aplicación y hacemos clic en el botón Crear.

Seleccionamos en Punto: Devolución de Llamada de AJAX: Ejecute este proceso de aplicación cuando se le solicite el proceso de página.

En Código PL/SQL = mostrar_archivos;

Volvemos a la página 2 y necesitamos cambiar la región de contenido estático de Mostrar PDF para que llame el proceso y no a la página 3.

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

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

Hasta Pronto!