RciTools RPDF - Génération de documents PDF depuis Oracle
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;
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;
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