RciTools RPDF - Génération de documents PDF depuis Oracle

 

14-Tracés de lignes

Line  trace une ligne depuis la position  x1,y1 jusqu'à la position x2,y2
SetDraw permet de changer les paramètres courants des tracés de ligne, et de rectangles.

L'argument BorderColor indique la couleur du trait.
BorderSize indique l'épaisseur du trait.
Les tailles sont des nombres entiers ou réels, en "points".
La précision dans la génération des dimensions comporte la partie entière et 3 décimales.
 

L'appel des différentes instructions doit commencer par le "nom du package", qui est RPDF.
Le package peut être "appelé" d'un schéma Oracle différent, en spécifiant ce droit  (Grant execute ...).

begin
  RPDF.New;

  RPDF.Line (x1=>20, y1=>500, x2=>220, y2=>470);

  RPDF.SetDraw (BorderColor => 'rouge', BorderSize => 5);
  RPDF.Line (x1=>20, y1=>480, x2=>220, y2=>450);

  RPDF.SetDraw (BorderColor => 'rouge clair', BorderSize => 3);
  RPDF.Line (x1=>20, y1=>460, x2=>220, y2=>430);

  RPDF.SetDraw (BorderColor => 'vert sapin', BorderSize => 2);
  RPDF.Line (x1=>20, y1=>440, x2=>220, y2=>410);

  RPDF.SetDraw (BorderColor => 'bleu pale');
  RPDF.Line (x1=>20, y1=>420, x2=>220, y2=>390);

  RPDF.Show;
end;

 


15-Tracé de rectangles


 

Rect  trace un rectangle.
  soit depuis la position  x1,y1 jusqu'à la position x2,y2
  soit depuis la position  x,y avec une largeur de width et une hauteur de height

SetDraw permet également de déterminer FillColor, la couleur de remplissage.

Comme pour les lignes, l'argument BorderColor indique la couleur et BorderSize indique l'épaisseur du trait.
 

begin
  RPDF.New;

  RPDF.SetDraw (FillColor=>'blanc');
  RPDF.Rect (x=>20, y=>480, width=>150, height=>30);

  RPDF.Rect (x=>20, y=>80, width=>100, height=>100);

  RPDF.SetDraw (FillColor=>'bleu');
  RPDF.Rect (x=>20, y=>440, width=>200, height=>30);

  RPDF.SetDraw (FillColor=>'bleu clair', BorderSize=>4);
  RPDF.SetDraw (BorderColor => 'marron clair');
  RPDF.Rect (x=>20, y=>385, width=>400, height=>40);

  RPDF.Rect (x1=>20, y1=>330, x2=> 400+20, y2=> 330-40);

  RPDF.SetDraw (BorderColor => 'bleu', FillColor=>'jaune pale');
  RPDF.Rect (x=>80, y=>235, width=>200, height=>200); -- carré

  RPDF.Show;
end;

 


16-Echantillons des couleurs prédéfinies

Dans cet exemple, on accède à la structure de définition des variables PDF.
On lit le contenu de toutes les couleurs prédéfinies, ainsi que leurs noms français.
Ces couleurs sont obtenues par l'instruction GetColors qui remplit une table de chaînes de caractères.

Le package RPDF définit en effet un ensemble de types utiles à la résolution de requêtes SQL, aux tableaux et à la gestion de données.
Le type TableStr offre une structure sous forme de table PL/SQL.
Pour chaque couleur, on écrit son nom, puis on dessine un rectangle présentant un échantillon de cette couleur.

Afin que les 33 couleurs prédéfinies occupent la hauteur de la page (B5 en format "paysage"), la police sera définie à une taille de 11.8 points et la hauteur des rectangles sera de 8 points.
L'instruction Write tient en effet compte de la taille de la police "courante" pour passer "à la ligne", sans devoir calculer la nouvelle position verticale.

