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;


73-Exemple de page de catalogue générée automatiquement en PDF, comportant texte, image et codes à barre UPC, depuis une requête SQL à Oracle




Dans cet exemple, on utilise des images stockées dans un répertoire Oracle XDB auquel on a accédé avec WebDAV pour y placer ces images.

Ceci est le mode le plus simple de stockage des images avec Oracle Express Edition (Oracle XE "gratuit")

L'instruction DoSQL permet la construction "en mémoire" d'une structure de données comportant les informations dont on aura besoin.

La variable Rows.count permet de connaître le nombre de lignes "renvoyées" par la requête SQL.
On peut don programmer une boucle variant de 1 à ce nombre.

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