Contacts

Essai sur la création de fichiers PDF. Ajouter une visionneuse PDF au programme à l'aide du fichier pdf ouvert Delphi ActiveX

Dans cet article, nous verrons comment créer votre propre pdf-documents, et dans le prochain article, nous verrons comment vous pouvez afficher pdf-documents dans leurs projets, ainsi que le contenu d'impression, naviguer dans le document, et ainsi de suite.

Pour cela, nous avons besoin des composants de l'onglet Délirer... Installons les composants dont nous avons besoin pour travailler, et ceux-ci sont :

  • TRvNDRWriter
  • TRvRenderPdf
  • TBouton

Composant TRvNDRWriter destiné à être enregistré dans pdf-fichier d'informations (texte, graphique) via un flux.

Composant TRvRenderPdf conçu pour créer, restituer des informations (texte, graphiques, etc.). Eh bien, en appuyant sur le bouton, nous entrerons quelque chose dans notre pdf-déposer.

Nous n'écrirons pas beaucoup de théorie, mais nous passerons immédiatement à la programmation, mais nous devons d'abord créer un vide ordinaire pdf-file et placez-le à la racine du programme. Suite à l'événement Sur clic nous allons écrire le code suivant pour notre bouton :

procédure TForm1. Button1Click (Expéditeur : TObject); var Flux : TMemoryStream ; begin Streams : = TMemoryStream. créer; RvNDrWriter1. Flux : = Flux ; RvNDRWriter1. Exécuter; RvRenderPdf1. PrintRender (Flux, "test.pdf"); ShellExecute (Handle, nil, "test.pdf", "", "", SW_SHOW); FreeAndNil (Streams); finir;

Nous créons un flux dans lequel nous allons dessiner toutes les informations, puis nous commençons le rendu, spécifions le fichier dans lequel les données seront rendues, et à la fin nous détruisons le flux.

Tout maintenant, nous avons besoin d'un événement qui se produit lors du dessin des données, dans lequel nous afficherons toutes nos informations. Sélection du composant TRvNDRWriter et parcourir la liste des événements de ce composant, après quoi nous trouvons l'événement OnPrint et dans ce cas nous écrivons le code suivant :

procédure TForm1. Imprimer (Expéditeur : TObject); commencer bmp : = TBitmap. Créer; bmp. LoadFromFile ("test.bmp"); avec RvNDRWriter1 commencez SetFont ("Arial", 16); CouleurFont : = clVert ; Imprimer ("Test de texte"); PrintHeader ("Commencer le fichier PDF", pjCenter); PrintFooter ("Fin du fichier PDF", pjCenter); LigneVers (10, 10); ImprimerBitmap (1, 1, 1, 1, bmp); finir; FreeAndNil (bmp); finir;

Eh bien, d'abord, nous téléchargeons une image * .bmp naturellement variable bmp, nous avons un objet de classe TBitmap... Nous le chargeons pour ensuite le dessiner dans notre pdf-document.

Et puis, je pense que tout est clair, la procédure En-tête d'impression- affiche une inscription dans le titre du document (page), procédure Imprimer le pied de page- affiche une inscription en fin de document (page). Procédure ImprimerBitmap- affiche l'image dans le document, procédure Définir la police- définit la police du document, la procédure Couleur de la police- définit la couleur de la police du document.

Pour cet exemple, nous aurons besoin des composants suivants, qui se trouvent dans l'onglet Rave. Et donc, commençons à installer les composants dont nous avons besoin, à savoir :

  • TRvNDRWriter
  • TRvRenderPdf
  • TBouton

Je propose de m'attarder un peu sur ces composants et de comprendre à quoi ils servent. À propos d'eux, j'ai soustrait des informations de quelques livres que j'ai achetés. progbook.ru... Par conséquent, si vous souhaitez acheter des livres décents sur Delphi, vous êtes les bienvenus dans ce magasin.

Donc, nous avons d'abord le composant TRvNDRWriter. Nous avons besoin de ce composant pour écrire des informations dans un fichier pdf, quel qu'il soit, texte ou graphique, via un flux.

Procédure TForm1.Button1Click (expéditeur : TObject) ; var Flux : TMemoryStream ; begin Streams : = TMemoryStream.create; RvNDrWriter1.Stream:=Flux ; RvNDRWriter1.Execute; RvRenderPdf1.PrintRender (Flux, "test.pdf"); ShellExecute (Handle, nil, "test.pdf", "", "", SW_SHOW); FreeAndNil (Streams); finir;