Par contre, en ce qui concerne la tracé des rectangles colorés, on a besoin de connaître les coordonnées du 1er point.
On obtient la position verticale "courante" grace à la variable  wd.LastTxtY

declare
  w RPDF.TableStr; py number;
  wColorName varchar2 (100);

begin
  RPDF.New;

  RPDF.Tsize (11.8);
  w := RPDF.GetColors;

  for m in 1..w.count loop
    wColorName := w(m);
    RPDF.Write (t=>wColorName, color=>'bleu');

    RPDF.SetDraw (FillColor=>WcolorName, BorderSize=>0);
    py := RPDF.wd.LastTxtY; -- dernière position verticale texte
    RPDF.Rect (x=>110, y=>py, width=>100, height=>8);
  end loop;

  RPDF.Show;
end;


17-Echantillon des couleurs prédéfinies avec noms français et anglais

Cet exemple est similaire au précédent.
On accède aux définitions des couleurs, toujours avec l'instruction GetColors mais en utilisant l' argument facultatif nommé EnglishNames.
Cet argument, s'il est égal à true, provoque la "fourniture" des noms de couleurs en anglais.

On utilise dans cet exemple deux tables de noms de couleurs, respectivement nommées wE et wF

declare
  wE RPDF.TableStr;
  wF RPDF.TableStr;
  py number;

begin
  RPDF.New; RPDF.Tsize (11.8);

  wF := RPDF.GetColors (EnglishNames => false);
  wE := RPDF.GetColors (EnglishNames => true);

  for m in 1..wE.count loop
    RPDF.Write (t=> wE(m), x=>20, color=>'blue');

    RPDF.SetDraw (FillColor=>wE(m), BorderSize=>0);
    py := RPDF.wd.LastTxtY; -- dernière position verticale texte

    RPDF.Rect (x=>110, y=>py, width=>100, height=>8);

    RPDF.Write (t=> wF(m), x=>223, y=>py, color=>'gris fonce');
  end loop;

  RPDF.Show;
end;

 


18-Titres automatiques

L'instruction title permet de définir des titres automatique, avec un cadre ajusté "autour" du texte.

Les instructions SetLineW , SetDrawBorderColor et SetDrawFillColor permettent de définir l'épaisseur du contour, les couleurs de cadre et de fond des rectangles, avec un seul argument

declare
  py number;

begin
  RPDF.New;

  RPDF.title (t=>'Bonjour', x=>120, y=>450);

  RPDF.Tfont ('Helvetica'); RPDF.Tsize (24); RPDF.SetDrawFillColor ('pale blue');
  RPDF.title (t=>'Bonsoir les amis', x=>120, y=>350);

  RPDF.SetDrawFillColor ('light pale green'); RPDF.SetDrawBorderColor ('red');
  RPDF.SetLineW (3); RPDF.Tsize (28);
  RPDF.title (t=>'Il fait beau', x=>120, y=>250);

  RPDF.Show;
end;

 


19-Définition de couleurs personnalisées

Cet exemple montre comment définir de nouvelles couleurs,  de façon complémentaire aux couleurs prédéfinies.

L'instruction AddColor ajoute une nouvelle couleur, définie par ses noms français et anglais, et par ses 3 composantes RVB, chaque composante étant un nombre entier entre 0 et 255.

Afin que les 25 couleurs "tiennent" dans la page, le corps a été réduit de 10.8 points à 10.0 points.

declare
  w RPDF.TableStr;
  py number;
  wColorName varchar2 (100);

begin
  RPDF.New;

  RPDF.Tsize (10);

  RPDF.AddColor ('ma Couleur 1','my Color 1', 255 , 74, 137);

  RPDF.AddColor ('ma Couleur 2','my Color 2', 183 , 255, 255);

  w := RPDF.GetColors;

  for m in 1..w.count loop
    wColorName := w(m);
   
    RPDF.Write (t=>wColorName, color=>'bleu');
    RPDF.SetDraw (FillColor=>WcolorName, BorderSize=>0);
    py := RPDF.wd.LastTxtY; -- dernière position verticale texte

    RPDF.Rect (x=>110, y=>py, width=>100, height=>8);
  end loop;

  RPDF.Show;
