miércoles, 1 de julio de 2015

Creación de un archivo PDF desde PL/SQL de Oracle


Es posible generar archivos PDF desde Oracle?

Buscando por la web encontre un paquete AS_PDF que permite generar archivos PDF con el formato que necesitemos, viendo los ejemplos es muy completa y la podemos adaptar a nuestras necesidades, pero dependiendo del contenido va a depender la complejidad de armar un archivo PDF.

Este post fue realizado con la referencia de ejemplos de la siguiente pagina:
https://technology.amis.nl/2010/10/20/as_pdf-generating-a-pdf-document-with-some-plsql/

Voy a dar unos ejemplos sencillos de como utilizar el paquete, pero antes de usar los ejemplos  primero hay que descargar el código del paquete AS_PDF_MINI y compilarlo:
AS_PDF_MINI.PKS
AS_PDF_MINI.PKB

Creación archivo PDF con AS_PDF_MINI

Una vez creado el paquete AS_PDF_MINI tenemos que definir un directorio en el host y crear el directorio en la BD para poder guardar los archivos PDF generados.

Directorio del host de BD D:\PDF

Creamos el directorio en la BD

CREATE OR REPLACE DIRECTORY PDF AS 'D:\PDF';

Ejemplo 1
Generación de un archivo PDF simple
begin
as_pdf_mini.init;
as_pdf_mini.write( 'Esto es una prueba para la creacion de un PDF desde una rutina PL/SQL.' );
as_pdf_mini.write( 'Por cada linea escrita por as_pdf_mini.write() se agrega en la linea siguiente. Sin embargo el texto se ajuasta automaticamente en la nueva linea .' );
as_pdf_mini.write( 'Tambien existe la posibilidad de poner el texto en cualquier lugar ubicando las coordenadas', -1, 700 );
as_pdf_mini.write( 'Asi es', 100, 650 );
as_pdf_mini.write( 'Tambien tienes la capacidad de alinear el texto a las izquierda, derecha y centrada', p_y => 600, p_alignment => 'right' );
--P_DIR directorio donde se almacenara el archivos,P_FILENAME nombre del archivo
as_pdf_mini.save_pdf(p_dir=>'PDF',p_filename=>'EjemploPDF.pdf');
end;

El archivo EjemploPDF.PDF se generará en la ruta D:\PDF
Ejemplo del archivo generado


Ejemplo 2
Creaciónn de lineas verticales y horizontales
begin
    as_pdf_mini.init;
    for i in 1 .. 10 loop
        as_pdf_mini.horizontal_line( 30, 700 - i * 15, 100, i );
    end loop;
    for i in 1 .. 10 loop
        as_pdf_mini.vertical_line( 150 + i * 15, 700, 100, i );
    end loop;
    for i in 0 .. 255 loop
        as_pdf_mini.horizontal_line( 330, 700 - i, 100, p_line_color => to_char( i, 'fm0x' ) || to_char( i, 'fm0x' ) || to_char( i, 'fm0x' ) );
    end loop;
    --P_DIR es el directorio donde se almacenara los archivos,P_FILENAME es el nombre del archivo que se va a generar
    as_pdf_mini.save_pdf(p_dir=>'PDF',p_filename=>'EjemploPDF_2.pdf');
end;

El archivo EjemploPDF_2.PDF se generará en la ruta D:\PDF
Archivo generado