Le composant suivant est TRvRenderPdf. Nous en avons besoin pour créer, ou plutôt pour restituer des informations, qu'elles soient textuelles ou graphiques. En conséquence, après avoir cliqué sur le bouton, nous écrirons les informations dont nous avons besoin dans notre fichier pdf.

Mais ne râlons pas trop, mais passons directement au sujet qui nous intéresse, à savoir la programmation :)

Tout d'abord, nous devons créer un fichier pdf vide et le placer dans le dossier racine de notre programme.

En fait, avec ce code, nous créons un flux où nous allons dessiner les informations dont nous avons besoin, après quoi nous commençons à dessiner, indiquons notre fichier pdf final, dans lequel les données seront dessinées, et à la fin fermons le flux.

Après avoir exécuté ceci quand, nous avons besoin d'un événement qui se produit lors du dessin des données, dans ce cas, nous afficherons les informations dont nous avons besoin.

Analysons le code. Tout d'abord, je charge une image * .bmp, crée une variable bmp et un objet de la classe TBitmap. Je le charge pour ensuite dessiner dans notre fichier pdf.

Je pense en outre que cela ne vaut pas la peine de tout décrire clairement, et donc, la procédure PrintHeader - ajoute une inscription à l'en-tête du document, la procédure PrintFooter - ajoute une inscription à la fin du document. Procédure PrintBitmap - ajoute une image au document, procédure SetFont - définit la police requise pour le document, procédure FontColor - définit la couleur de police requise pour le document.

Toutes les fonctions et procédures graphiques suivantes sont exactement les mêmes que lors de l'affichage d'informations graphiques sur Canvas d'autres composants.

J'utilise la fonction NewPage pour créer une nouvelle feuille dans le document. Tout ce qui sera ajouté après cela à la sortie des informations sera affiché sur une nouvelle feuille du document.

Important pour que tous les modules : RpRender, RpRenderPDF, RpDefine, RpBase, RpFiler, RpRave, RpCon soient connectés au projet !

Caractéristiques du composant, déclarées par les développeurs :

  • Prise en charge des graphiques vectoriels et bitmap dans les documents PDF
  • Protégez les documents PDF par mot de passe
  • Prise en charge des formulaires AcroForms / PDF
  • Marques d'eau
  • Générez des documents PDF avec des liens internes et externes, des liens Web et des signets
  • Prise en charge complète d'Unicode
  • Prise en charge de plusieurs polices, formatage du texte, mise en page du texte sur plusieurs colonnes
  • Prise en charge de TCanvas
  • Archiveur intégré pour compresser du texte et des informations graphiques dans un document
  • Convertir TIFF en PDF

À titre d'exemple, j'ai décidé de créer une application de démonstration fournie avec le composant THotPDF... L'application est assez simple - elle génère un PDF avec deux liens et du texte brut. Le code est également simple et direct :

procédure TForm1. HelloWorldButtonClick (expéditeur : TObject); commencer HPDF. BeginDoc; HPDF. Page actuelle. PrintHyperlink (20, 35, "Site Web :" + MainEdit. Text, MainEdit. Text); HPDF. Page actuelle. SetFont ("Times New Roman", 16); HPDF. Page actuelle. SetRGBHyperlinkColor (clRed); HPDF. Page actuelle. PrintHyperlink (20, 50, "Page de commande :" + BuyEdit. Text, BuyEdit. Text); HPDF. Page actuelle. SetFont ("Times New Roman", 14); HPDF. Page actuelle. TextOut (20, 75, 0, "Cliquez sur le lien pour naviguer"); HPDF. FinDoc ; finir;

Sans même entrer dans les subtilités du composant, vous pouvez comprendre ce qui se passe et comment dans cet exemple de démonstration. Lancez, regardez l'apparence du document généré :

Ces deux rectangles bleus dans le document sont des liens vers deux pages... et le texte en clair "Cliquez sur le lien pour naviguer" n'est visible nulle part. Cependant, je dois le créditer, lorsque vous cliquez sur le rectangle, le lien s'ouvre. En général, soit les développeurs se sont précipités pour déclarer la prise en charge de Delphi jusqu'à XE3, soit la version d'essai fonctionne de manière intéressante, mais après avoir commencé cette démo, j'ai en quelque sorte perdu l'envie d'utiliser THotPDF même gratuitement. Allons-nous en.