end;


20-Placement d'images depuis les composants partagés d' Oracle Application Express

Avec Oracle Application Express, il existe de diverses façons de gérer l'intégration d'images.

Une première méthode consiste à utiliser le stockage dans les "composants partagés".
Cette méthode permet d'ajouter et de gérer des images stockées soit dans un "espace" commun aux différentes applications, soit dans un espace spécifique à une application  (d'un "WorkSpace" Application Express).

Cette approche convient aussi bien à la version 2.1 d' Oracle Application Express incluse dans XE (Express Edition, version "gratuite" d'Oracle 10g R2)  qu'à la version 2.2 d'Oracle Application Express.

Dans l'exemple qui suit, quatre images ont été importées dans Oracle Application Express 2.1 (en utilisant uniquement un navigateur HTML) :

Puis, le programme utilisant le package RPDF va "placer" l'une de ces images, celle qui est nommée apex2.jpg
Cette image réunit deux logos, l'ancien, celui d'Oracle HTML DB et le nouveau, celui d'Oracle Application Express, sous forme d'une seule image JPEG, ayant pour dimensions 228 x 56  (en "points").

Cette image va être placée plusieurs fois dans la même page PDF, en utilisant des échelles différentes et des positions différentes :
 

On accède à l'image en utilisant un curseur sur la vue nommée htmldb_application_files.
L'information (code de l'image JPEG) est stockée dans la variable de type "blob" nommée b;

L'instruction AddImage ajoute l'image d'argument iBlob au référentiel RPDF des images.

Une image est identifiée par un numéro séquentiel.
Une fois qu'une image a été "ajoutée au référentiel", elle devient disponible pour l'ensemble des pages du document PDF, en cours de génération. Cette image peut être placée autant de fois qu'il est utile,

Un point important à noter c'est que même si une image est utilisée n fois dans un même document PDF, son code n'y sera en réalité inclus qu'une seule fois.

Ceci est une réponse aux besoins de logos ou d'image d'arrière plan que l'on souhaite utilise plusieurs fois dans un même document PDF.

Si par exemple on a besoin de générer un document PDF de 500 pages, avec la présence du même logo sur chaque page, le document PDF généré sera réduit en taille totale, puisque l'image JPEG du logo ne sera stockée qu'une seule fois dans le document PDF.

L'instruction DrawImage place l'image du référentiel RPDF ayant le numéro num à la position  x , y avec une largeur de width.

Donc cette instruction gère complètement la "mise à l'échelle" d'une image, en en conservant les proportions.

declare
  Cursor C (x in varchar2) is select blob_content
  from htmldb_application_files where FileName = x;

  b Blob := null;
  i integer;
  w integer;
  h integer;
  rh number; rw number;
  dy number; r number;

begin
  RPDF.New;

  for m in C ('apex2.jpg') loop
    b := m.blob_content;
    exit;  -- loop
  end loop;

  w := 228; h := 56;
  i := RPDF.AddImage (iBlob=>b, iWidth=> w, iHeight => h);

  for k in 1..8 loop
    r:=1-(k-1)*0.068;
    rh := h*r; rw := w*r;
    dy := 450 - (k-1)*60;

    RPDF.DrawImage (num=>i,x=>20,y=>dy,height=>rh, width=>rw);
  end loop;

  RPDF.Show;
end;


21-Placement d'image avec XDB dans un document PDF

L'objectif de cet exemple de génération de document PDF, place alternativement deux images JPEG, dans une même colonne, à des échelles décroissantes :

Ces image sont stockées dans la structure XDB intégrée à Oracle 10g R2.

