miércoles, 7 de mayo de 2014

Mostrar PDF guardados en nuestro File System en Oracle APEX

Nuevamente les traigo otro artículo como respuesta a una consulta donde explicaré cómo se puede mostrar documentos PDF en nuestra aplicación APEX que se encuentran guardados en nuestro sistema de archivos.

Primero de todo vamos a crear una carpeta dentro del c:\ que se llame pdfs y dentro de ella vamos a colocar un pdf de ejemplo llamado test.pdf


Desde nuestro Taller de SQL en Oracle APEX o desde el SQLplus, creamos un directorio virtual en nuestra base de datos:

create or replace directory MY_FILES as 'c:\pdfs';

Luego creamos el siguiente procedimiento llamado SHO_PDF:

CREATE OR REPLACE PROCEDURE sho_pdf
AS
   l_blob    BLOB;
   l_bfile   BFILE;
BEGIN
   DBMS_LOB.createtemporary (l_blob, TRUE, DBMS_LOB.SESSION);
   --create or replace directory MY_FILES as 'c:\pdfs'; --'/users/pdf/files'
   l_bfile := BFILENAME ('MY_FILES', 'test.pdf');
   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);
   ------------------------------------------------------------------------
   -- set content length
   ------------------------------------------------------------------------
   HTP.p ('Content-length: ' || DBMS_LOB.getlength (l_blob));
   OWA_UTIL.http_header_close;
   ------------------------------------------------------------------------
   -- download the file and display in browser
   ------------------------------------------------------------------------
   WPG_DOCLOAD.download_file (l_blob);
   ------------------------------------------------------------------------
   -- release resources
   ------------------------------------------------------------------------
   DBMS_LOB.freetemporary (l_blob);

EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      NULL;
END;
/

 Para que el procedimiento se ejecute On Deman vamos a crear un "Application Process" para ello vamos a Componentes Compartidos"


En el punto de proceso colocamos: On Demand.... y en el texto del proceso = sho_pdf;


Creamos en nuestra aplicacion en Apex una Region HTML o PL/SQL con el siguiente código:

htp.p('PDF Embebido abajo<br><br>');
htp.p('<object data="f?p=&APP_ID.:10:&APP_SESSION.:APPLICATION_PROCESS=DO_SHO_PDF" type="application/pdf" width="500" height="500">  alt : <a href="f?p=&APP_ID.:10:&APP_SESSION.:APPLICATION_PROCESS=DO_SHO_PDF">test.pdf</a></object>');
--htp.p('<br>pdf IFRAME below<br>');
--htp.p('<iframe src="f?p=&APP_ID.:10:&APP_SESSION.:APPLICATION_PROCESS=DO_SHO_PDF" width="500" height="500" frameborder="1"><p>Your browser does not support iframes.</p></iframe>');
--htp.p('<br>2 pdfs above');


En mi caso estoy usando la pagina 10, ustedes pondrán la que corresponda.

Ejecutamos la página y como podemos ver dentro de la región HTMLse visualiza el archivo PDF localizado en nuestro file system.


Nota relacionada con el siguiente topic del foro de OTN Ver Aqui

Mostrar PDF guardados en nuestro File System en Oracle APEX filtrado por Nombre de Archivo
Ver Aquí 