4. PDF Creator Pilote

Coût: de 450 $ sans sources à 9950 $ (!!!) avec sources
5-XE4
http://www.colorpilot.com/pdflibrary.html#download

La bibliothèque coûte presque autant que Delphi XE3 Professional... Bon, d'accord, voyons ce qu'est cette bibliothèque.

Fonctionnalités annoncées par les développeurs :

  • Ensemble avancé de méthodes et de propriétés pour une création facile de PDF ;
  • Lire et fusionner des documents PDF existants ;
  • Ajout et suppression de pages d'un document PDF ;
  • Prise en charge d'Unicode ;
  • Création de filigranes pour chaque page;
  • Ajout de vignettes pour un document PDF ;
  • Utilisation et intégration de polices (TrueType, OpenType, Type1, etc.) ;
  • Créez des documents PDF interactifs à l'aide de JavaScript et d'hyperliens ;
  • Prise en charge des éléments interactifs AcroForm : champs de saisie de texte, boutons, boutons radio, listes déroulantes, cases à cocher ;
  • cryptage et protection par mot de passe des documents PDF générés ;
  • Création et gestion du contenu des documents;
  • Accès à HDC pour dessiner sur des pages PDF à l'aide des fonctions WinAPI.
  • Utilisation d'images dans divers formats (JPEG, TIFF, PNG, BMP, GIF);
  • Création et utilisation d'annotations ;
  • Créez des documents PDF sur disque ou en mémoire ;
  • Extraire du texte à partir de documents PDF ;

Dans l'ensemble, une liste assez impressionnante de fonctionnalités. Voyons comment certaines de ces fonctionnalités fonctionnent dans la pratique. Téléchargez la version démo, installez.

Après l'installation, lancez Delphi (dans mon cas, il s'agit de Delphi XE3) et allez dans le menu :

Composant - Composant d'importation - Bibliothèque de types d'importation

Nous recherchons une bibliothèque dans la liste

Nous importons, créons un nouveau projet et incluons l'unité dans les usages PDFCreatorPilotLib_TLB.

Nous pouvons maintenant tester la bibliothèque sur un exemple en direct. Tout d'abord, essayons de générer un document en texte brut :

procédure TForm1. Button1Click (Expéditeur : TObject); var fnt : entier ; commencer (initialisation) PDF : = TPDFDocument4. Créer (néant) ; PDF. SetLicenseData ("démo", "démo"); fnt : = pdf. AddFont ("Verdana", faux, faux, faux, faux, fcANSI); PDF. UseFont (fnt, 14); PDF. ShowTextAt (20, 40, "BONJOUR, PDF !"); (enregistrer) PDF. SaveToFile ("HelloPDF.pdf", vrai); PDF. Détruire; finir;

Nous lançons l'application et regardons le document PDF créé :

Essayons maintenant d'écrire du texte russe dans un fichier :

procédure TForm1. Button1Click (Expéditeur : TObject); commencer (initialisation) (...) PDF. ShowTextAt (20, 40, "Bonjour PDF !"); (enregistrer) (...) fin;


Peut-être que quelque part dans les propriétés de la classe, vous devez configurer quelque chose, appeler une méthode qui activera toujours la prise en charge Unicode, MAIS pour un tel argent, j'aimerais obtenir une bibliothèque qui fonctionnera immédiatement sans aucun problème avec les paramètres et les torsions .. À propos, la méthode d'insertion d'un lien (AddHyperLink) n'a pas fonctionné non plus - le document est resté vierge malgré le fait que le lien aurait été inséré. Mais, nous devons rendre hommage, une tentative d'insérer un PDF-ku précédemment créé dans un nouveau document - travaillé avec un bang - le document a été inséré dans la nouvelle page comme il se doit, sans jambages.

5. PDFtoolkit VCL v4.0.1.293

Coût: de 349 $ sans sources à 499 $ avec sources
Versions Delphi prises en charge : 6-XE4
Page de téléchargement d'essai : http://www.gnostice.com/PDFtoolkit_VCL.asp?show=downloads

Il y a pas mal de critiques positives sur cette bibliothèque de composants de Gnostice sur le web.

