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