C'est également en utilisant ce mécanisme que la version Oracle Application Express 2.1, fournie avec Oracle XE (Express Edition) stocke les images "statiques" d' Oracle Application Express.

Avec Windows XP on accède facilement, via les "favoris réseau", en utilisant la norme WebDAV, au fichiers statiques stockés dans Oracle XDB.

Première étape, créer un "favori réseau" :

Oracle XDB apparaît en tant que "répertoire virtuel", visible à la fois sur le "bureau" Windows, que dans un navigateur HTML.

Dans ce répertoire, on trouve en particulier, les fichiers statiques d'Oracle Application Express 2.1, qui sont stockées dans le "répertoire" i :

On peut placer, par copier coller (Windows), différentes images dans le répertoire nommé public :

L'instruction AddImage peut être utilisée avec un argument  webDavFile, comportant un chemin d'accès XDB valide pour un fichier donné.
Cette instruction utilise le package XDB d'Oracle pour "obtenir" le fichier JPEG, sous forme d'un "blob".

Dans l'exemple ci-dessous on trouve quelques lignes de calcul de position.

Puis l'utilisation de l'instruction DrawImage, comme dans l'exemple précédent.
 

declare
  b Blob;

  i RPDF.tableInt;
  w RPDF.tableInt;
  h RPDF.tableInt;

  rh number; rw number; dy number; r number; f varchar2(255); p integer;

begin
  RPDF.New;

  w(1):=129; h(1) := 39; f := '/public/oracle4.jpg';
  i(1):=RPDF.AddImage(webDavFile=>f,iWidth=>w(1),iHeight=>h(1));

  w(2):=56; h(2):= 56; f:= '/public/apex1.jpg';
  i(2):=RPDF.AddImage(webDavFile=>f,iWidth=>w(2),iHeight=>h(2));

  for k in 1..8 loop
    p := 1+ mod(k,2);
    r:=1-(k-1)*0.068;
    rh:=h(p)*r;
    rw:=w(p)*r;
    dy:=450 - (k-1)*60;

    RPDF.DrawImage(num=>i(p),x=>20,y=>dy,height=>rh,width=>rw);
  end loop;

  RPDF.Show;
end;


22-Placement dans la génération d'un document PDF d'images JPEG depuis une adresse URL

On va utiliser l'instruction AddImage avec un argument nommé httpFile qui comporte l'adresse (URL) de l'image à placer.

Le package RPDF comporte deux fonctions, permettant d'obtenir largeur et hauteur d'une image "téléchargée" depuis une adresse URL.
Ces fonctions sont nommée GetImageWidth et GetImageHeight.

declare
  i integer;
  rh integer; rw integer;
  f varchar2(255);

begin
  RPDF.New;

  f := 'http://www.rci-informatique.fr/v2003/Images/mini5749.jpg';

  i := RPDF.AddImage (httpFile=>f);
 

  rw := RPDF.GetImageWidth (i);
  rh := RPDF.GetImageHeight (i);

  RPDF.DrawImage (num=>i, x=>50, y=> 400, width=>rw, height=>rh );

  RPDF.DrawImage (num=>i, x=>50, y=> 260, width=>rw*0.8, height=>rh*0.8);

  RPDF.Show;
end;

Cette possibilité n'existe qu'avec une version standard ou entreprise d'Oracle.
En effet, la version "gratuite" Oracle XE ne comporte pas tous les packages Oracle, en particulier le package nommé OrdSys.

Avec Oracle XE on pourra donc utiliser l'une des trois méthodes suivantes de stockage des images :

- stockage dans les éléments partagés de l'espace de travail
- utilisation de XDB / WebDav
- stockage des images, sous forme de "blob",  dans des tables directement gérées par le développeur.


Retour au sommaire de génération PDF



Tous droits réservés, RCI Informatique SAS, 2004-2006

rci@wanadoo.fr

www.rci-informatique.fr