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’);
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.
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
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
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
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
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
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
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
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
me sirvio tu comentario, logre hacer andar el download. muchas gracias ! Pablo