8 comentarios:

  1. Buenas tardes Clarisa, como le puedo pasar un parametro que sea el nombre del fchero pdf.

    yo tengo hecho el procedimiento sho_pdf( parametro_pdf varchar2)
    y en la linea --> l_bfile:=BFILENAME('PEDIDOS',parametro pdf');

    despues en componentes compartidos y procesos de aplicacion
    tengo el proceso DO_SHO_PDF y en el codigo tengo puesto
    sho_pdf(:p18_NOMBRE_FICHERO) siendo :P18_NOMBRE_FICHERO un campo de la pagina 18 que tiene el nombre del fichero que quiero mostrar. No se si es así pero no me muestra nada. Me podrías decir si me estoy equivocando en algo, te lo agradecería.

    Un saludo
    Víctor de Luis

    ResponderEliminar
  2. Hola Victor, lo que tienes que usar el la funcion BFILENAME que ves en el procedimiento, aqui te dejo documentacion de la misma: http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions012.htm#SQLRF00610
    Por otro lado, porque le pasas un parametro al proceso DO_SHO_PDF si no usa parametro?
    Si llego a tener algun tiempo te muestro en otro articulo como le pasas el nombre del fichero, no se si sera esta semana.
    Por ahora mira la documentación.
    Saludos

    ResponderEliminar
  3. Buenos días Clarisa
    Una cosa es el componente compartido proceso de aplicación DO_SHO_PDF y otro es el procedimiento de base de datos SHO_PDF, como bien explicastes asociado en el cuerpo al DO_SHO_PDF..

    Yo le paso al procedimiento SHO_PDF(parametro_pdf varchar2), el parámetro para pasarle el nombre del pdf.

    Ahora lo que me falla es que en la página 18, tengo un campo :P18_NOMBRE_FICHERO, y ese es el que le quiero pasar al procedimiento, y no se como, ya que yo se lo pongo en el componente compartido proceso de aplicacion DO_SHO_PDF, en el código SHO_PDF ( :P18_NOMBRE_FICHERO), y no me hace nada.

    Muchas gracias por el interés en contestarme, muy agradecido.
    Saludos
    Víctor de Luis

    ResponderEliminar
  4. Buenas tardes Clarisa, me falla el parámetro que le paso al procedimiento como que no coge nada, nulo, de la pagina 18, cuando yo lo estoy viendo en pantalla Nombre fichero = 00000126.pdf

    opcion a) sho_pdf(:p18_nombre_fichero); --> no funciona

    opcion b) sho_pdf('00000126.pdf'); -> si funciona

    Porque no le llega al procedimiento el valor del campo, es un campo de base de datos.

    Te agradecería me ayudaras, ya que estoy bloqueado en este punto. y me estoy volviendo loco, ya no se lo que tocar para que funcione.

    Saludos
    Víctor de Luis


    ResponderEliminar
  5. MIra Victor el procedimiento que se creó no recibe parametros por eso es que no te funciona, cuando un procedimiento recibe parametros debe estar definido entre parentesis en el procedimiento por ejemplo my_procedimiento( variable IN VARCHAR2).
    Hay que revisar el codigo y adaptarlo a lo que tu necesitas, no es simplemente enviar el parametro al procedimiento.
    Cuando pueda busco algun ejemplo de ello. Saludos
    Clarisa

    ResponderEliminar
  6. Buenos días Clarisa, el parámetro del procedimiento lo tengo declarado como

    SHO_PDF( p_pdf varchar2)

    Y dentro del procedimiento en donde tu tienes 'test.pdf' lo he sustituido por p_pdf

    Y como te indico en las opciones del comentario anterior, si pongo el parámetro a mano o sea '00000126.pdf' SI ME FUNCIONA, lo que no logro es que se trague el :P18_NOMBRE_FICHERO, lo pasa a nulo. desde la pagina.

    La pagina 18 tiene una región con varios campos de base de datos y entre ellos está el P18_NOMBRE_FICHERO, y en otra región es en donde he puesto el código que tu me has puesto para visualizar el pdf.

    Pregunto: ¿¿EL campo P18_NOMBRE_FICHERO tiene que estar en la regíón en la que muestro el pdf de forma oculta.??

    Muchas gracias por responder
    Saludos
    Víctor de Luis

    ResponderEliminar
  7. Buenos días Clarisa, te agredecería si me puedes ayudar con este tema.
    estoy bloqueado y no puedo seguir con mi proyecto.
    Saludos
    Víctor de Luis

    ResponderEliminar
  8. Hola Victor, he creado un nuevo pots expliando como hacer lo que necesitas pero usando otro codigo PL/SQL, puedes ver el post aqui: http://descubriendooracle.blogspot.com/2014/05/mostrar-pdf-guardados-en-nuestro-file_19.html

    Saludos

    ResponderEliminar