RciTools RPDF - Génération de documents PDF depuis Oracle
70-Génération de codes barre EAN 13 / UPC dans un document PDF
Lors de la génération de planches d'étiquettes, de pages de catalogues, de bons
de commande, il peut être utile de générer, en format PDF, des codes à barre.
Dans les années 90, nous avions développé une
bibliothèque de procédures en langage Pascal (pour Macintosh et Windows) et une
bibliothèque PL/SQL de génération de codes à barre, ces deux bibliothèques
générant du langage PostScript.
La génération de catalogues de plusieurs centaines de pages, comportant chacune
des dizaines de codes a barre, devait permettre d' utiliser des imprimantes
laser de bureau (avec Adobe PostScript), à leur vitesse maximale.
La solution d'utiliser des "polices codes à barre" aurait été possible, mais
posait des problèmes de performances.
C'est pourquoi la solution retenue a consisté à "dessiner complètement" les
codes à barre, en tenant compte des algorithmes d'entrelacement et de
correspondance entre les 13 chiffres d'une chaîne de caractère, et les 95
positions pouvant comporter une trait vertical noir ou blanc.
C'est cette bibliothèque PL/SQL PostScript que nous avons adapté, toujours en
PL/SQL, à la génération de langage PDF.
L'instruction EAN13 reçoit, dans l'ordre, les arguments suivants :
bc une chaîne de caracères de 13
chiffres, x , y
la position d'écriture dans la page courante,
h la hauteur du code
barre, sb un facteur d'échelle (1
correspondant à la taille "standard").
La valeur textuelle du code à barre est écrite, en gris, en dessous du code à barre, avec ajustement à la largeur totale.
begin
RPDF.New;
RPDF.EAN13 ('3700173211995', 10, 400, 30, 1);
RPDF.EAN13 ('8711875955693', 10, 320, 30, 1);
RPDF.EAN13 ('3700173207448', 10, 240, 30, 1);
RPDF.EAN13 ('3700173211995', 20, 160, 20, 0.8);
RPDF.EAN13 ('8711875955693', 20, 80, 40, 1.2);
RPDF.EAN13 ('3700173207448', 20, 20, 15, 1.5);
RPDF.Show; -- Termine la page PDF en cours, et le document PDF
end;
71-Préparation de données d'une table comportant des codes barres
Les données pour cet exemple de liste d'ouvrages informatiques et de littérature
se trouvent dans une table nommée PDF_References.
On affiche les données dans un document PDF avec les instructions
DoSQL pour obtenir les données, puis
Write pour les placer en tant que tableau dans la
page PDF.
declare
CS1 RPDF.CellsSpace;
r integer; w varchar2(4000);
begin
RPDF.New;
w := 'select PDF_REF_NUM,
PDF_REF_TITLE,
substr (PDF_REF_Author,1,60),
PDF_Ref_Ean13
from PDF_References order by 1';
RPDF.DoSQL (rSQL=>w, CS=>CS1, res=>r, rowsMax=>16);
RPDF.Tsize (9);
RPDF.Write ( cs=> CS1);
RPDF.Show; -- Termine la page PDF en cours, et le document PDF
end;
72-Affichage de textes et de codes barres depuis une requête SQL
On commence par obtenir les données, à partir d'une requête SQL, avec l'instruction DoSQL.
Puis on réalise une boucle.
La fonction Dn permet d'obtenir la m ième ligne du
résultat présent dans la colonne de nom ean13.
On calcule ensuite dans wY la position verticale de la n-ième donnée.
Puis on utilise l'instruction EAN13 en spécifiant
de façon explicite que l'on veut dessiner le code barre
à la ,position 10 pour l'argument x
et wY -12, pour l'argument y,
avec un facteur de réduction de 0.8 et une hauteur de barres de 15
points.
Enfin on écrit le titre de l'ouvrage, par l'instruction Write, le texte étant obtenu par la fonction Dn, avec des attributs typographiques et de position indiqués explicitement.
declare
CS1 RPDF.CellsSpace;
r integer; w varchar2(4000); wY number;
begin
RPDF.New;
w := 'select PDF_REF_TITLE as title,
PDF_Ref_Ean13 as Ean13
from PDF_References order by 1';
RPDF.DoSQL (rSQL=>w, CS=>CS1, res=>r, rowsMax=>16);
for m in 1..10 loop
w := RPDF.Dn (CS1, 'ean13', m);
wY := 500 - m*40;
RPDF.EAN13 (w ,10, wY - 12, 15, 0.8);
w := RPDF.Dn (CS1, 'title', m);
RPDF.Write (t=> w, tSize=>12, x=>100, y=>wY, color=>'red',
tBold=>true, tItal =>true);
end loop;
RPDF.Show; -- Termine la page PDF en cours, et le document PDF
end;
La fonction Dn permet d'obtenir la valeur du champ d'une colonne et d'une ligne.
Deux modes de désignation des colonnes avec Dn sont possibles: par nom ou par
numéro.
RPDF.Dn (CS1, 'PDF_Ref_Ean13', m)
renvoie la valeur de la ligne m de la colonne nommée PDF_Ref_Ean13.RPDF.Dn(CS1, 2, m)
renvoie la valeur de la ligne m de la deuxième colonne (par rapport à l'ordre des éléments suite au SELECT de la requête SQL)
On calcule ensuite le chemin d'accès dans le répertoire Oracle/XDB, on ajoute
l'image au référentiel PDF avec AddImage et enfin
on place cette image dans la page PDF avec DrawImage.
declare
CS1 RPDF.CellsSpace;
r integer; w varchar2(4000); wY number;
n integer;
WebDavPath varchar2(100):='/public/ean/';
begin
RPDF.New;
w:='select PDF_REF_NUM,
PDF_REF_TITLE,
PDF_Ref_Ean13 from
PDF_References
where PDF_REF_Num in (3,5,7,8)
order by 1 desc';
RPDF.DoSQL (rSQL=>w, CS=>CS1, res=>r);
for m in 1..CS1.Rows.count loop
w := RPDF.Dn (CS1, 'PDF_Ref_Ean13', m);
wY := 500 - m*100;
RPDF.EAN13 (w ,95, wY - 12, 15, 0.8);
w:=RPDF.Dn(CS1, 2, m);
RPDF.Write (t=> w, tSize=>12, x=>180, y=>wY, color=>'blue');
w := WebDavPath || RPDF.Dn (CS1, 1, m) || '.jpg';
n := RPDF.AddImage(webDavFile=>w, iHeight=>500, iWidth=>500);
RPDF.DrawImage (num=>n, x=>0, y=>wY-30, Height=>90, Width=>90);
end loop;
RPDF.Show;
end;
Voici les deux instructions à substituer dans l'exemple ci-dessus pour accéder à des images stockées, non pas dans Oracle/XDB, mais dans un répetoire, sur le web. Dans ce cas on utilise l'argument httpFile de l'instruction AddImage:
-- URLpath est un variable comportant l'adresse URL du
répertoire où les images sont stockées
w := URLpath || RPDF.Dn (CS1, 1, m) || '.jpg';
n := RPDF.AddImage(httpFile=>w);
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