Ejemplo 3
Manejo de los tipo de lestras y fornato de hoja
begin
as_pdf_mini.init;
--p_format formato de la hoja, p_orientation direccion de la hoja PORTRAIT o LANDSCAPE
AS_PDF_MINI.SET_FORMAT(p_format=>'A4',p_orientation=>'PORTRAIT');
as_pdf_mini.write( 'La versión mini de AS_PDF se limita a los 14 PDF- fuentes estándar y la codificación WINDOWS- 1252.' );
as_pdf_mini.set_font( 'helvetica' );
as_pdf_mini.write( 'helvetica, normal: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, 700 );
as_pdf_mini.set_font( 'helvetica', 'I' );
as_pdf_mini.write( 'helvetica, italic: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'helvetica', 'b' );
as_pdf_mini.write( 'helvetica, bold: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'helvetica', 'BI' );
as_pdf_mini.write( 'helvetica, bold italic: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'times' );
as_pdf_mini.write( 'times, normal: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, 625 );
as_pdf_mini.set_font( 'times', 'I' );
as_pdf_mini.write( 'times, italic: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'times', 'b' );
as_pdf_mini.write( 'times, bold: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'times', 'BI' );
as_pdf_mini.write( 'times, bold italic: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'courier' );
as_pdf_mini.write( 'courier, normal: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, 550 );
as_pdf_mini.set_font( 'courier', 'I' );
as_pdf_mini.write( 'courier, italic: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'courier', 'b' );
as_pdf_mini.write( 'courier, bold: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'courier', 'BI' );
as_pdf_mini.write( 'courier, bold italic: ' || 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
--
as_pdf_mini.set_font( 'courier' );
as_pdf_mini.write( 'symbol:', -1, 475 );
as_pdf_mini.set_font( 'symbol' );
as_pdf_mini.write( 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
as_pdf_mini.set_font( 'courier' );
as_pdf_mini.write( 'zapfdingbats:', -1, -1 );
as_pdf_mini.set_font( 'zapfdingbats' );
as_pdf_mini.write( 'Guayaquil es la perla del pacifico. 1234567890', -1, -1 );
--
as_pdf_mini.set_font( 'times', 'N', 20 );
as_pdf_mini.write( 'times, normal with fontsize 20pt', -1, 400 );
as_pdf_mini.set_font( 'times', 'N', 6 );
as_pdf_mini.write( 'times, normal with fontsize 5pt', -1, -1 );
--P_DIR es el directorio donde se almacenara los archivos,P_FILENAME es el nombre del archivo que se va a generar
as_pdf_mini.save_pdf(p_dir=>'PDF',p_filename=>'EjemploPDF_3.pdf');
end;

El archivo EjemploPDF_3.PDF se generará en la ruta D:\PDF

Ejemplo 4
Inserción de una imagen en el documemento PDF, para ello ubicaremos una imagen BARCELONA.JPG dentro de la ruta del host D:\DMP para que sea leida e insertada en el documento.
begin
    as_pdf_mini.init;
    as_pdf_mini.set_format(p_format=>'A4',p_orientation => 'PORTRAIT');
    as_pdf_mini.put_image (p_dir=> 'PDF',p_file_name=>'BARCELONA.jpg',p_x=>130, p_y => 500);  
    as_pdf_mini.set_font( 'times', 'N', 24 );
    as_pdf_mini.write( p_txt=>'BARCELONA CAMPEON', p_Y=> 500,  p_alignment=>'center' );
    --se presenta imagen en dimension especifica

    as_pdf_mini.put_image (p_dir=> 'PDF',p_file_name=>'BARCELONA.jpg',p_x=>10, p_y => 300, p_width=>100,  p_height=>100); 
    as_pdf_mini.save_pdf(p_dir=>'PDF',p_filename=>'EjemploPDF_4.pdf');
end;

El archivo EjemploPDF_4.PDF se generará en la ruta D:\PDF

17 comentarios:

  1. Hola Víctor,

    Tu aporte es genial y mas para explotar ya que tiene una estructura muy compleja para que efectué la magia de formar el PDF.

    Seria genial que se pudiera sacar lo básico de para poder hacer un PDF muy simple y dentro de este traiga los resultados de una consulta.

    ResponderEliminar
  2. tiene salto de pagina pero no salto de linea, cual es el comando por favor?

    ResponderEliminar
  3. Hola, pregunta, ¿Para poder generar un archivo con tablas, tendrás un ejemplo?

    ResponderEliminar
    Respuestas
    1. Hola Luis, estoy trabajando en ello, si tengo resultados positivos, te regalaré el proceso. un saludo

      Eliminar
    2. Hola, buen día.

      Actualmente tengo un documento RTF almacenado en una columna CLOB de una tabla en Oracle 18c, necesito convertir este archivo RTF en un PDF y almacenarlo en una columna BLOB de la misma tabla.

      ¿Sabes cómo podría hacer esto?

      Eliminar
  4. Hola, pregunta, ¿Para poder generar un archivo con tablas, tendrás un ejemplo?

    ResponderEliminar
  5. una pregunta

    el paquete es bueno pero es lo siguiente:

    como se debe hacer cuando el texto ocupa mas de dos lineas?

    ResponderEliminar
  6. el paquete es bueno pero es lo siguiente:

    como se debe hacer cuando el texto ocupa mas de dos lineas?

    mi correo es hencalo@hotmail.com

    ResponderEliminar
  7. hola buenas, necesito generar un reporte con pl sql, no saben como podria hacer, ya que tiene que llevar el resultado de consultas

    ResponderEliminar
  8. si alguien sabe que me pueda ayudar? se lo agradezco
    mi correo es: caqg1996@gmail.com

    ResponderEliminar
  9. Erro a partir da linha : 2 no comando -
    begin
    as_pdf_mini.init;
    as_pdf_mini.write( 'Esto es una prueba para la creacion de un PDF desde una rutina PL/SQL.' );
    as_pdf_mini.write( 'Por cada linea escrita por as_pdf_mini.write() se agrega en la linea siguiente. Sin embargo el texto se ajuasta automaticamente en la nueva linea .' );
    as_pdf_mini.write( 'Tambien existe la posibilidad de poner el texto en cualquier lugar ubicando las coordenadas', -1, 700 );
    as_pdf_mini.write( 'Asi es', 100, 650 );
    as_pdf_mini.write( 'Tambien tienes la capacidad de alinear el texto a las izquierda, derecha y centrada', p_y => 600, p_alignment => 'right' );
    as_pdf_mini.save_pdf(p_dir=>'PDF',p_filename=>'EjemploPDF.pdf');
    end;
    Relatório de erros -
    ORA-29283: operação de arquivo inválida
    ORA-06512: em "SYS.UTL_FILE", line 536
    ORA-29283: operação de arquivo inválida
    ORA-06512: em "DBAMV.AS_PDF_MINI", line 1186
    ORA-06512: em line 8
    29283. 00000 - "invalid file operation"
    *Cause: An attempt was made to read from a file or directory that does
    not exist, or file or directory access was denied by the
    operating system.
    *Action: Verify file and directory access privileges on the file system,
    and if reading, verify that the file exists.

    ResponderEliminar
  10. Hola Victor. Me genere el archivo, pero me sale en blanco.

    ResponderEliminar
  11. Hola, será posible poder agregarle una firma digital al PDF?

    ResponderEliminar
  12. Cómo saber cuando crear una nueva pagina cuando el reporte es extenso de más de una página?

    ResponderEliminar
  13. Hola, alguien tendra alguna solucion para agregar password al pdf de salida..se lo agradeceria.

    ResponderEliminar
  14. Hola, buen día a todos.

    Actualmente tengo un documento RTF almacenado en una columna CLOB de una tabla en Oracle 18c, necesito convertir este archivo RTF en un PDF y almacenarlo en una columna BLOB de la misma tabla. ¿Saben cómo podría hacer esto?

    ResponderEliminar