Par opportunités Boîte à outils PDF presque 1 en 1 correspond Pilote de créateur de PDF, ceux. peut "coller" des PDF, reconnaître du texte, insérer des liens, rechercher des documents, etc. Mais, contrairement à PDF Creator Pilot, PDFtoolkit si gtPDFDocument1. IsLoaded puis commencer gtPDFDocument1. Sortie de texte ( "Bonjour, Paix!" , IntToStr (gtPDFDocument1. PageCount), // la plage de pages dans laquelle le texte sera inséré gtPDFDocument1. GetPageSize (gtPDFDocument1. PageCount, muPixels). Largeur / 2, // insère du texte au centre de la page gtPDFDocument1. GetPagesize (gtPDFDocument1. PageCount, muPixels). Hauteur / 2); (enregistrer le document) gtPDFDocument1. SaveToFile ("modified_doc.pdf"); finir; enfin gtPDFDocument1. Fin libre ;

Bien sûr, par rapport à ma tâche, PDFtoolkit s'avère pratiquement inutile, puisque Je suis intéressé par la création de PDF à partir de zéro, mais pour ceux qui écrivent leurs propres visionneuses de PDF, je pense que cette bibliothèque devrait être plus que appropriée.

Donc, ce que nous avons à la fin. Il existe 5 solutions différentes pour créer et travailler avec des documents PDF dans Delphi. Chaque solution a à la fois ses avantages (gratuit, "fantaisie") et ses inconvénients (coût du cheval, problèmes avec Unicode, etc.). En ce qui concerne ma tâche, toutes les solutions devront « fonctionner avec un fichier ». D'un autre côté, il existe un tas de services payants et gratuits sur le Web pour générer des PDF, mais en gardant à l'esprit que ces services ont tendance à disparaître et à disparaître soudainement, d'une manière ou d'une autre, cela n'a pas envie de communiquer avec eux. Il y a, bien sûr, une autre solution - auto-écrite et pas entièrement dans le thème Delphi, mais plus à ce sujet la prochaine fois, mais pour l'instant je vais réfléchir à ce qu'il faut faire avec le client pour DelphiFeeds


Rendez-vous en ligne !


date de publication 23/09/2005 07:00 Essai sur la création de fichiers PDF

Récemment, de nombreux convertisseurs PDF, lecteurs et écritures ont été trouvés sur Internet. Et l'écrasante majorité d'entre eux sont proposés pour de l'argent. Le programme lui-même coûte de 10 $ à 300 $. Et le code source pour beaucoup plus d'argent , le prix commence à partir de 200 $ et à un endroit (devenant intéressé par cela, j'ai grimpé sur Internet) jusqu'à 900 euros.

Je me suis intéressé à cette problématique en terme de programmation et je porte les résultats à votre connaissance. (Ces résultats ont été obtenus par moi en étudiant l'intérieur d'un fichier PDF, lorsque vous l'ouvrez dans le commandant total via F3)

Un fichier PDF ordinaire comporte quatre parties :=

Qu'est-ce que

? Il s'agit d'une référence commune à la version de spécification PDF. Qui est présent dans la première ligne du fichier PDF. Par exemple "% PDF-1.3" Dans la septième version de l'acrobate, qui est sortie au début de cet été, ce nombre est "% PDF-1.7", mais ce n'est pas une version du produit, c'est le version de la spécification. La deuxième ligne du PDF est un petit charabia (apparemment destiné à une utilisation ultérieure) "% vgpu"

Tout le monde a trié la première partie du PDF.

Comment s'appelle la deuxième partie ?

La réponse est très simple : il s'agit d'une séquence d'objets dont la description, comme l'en-tête, est présentée sous forme de texte.

Chaque objet est un fragment de texte avec un numéro de série dans le nom, par exemple "4 0 obj"

  • 4 c'est le numéro de série de l'objet
  • 0 c'est le numéro de (re)génération du fichier, c'est-à-dire que lorsque le fichier est mis à jour (édité) alors ce numéro est augmenté
  • obj c'est un mot de code qui signifie que nous avons rencontré un objet dans le corps du document

Tous les objets sont divisés en indirects et directs. Tous indirects, et la plupart d'entre eux, après le mot obj ont un délimiteur dans leur corps "<<", означающее начало данных объекта. И в конце данных закрывающий делиметер ">> " et le mot de code endobj

Les objets directs ne doivent pas avoir de délimiteurs d'ouverture et de fermeture dans leur corps "<<", ">> "Tous les objets indirects sont accessibles via table de concordance... Il présente des liens sous forme de décalage du début du fichier au début de l'objet (Les données (lignes) dans l'objet sont séparées #13#10 ou alors #13 )

Le type de l'objet "le plus important" dans le corps du fichier PDF a un nom fier "/ Catalogue"

4 0 obj<< /Type /Catalog /Pages 2 0 R /OpenAction [ 5 0 R /XYZ null 364 1 ] /PageMode /UseNone >> endobj

En fait, il devrait y avoir 3 objets "principaux" dans le corps d'un fichier PDF minimal de type "Hello world". Permettez-moi de les lister par type :

  • "/ Catalogue" contient un lien : vers l'arborescence des pages ( / Pages)
  • "/Pages" contient un lien vers un groupe de pages de document (Par exemple 2 0 obj> endobj)
  • "/Page" contient un lien vers des objets liés à une page spécifique. (Par exemple 3 0 obj> / Rotation 0 >>)
Et quelques "mineurs"

Analysons l'objet page :

  • / Rotation champ indiquant de combien de degrés l'image de la page doit être tournée lorsqu'elle est affichée dans le programme
  • / MediaBox et / CropBox champs décrivant la taille de la page
  • / Parent référence parent "/Pages"
  • / Ressources ce champ décrit quelle police doit être utilisée lors de l'affichage de la page (une police est un objet séparé) et le paramètre ProcSet ce paramètre affiche le contenu du flux de données de cette page (peut également être défini comme un objet, pas comme un champ)
  • / Contenu Le champ le plus intéressant dans l'objet "page" donne un lien vers l'objet contenu de cette page, de plus : si ce champ est absent dans l'objet "page", alors la page est vide
Contenu de la page:
Un objet "flux" 4 0 obj> stream BT / F12 9 Tf 10 782 TD 0 -12,5 TD (Max Fokin) Tj 0 -12,5 TD (mnb) Tj 0 -12,5 TD () Tj 0 -12,5 TD (Max Privet) Tj 0 -12,5 TD (1) Tj 0 -12,5 TD (1) Tj 0 -12,5 TD (2) Tj 0 -12,5 TD (3) Tj 0 -12,5 TD (45) Tj ET endstream endobj / Longueur 305 ce champ indiquant le nombre d'octets d'un mot flux au mot endstream

L'option la plus simple est un flux de données non codé et non compressé dans un objet flux... Il est limité aux opérateurs BT et HE

BT commence un objet texte - caractérise le début du texte ET termine un objet texte. - caractérise la fin du texte / F12 9 Tf

  • / F12 c'est le nom de code de l'objet qui caractérise la police utilisée sur cette page
  • 9 c'est la taille de la police
  • Tf il s'agit d'un opérateur qui caractérise qu'une chaîne donnée dans un objet steam est un paramètre de police et de taille
10 782 TD ce sont les nombres à partir desquels la ligne donnée commence (le compte est fait à partir du coin supérieur gauche) Tj est l'opérateur de nouvelle ligne Eh bien, entre parenthèses est notre texte

Je n'explique pas le flux codé ici. Il est basé sur les algorithmes RC4, RC5, MD5.

Qu'est-ce qu'un objet Police de caractère 12 0 obj>

  • / Type / Police Naturellement le nom du type
  • / Sous-type / Type1 nom du sous-type
  • / Nom / F7 F7 c'est le nom de code

PDF prend en charge plusieurs types de polices. Ils sont listés ci-dessous

  • Type 1, y compris les sous-ensembles et les « instantanés » de plusieurs maîtres
  • Type 3
  • TrueType, y compris les sous-ensembles
  • Tapez 0
Honnêtement, je n'ai pas compris le Type 3, TrueType, y compris les sous-ensembles, le Type 0, je ne peux rien en dire.
Et Type 1 est les polices suivantes Courier Courier-Bold Courier-Bold Oblique Courier-Oblique Helvetica Helvetica-Bold Helvetica-Bold Oblique Helvetica-Oblique Times-Roman Times-Bold Times-Italic Times-BoldItalic Symbol ZapfDingbats

20 0 obj> endobj Il s'agit d'un objet avec des noms de code pour les polices du premier type. Par ce nom de code, vous pouvez facilement obtenir l'objet lui-même Police de caractère... 6 0 obj>

TOUS : c'est-à-dire le minimum Se compose des objets suivants : "catalogue", "pages", "page", "Ressources"(peut éventuellement être présent sous forme de champ dans l'objet de la page), objet non typé "flux", groupe d'objets "Police de caractère"

Quoi ? En fait, il s'agit d'un tableau de texte ordinaire, il commence par le mot xréf et son corps a des références à tous les objets indirects du document. Voici un exemple xref 0 27 0000000021 65535 f 0000000016 00000 n 0000000105 00000 n 0000000169 00000 n 0000000356 00000 n 000000713 00000 n 0000000892 00000 n 0000001006 00000 n 0000001125 00000 n 0000001247 00000 n 0000001373 00000 n 0000001486 00000 n 000000 n16000 n1604 0018 0000001967 00000 n 0000002084 00000 n 0000002203 00000 n 0000002326 00000 n 0000002439 00000 n 0000002558 00000 n 0000000024 00001 f 0000002751 00000 n 0000002831 00000 n 000000000 00001 f 0000002915 00000 n 0000002955 00000 n 0 27 Ces chiffres indiquent ce qui suit :

  • 0 - le premier numéro d'objet dans le tableau
  • 27 - le nombre d'éléments dans le tableau

Le premier élément du tableau a toujours la forme " XXXXXXXXXX 65535 f"où X est un nombre et 65535 est la valeur par défaut pour le premier élément du tableau. Le" f "symbole signifie" libre", c'est-à-dire que l'objet n'est pas utilisé

Analysons l'élément de ce tableau.

  • Les 10 premiers chiffres sont le décalage entre le début du fichier et le début de l'objet.
  • 0000000016 signifie qu'après 16 octets depuis le début du fichier, vous serez accueilli par la première mention de l'objet, c'est-à-dire, par exemple, 4 0 obj

Les cinq derniers chiffres sont le numéro de génération du fichier. Si le fichier vient d'être créé, ce sont toujours des zéros. Si le fichier est modifié, alors ce nombre est augmenté de un. C'est à dire, 0000000024 00001 f

Le PDF canonique qui vient d'être créé n'a qu'un seul tableau. Mais, si le fichier est en cours d'édition, il peut y avoir beaucoup de telles tables.

La relation des tables s'effectue à l'aide du dernier élément et le mot de code startxref

Le fichier PDF canonique nouvellement créé n'a qu'un seul tableau, après le tableau il y a un élément bande annonce Et après la bande-annonce vient le mot de code startxref indiquant le décalage entre le début du fichier et le début du tableau, voici un exemple. trailer> startxref 173 %% EOF Cela signifie qu'après 173 octets depuis le début du document, il y aura un mot de passe xréf... Mais, si le fichier a été édité, alors la dernière bande-annonce du fichier ressemblera à ceci : xref 0 3 0000000000 65535 f 0000003609 00000 n 0000003832 00000 n bande-annonce<7a15ab3ed3999575ff2f3034104a82c1>] >> startxref 173 %% EOF Mais si on se tourne vers la table où pointe le lien startxref 173, on trouvera alors le tableau suivant, suivi de la remorque, qui aura le champ / Précédent 3896 3 16 0000000016 00000 n 0000000664 00000 n 0000000936 00000 n 0000001106 00000 n 0000001133 00000 n 0000001250 00000 n 0000001395 00000 n 0000001811 00000 n 0000001992 00000 n 0000002180 00000 n 0000002360 00000 n 0000002760 00000 n 00000034000 006 00000 n 000000 remorque<7a15ab3ed3999575ff2f3034104a82c1>] >> startxref 567 %% EOF

Ce champ / Précédent 3896 nous renvoie au tableau précédent, et le lien startxref 567 pointe vers la table suivante et ainsi de suite presque indéfiniment, tandis que dans le champ suivant startxref nous ne verrons pas 0 ... Cela signifie que nous avons lu tous les tableaux.

Cet essai, bien sûr, n'a pas le code source. Voilà : il y a deux modules principaux" Document PDF"et auxiliaire" PDFBaseFonts"

Les fichiers sont joints au matériel :

  • Code source des modules PDFDocument.pas et PDFBaseFonts.pas (16 Ko) mise à jour du 23/09/2005 7:02:00

Discussion du matériel [31-07-2006 06:33] 7 messages



Vous avez aimé l'article ? Partagez-le