Categories: Programmation PDF

Exemple TextOut du composant HotPDF Delphi

HotPDF Composant Delphi TextOut – Style de Police et Jeu de Caractères

Cet exemple complet du composant HotPDF TextOut démontre la gestion avancée des polices, le support des jeux de caractères, la mise à l’échelle du texte, les ajustements d’espacement et les modes de rendu. L’exemple génère des démonstrations détaillées de polices et de jeux de caractères avec des exemples pratiques pour la génération PDF dans les applications Delphi.

Fonctionnalités Clés Démontrées

  • Support des Familles de Polices : Arial, Times New Roman, Courier New avec divers styles
  • Gestion des Jeux de Caractères : Jeux de caractères arabe, européen de l’est, OEM, russe et turc
  • Mise à l’Échelle du Texte : Compression et expansion horizontale du texte
  • Espacement des Caractères : Ajustement fin de l’espacement des caractères pour améliorer la lisibilité
  • Espacement des Mots : Ajustement de l’espace entre les mots pour une meilleure mise en page du texte
  • Modes de Rendu : Rendu de texte en remplissage, contour, remplissage+contour et invisible

📝 Note Importante

ShowCharset n’est utilisé que pour démontrer techniquement l’affichage de caractères d’un jeu de caractères via des codes de caractères. Pour l’affichage de texte normal, vous pouvez simplement utiliser TextOut pour afficher directement la chaîne désirée sans avoir besoin de spécifier des codes de caractères.

La procédure ShowCharset dans cet exemple est spécifiquement conçue pour montrer comment différents encodages de caractères rendent les caractères individuels par leurs codes Unicode/ASCII. Dans les applications réelles, utilisez simplement la méthode TextOut avec vos chaînes de texte directement.

Implémentation Technique

Cet exemple présente les capacités complètes de sortie de texte du composant HotPDF, incluant :

  • Intégration de polices pour un affichage cohérent multi-plateforme
  • Support des caractères Unicode pour le texte international
  • Positionnement et rotation avancés du texte
  • Génération de plan/signets PDF pour la navigation
  • Création de documents multi-pages avec gestion automatique des pages
{***************************************************************}
// Composant PDF HotPDF - Démonstration de Style de Texte et Jeu de Caractères
// Copyright(c)2007-2025, https://www.loslab.com
{***************************************************************}

program TextOut;
{$APPTYPE CONSOLE}
{$I ..\..\..\Lib\HotPDF.inc}

uses
  {$IFDEF XE2+}
  WinApi.Windows,
  System.SysUtils,
  System.Classes,
  Vcl.Graphics,
  {$ELSE}
  Windows,
  SysUtils,
  Classes,
  Graphics,
  {$ENDIF}
  HPDFDoc;

// Variables globales pour la gestion du document PDF et du plan
var
  HotPDF: THotPDF; // Instance principale du composant HotPDF
  OutlineRoot: THPDFDocOutlineObject; // Objet plan racine pour la navigation du document
  CurrnetOutline: THPDFDocOutlineObject; // Objet plan actuel pour la structure imbriquée

  {
    ====================================================================
    ShowFontGroup - Affiche une famille de polices avec différents styles
    ====================================================================

    OBJECTIF :
    Démontre comment afficher la même police dans différents styles (normal, gras,
    italique, gras-italique) avec divers angles de rotation du texte.

    PARAMÈTRES :
    @param FontGroup: String - Nom de la famille de polices à afficher (ex : 'Arial')
    @param Position: Integer - Coordonnée X pour le placement du texte

    FONCTIONNALITÉ :
    1. Affiche le nom de la police en style normal à la position de base
    2. Montre la version grasse avec rotation positive (+1 degré)
    3. Montre la version italique avec rotation négative (-1 degré)
    4. Montre la combinaison gras-italique en orientation normale

    DISPOSITION :
    Chaque style de police est affiché 20 pixels en dessous du précédent
  }

procedure ShowFontGroup(FontGroup: AnsiString; Position: Integer);
begin
  // procedure SetFont ( FontName: AnsiString; FontStyle: TFontStyles; ASize: Single; FontCharset: TFontCharset; IsVertiacal: Boolean);
  // Afficher le style de police normal
  HotPDF.CurrentPage.SetFont(FontGroup, [], 12); // Définir la police sans modificateurs de style
  // procedure TextOut ( X, Y: Single; Angle: Extended; Text: WideString);
  HotPDF.CurrentPage.TextOut(Position, 70, 0, WideString(FontGroup)); // Afficher à la position Y de base (70)

  // Afficher le style de police gras avec légère rotation positive
  HotPDF.CurrentPage.SetFont(FontGroup, [fsBold], 12); // Appliquer le style gras
  HotPDF.CurrentPage.TextOut(Position, 90, 1, WideString(FontGroup + '-Bold')); // Rotation +1 degré, Y+20

  // Afficher le style de police italique avec légère rotation négative
  HotPDF.CurrentPage.SetFont(FontGroup, [fsItalic], 12); // Appliquer le style italique
  HotPDF.CurrentPage.TextOut(Position, 110, - 1, WideString(FontGroup + '-Italic')); // Rotation -1 degré, Y+40

  // Afficher la combinaison gras-italique sans rotation
  HotPDF.CurrentPage.SetFont(FontGroup, [fsBold, fsItalic], 12); // Appliquer gras et italique
  HotPDF.CurrentPage.TextOut(Position, 130, 0, WideString(FontGroup + '-Bold-Italic')); // Orientation normale, Y+60
end;

{
  ====================================================================
  ShowCharset - Affiche les caractères pour un jeu de caractères spécifique
  ====================================================================

  OBJECTIF :
  Démontre l'affichage correct des caractères pour différents encodages de caractères

  PARAMÈTRES :
  @param FontCharset: TFontCharset - Identifiant de jeu de caractères Windows
  @param First: Integer - Code de caractère Unicode/ASCII de début
  @param Last: Integer - Code de caractère Unicode/ASCII de fin (inclus)
  @param Y1: Integer - Coordonnée Y pour l'affichage du nom du jeu de caractères
  @param Y2: Integer - Coordonnée Y pour l'affichage de la grille de caractères

  PLAGES DE CARACTÈRES :
  Chaque jeu de caractères affiche des caractères de plages Unicode/ASCII spécifiques :

  - ARABIC_CHARSET: Unicode 1536-1625 (caractères du bloc arabe)
  - EASTEUROPE_CHARSET: Unicode 160-249 (Supplément Latin-1)
  - OEM_CHARSET: ASCII 32-121 (caractères ASCII imprimables)
  - RUSSIAN_CHARSET: Unicode 1024-1113 (caractères du bloc cyrillique)
  - TURKISH_CHARSET: Unicode 161-255 (Latin étendu imprimable)

  DISPOSITION D'AFFICHAGE :
  Les caractères sont arrangés en 3 rangées avec 30 caractères par rangée :
  - Rangée 1: Caractères 0-29, commençant à X=50
  - Rangée 2: Caractères 30-59, commençant à X=50, Y+20
  - Rangée 3: Caractères 60-89, commençant à X=50, Y+40
  - Espacement des caractères: 16 pixels horizontalement, 20 pixels verticalement
}

procedure ShowCharset(FontCharset: TFontCharset; First, Last: Integer; Y1, Y2: Integer);
var
  i: Integer; // Compteur de boucle pour l'itération des caractères
  CSName: AnsiString; // Nom du jeu de caractères pour l'affichage
  XPos, YPos: Integer; // Variables de position
  CharCode: Integer; // Code de caractère à afficher
  CharCount: Integer; // Nombre de caractères à afficher
  Row: Integer; // Rangée actuelle (1, 2 ou 3)
  CharInRow: Integer; // Position du caractère dans la rangée actuelle
begin
  // Configuration du jeu de caractères avec noms descriptifs
  case FontCharset of
    ARABIC_CHARSET: CSName := 'ARABIC_CHARSET';
    EASTEUROPE_CHARSET: CSName := 'EASTEUROPE_CHARSET';
    OEM_CHARSET: CSName := 'OEM_CHARSET';
    RUSSIAN_CHARSET: CSName := 'RUSSIAN_CHARSET';
    TURKISH_CHARSET: CSName := 'TURKISH_CHARSET';
    else CSName := 'DEFAULT_CHARSET';
  end;

  // Définir le nombre de caractères à afficher : 90 caractères (30 par rangée × 3 rangées)
  CharCount := 90;
  if Last - First + 1 < CharCount then CharCount := Last - First + 1;

  // Afficher l'en-tête du jeu de caractères
  HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsItalic], 12);
  HotPDF.CurrentPage.TextOut(50, Y1, 0, WideString(CSName + ' exemple: '));

  // Définir la police appropriée pour l'affichage des caractères avec spécification du jeu de caractères
  HotPDF.CurrentPage.SetFont('Arial', [], 14, FontCharset);

  // Afficher les caractères en disposition 3 rangées sans indentation
  for i := 0 to CharCount - 1 do
  begin
    // Déterminer la rangée et la position dans la rangée
    if i < 30 then
    begin
      // Première rangée: 30 caractères, alignés avec le titre (x=50)
      Row := 1;
      CharInRow := i;
      XPos := 50 + CharInRow * 16;
      YPos := Y2;
    end else if i < 60 then
    begin
      // Deuxième rangée: 30 caractères, alignés avec le titre (x=50)
      Row := 2;
      CharInRow := i - 30;
      XPos := 50 + CharInRow * 16;
      YPos := Y2 + 20; // 20 pixels en dessous de la première rangée
    end
    else
    begin
      // Troisième rangée: caractères restants, alignés avec le titre (x=50)
      Row := 3;
      CharInRow := i - 60;
      XPos := 50 + CharInRow * 16;
      YPos := Y2 + 40; // 40 pixels en dessous de la première rangée
    end;

    // Calculer le code de caractère
    CharCode := First + i;

    try
      // Utiliser la conversion WideString pour tous les caractères
        HotPDF.CurrentPage.TextOut(XPos, YPos, 0, WideString(WideChar(CharCode)));
    except
      // Si une erreur survient, afficher un caractère de remplacement
        HotPDF.CurrentPage.TextOut(XPos, YPos, 0, WideString('?'));
    end;
  end;
end;

{
  ====================================================================
  ShowTable - Dessine une structure de tableau de démonstration
  ====================================================================

  OBJECTIF :
  Crée une structure de tableau simple pour démontrer les effets de formatage de texte.
  Utilisé dans les sections de mise à l'échelle du texte, espacement des caractères et espacement des mots.

  PARAMÈTRES :
  @param X: Integer - Coordonnée X du bord gauche
  @param Y: Integer - Coordonnée Y du bord supérieur

  STRUCTURE :
  Crée un tableau de 300x100 pixels divisé en :
  - Cellule supérieure: 300x50 pixels
  - Cellule inférieure: 300x50 pixels
  - Diviseur vertical: 130 pixels du bord gauche

  Toutes les lignes sont dessinées avec opération de contour pour la visibilité
}

procedure ShowTable(X, Y: Integer);
begin
  // Dessiner la cellule supérieure du tableau (rectangle 300x50)
  HotPDF.CurrentPage.Rectangle(X, Y, 300, 50);
  HotPDF.CurrentPage.Stroke;

  // Dessiner la cellule inférieure du tableau (rectangle 300x50, décalé de 50 pixels vers le bas)
  HotPDF.CurrentPage.Rectangle(X, Y + 50, 300, 50);
  HotPDF.CurrentPage.Stroke;

  // Dessiner la ligne de division verticale à travers les deux cellules
  HotPDF.CurrentPage.MoveTo(X + 130, Y); // Commencer en haut de la cellule supérieure
  HotPDF.CurrentPage.LineTo(X + 130, Y + 100); // Dessiner jusqu'en bas de la cellule inférieure
  HotPDF.CurrentPage.Stroke;
end;

{
  ====================================================================
  EXÉCUTION DU PROGRAMME PRINCIPAL
  ====================================================================

  Ceci est le corps principal du programme qui démontre toutes les capacités
  de sortie de texte HotPDF. Le programme est structuré en sections, chacune
  démontrant un aspect spécifique de la gestion du texte :

  1. GROUPES DE POLICES - Montre différentes familles de polices et styles
  2. JEUX DE CARACTÈRES - Démontre la gestion de l'encodage des caractères
  3. MISE À L'ÉCHELLE DU TEXTE - Montre les effets de mise à l'échelle horizontale du texte
  4. ESPACEMENT DES CARACTÈRES - Démontre les ajustements d'espacement des caractères
  5. ESPACEMENT DES MOTS - Montre les modifications d'espacement des mots
  6. MODES DE RENDU - Affiche différents effets de rendu de texte

  Chaque section inclut des en-têtes appropriés, des plans de navigation et
  des exemples pratiques avec des comparaisons avant/après le cas échéant.
}
begin
  // Initialiser le composant HotPDF
  HotPDF := THotPDF.Create(nil);
  try
    // Configurer les propriétés du document PDF pour un affichage optimal du texte
    HotPDF.AutoLaunch := true; // Ouvrir automatiquement le PDF après création
    HotPDF.FontEmbedding := true; // Activer l'intégration de polices pour un affichage cohérent des caractères sur tous les systèmes
    HotPDF.StandardFontEmulation := false; // Désactiver l'émulation de polices pour éviter les problèmes de mappage de caractères
    HotPDF.FileName := 'TextOut.pdf'; // Définir le nom du fichier de sortie
    HotPDF.PageLayout := plOneColumn; // Configurer le visualiseur pour afficher une colonne

    // Commencer la création du document PDF
    HotPDF.BeginDoc(true); // Créer le PDF avec compression activée
    OutlineRoot := HotPDF.OutlineRoot; // Initialiser la navigation du plan du document

    // ====================================================================
    // SECTION 1: DÉMONSTRATION DES GROUPES DE POLICES
    // ====================================================================
    // Cette section démontre comment différentes familles de polices apparaissent avec
    // diverses combinaisons de styles (normal, gras, italique, gras-italique)

    // Créer un en-tête de section avec formatage amélioré
    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    HotPDF.CurrentPage.TextOut(195, 30, 0, WideString('Afficher les Polices'));

    // Ajouter une entrée de plan de navigation pour cette section
    OutlineRoot.AddChild('Afficher les Polices', 195, 30); // Liens vers les coordonnées

    // Afficher trois familles de polices principales couramment disponibles sur tous les systèmes
    ShowFontGroup('Arial', 50); // Police sans-serif à X=50
    ShowFontGroup('Times New Roman', 180); // Police serif à X=180
    ShowFontGroup('Courier New', 350); // Police monospace à X=350

    // ====================================================================
    // SECTION 2: DÉMONSTRATION DES JEUX DE CARACTÈRES
    // ====================================================================
    // Cette section démontre la gestion appropriée de différents encodages de caractères Windows

    // Créer un en-tête de section
    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    HotPDF.CurrentPage.TextOut(200, 170, 0, WideString('Jeux de Caractères'));

    // Créer un groupe de plan pour les jeux de caractères avec structure extensible
    // OutlineRoot.AddChild: Crée une nouvelle entrée de signet/plan dans l'arbre de navigation PDF
    // Paramètres: ('Titre', coordonnée-X, coordonnée-Y)
    // - 'Jeux de Caractères': Texte d'affichage montré dans le panneau de plan/signet PDF
    // - 250: Coordonnée X (position horizontale) où le clic naviguera
    // - 170: Coordonnée Y (position verticale) où le clic naviguera
    CurrnetOutline := OutlineRoot.AddChild('Jeux de Caractères', 250, 170);
    CurrnetOutline.Opened := true; // Étendre cette section de plan par défaut

    CurrnetOutline.AddChild('ARABIC_CHARSET', 50, 225);
    // Jeu de caractères arabe: plage Unicode U+0600-U+0659 (90 caractères)
    // Plage: 1536-1625 (bloc arabe incluant lettres, ponctuation, nombres et diacritiques)
    // Affiche 90 caractères arabes en 3 rangées de 30 caractères chacune
    // Utilisé pour: arabe, persan, ourdou, pachto, kurde et autres scripts RTL

    // procedure ShowCharset(FontCharset: TFontCharset; First, Last: Integer; Y1, Y2: Integer);
    // First est le code du premier caractère, sort séquentiellement jusqu'au dernier caractère
    // Y1 est la coordonnée Y du titre, et Y2 est la coordonnée Y de début des caractères
    ShowCharset(ARABIC_CHARSET, 1536, 1625, 225, 250);

    CurrnetOutline.AddChild('EASTEUROPE_CHARSET', 50, 325);
    // Jeu de caractères européen de l'est: plage Unicode U+00A0-U+00F9 (90 caractères)
    // Plage: 160-249 (Supplément Latin-1 avec caractères accentués et symboles)
    // Affiche 90 caractères latins étendus en 3 rangées de 30 caractères chacune
    // Utilisé pour: français, allemand, espagnol, portugais, italien, néerlandais, langues nordiques

    // ShowCharset sert juste à démontrer l'affichage de caractères du jeu de caractères via des codes de caractères
    // pour l'affichage de texte normal, vous n'avez qu'à utiliser TextOut pour afficher directement la chaîne requise
    ShowCharset(EASTEUROPE_CHARSET, 160, 249, 325, 350);

    CurrnetOutline.AddChild('OEM_CHARSET', 50, 425);
    // Jeu de caractères OEM: plage ASCII 32-121 (90 caractères)
    // Plage: 32-121 (ASCII imprimable incluant espace, symboles, nombres et lettres)
    // Affiche 90 caractères ASCII en 3 rangées de 30 caractères chacune
    // Utilisé pour: applications DOS, sortie console, systèmes hérités
    ShowCharset(OEM_CHARSET, 32, 121, 425, 450);

    CurrnetOutline.AddChild('RUSSIAN_CHARSET', 50, 525);
    // Jeu de caractères russe: plage Unicode U+0400-U+0459 (90 caractères)
    // Plage: 1024-1113 (bloc cyrillique incluant lettres russes, ukrainiennes, bulgares)
    // Affiche 90 caractères cyrilliques en 3 rangées de 30 caractères chacune
    // Utilisé pour: russe, bulgare, serbe (cyrillique), macédonien, ukrainien, biélorusse
    ShowCharset(RUSSIAN_CHARSET, 1024, 1113, 525, 550);

    CurrnetOutline.AddChild('TURKISH_CHARSET', 50, 625);
    // Jeu de caractères turc: plage Unicode U+00A1-U+00FF (95 caractères)
    // Plage: 161-255 (Supplément Latin-1 imprimable, évitant les caractères de contrôle 128-160)
    // Affiche 90 caractères en 3 rangées de 30 caractères chacune (premiers 90 des 95 disponibles)
    // Inclut les spéciaux turcs: Ç(199), ç(231), Ğ(208), ğ(240), İ(221), ı(253), Ö(214), ö(246), Ş(222), ş(254), Ü(220), ü(252)
    // Utilisé pour: langue turque avec ses caractères uniques et symboles européens
    ShowCharset(TURKISH_CHARSET, 161, 255, 625, 650);

    // ====================================================================
    // SECTION 3: DÉMONSTRATION DE LA MISE À L'ÉCHELLE DU TEXTE
    // ====================================================================
    // Cette section montre comment la mise à l'échelle horizontale du texte affecte l'apparence du texte
    // La mise à l'échelle modifie la largeur des caractères tout en maintenant la hauteur

    // Commencer une nouvelle page pour les démonstrations de formatage de texte avancé
    HotPDF.AddPage;

    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    OutlineRoot.AddChild('Mise à l\'échelle horizontale du texte', 180, 40); // Ajouter à la navigation du plan principal
    HotPDF.CurrentPage.TextOut(180, 40, 0, WideString('Mise à l\'échelle horizontale du texte'));

    // Créer une structure de tableau de comparaison
    ShowTable(130, 80);

    // Ajouter des étiquettes descriptives pour la comparaison
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 12);
    HotPDF.CurrentPage.TextOut(160, 100, 0, WideString('défaut 100')); // Étiquette de mise à l'échelle normale
    HotPDF.CurrentPage.TextOut(165, 145, 0, WideString('réglé à 50')); // Étiquette de mise à l'échelle compressée

    // Démontrer la mise à l'échelle normale du texte (100% - défaut)
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 24);
    HotPDF.CurrentPage.TextOut(280, 95, 0, WideString('Mot'));

    // Démontrer la mise à l'échelle compressée du texte (50% de largeur)
    HotPDF.CurrentPage.SetHorizontalScaling(50); // Comprimer le texte à 50% de largeur
    HotPDF.CurrentPage.TextOut(285, 140, 0, WideString('Mot'));
    HotPDF.CurrentPage.SetHorizontalScaling(100); // Remettre à la mise à l'échelle normale

    // ====================================================================
    // SECTION 4: DÉMONSTRATION DE L'ESPACEMENT DES CARACTÈRES
    // ====================================================================
    // Cette section démontre comment l'espacement des caractères affecte la lisibilité du texte
    // L'espacement des caractères ajoute un espace uniforme entre les caractères individuels

    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    OutlineRoot.AddChild('Espacement des Caractères', 200, 220);
    HotPDF.CurrentPage.TextOut(200, 220, 0, WideString('Espacement des Caractères'));

    // Créer un tableau de comparaison
    ShowTable(130, 260);

    // Ajouter des étiquettes descriptives
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 12);
    HotPDF.CurrentPage.TextOut(162, 280, 0, WideString('défaut 0')); // Étiquette d'espacement normal
    HotPDF.CurrentPage.TextOut(162, 330, 0, WideString('espace réglé 5')); // Étiquette d'espacement élargi

    // Démontrer l'espacement normal des caractères (0 - défaut)
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 24);
    HotPDF.CurrentPage.TextOut(278, 275, 0, WideString('Caractère'));

    // Démontrer l'espacement élargi des caractères (+5 unités entre les caractères)
    HotPDF.CurrentPage.SetCharacterSpacing(5); // Ajouter 5 unités entre chaque caractère
    HotPDF.CurrentPage.TextOut(278, 320, 0, WideString('Caractère'));
    HotPDF.CurrentPage.SetCharacterSpacing(0); // Remettre à l'espacement normal

    // ====================================================================
    // SECTION 5: DÉMONSTRATION DE L'ESPACEMENT DES MOTS
    // ====================================================================
    // Cette section démontre comment l'espacement des mots affecte la mise en page du texte
    // L'espacement des mots ajoute de l'espace spécifiquement entre les mots (aux caractères d'espace)

    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    OutlineRoot.AddChild('Espacement des Mots', 200, 380);
    HotPDF.CurrentPage.TextOut(200, 380, 0, WideString('Espacement des Mots'));

    // Créer un tableau de comparaison
    ShowTable(130, 420);

    // Ajouter des étiquettes descriptives
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 12);
    HotPDF.CurrentPage.TextOut(162, 440, 0, WideString('défaut 0')); // Étiquette d'espacement normal des mots
    HotPDF.CurrentPage.TextOut(162, 490, 0, WideString('espace réglé 10')); // Étiquette d'espacement élargi des mots

    // Démontrer l'espacement normal des mots (0 - défaut)
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 24);
    HotPDF.CurrentPage.TextOut(280, 430, 0, WideString('Espace Mot'));

    // Démontrer l'espacement élargi des mots (+10 unités entre les mots)
    HotPDF.CurrentPage.SetWordSpacing(10); // Ajouter 10 unités entre les mots
    HotPDF.CurrentPage.TextOut(280, 480, 0, WideString('Espace Mot'));
    HotPDF.CurrentPage.SetWordSpacing(0); // Remettre à l'espacement normal

    // ====================================================================
    // SECTION 6: DÉMONSTRATION DES MODES DE RENDU DE TEXTE
    // ====================================================================
    // Cette section démontre différents effets de rendu de texte disponibles en PDF
    // Le texte peut être rempli, contouré, les deux, ou invisible (pour des effets avancés)

    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    OutlineRoot.AddChild('Modes de Rendu', 200, 550);
    HotPDF.CurrentPage.TextOut(200, 550, 0, WideString('Modes de Rendu'));

    // Créer une structure de tableau complexe pour la comparaison des modes de rendu
    // Contour du tableau principal (500x150 pixels)
    HotPDF.CurrentPage.Rectangle(50, 600, 500, 150);
    HotPDF.CurrentPage.Stroke;

    // Diviseurs verticaux créant 4 colonnes de largeur égale
    HotPDF.CurrentPage.MoveTo(175, 600); // Premier diviseur
    HotPDF.CurrentPage.LineTo(175, 750);
    HotPDF.CurrentPage.Stroke;

    HotPDF.CurrentPage.MoveTo(300, 600); // Deuxième diviseur
    HotPDF.CurrentPage.LineTo(300, 750);
    HotPDF.CurrentPage.Stroke;

    HotPDF.CurrentPage.MoveTo(425, 600); // Troisième diviseur
    HotPDF.CurrentPage.LineTo(425, 750);
    HotPDF.CurrentPage.Stroke;

    // Diviseur horizontal séparant l'en-tête du contenu
    HotPDF.CurrentPage.MoveTo(50, 665);
    HotPDF.CurrentPage.LineTo(550, 665);
    HotPDF.CurrentPage.Stroke;

    // Ajouter des en-têtes de colonnes décrivant chaque mode de rendu
    HotPDF.CurrentPage.SetFont('Arial', [], 12);
    HotPDF.CurrentPage.TextOut(100, 620, 0, WideString('Remplir')); // Mode remplir - texte coloré solide
    HotPDF.CurrentPage.TextOut(215, 620, 0, WideString('Contour')); // Mode contour - texte contouré
    HotPDF.CurrentPage.TextOut(320, 620, 0, WideString('Remplir Contour')); // Mode combiné - rempli avec contour
    HotPDF.CurrentPage.TextOut(465, 620, 0, WideString('Invisible')); // Mode invisible - pour effets spéciaux

    // Configurer les couleurs pour une démonstration d'effet de rendu dramatique
    HotPDF.CurrentPage.SetFont('Arial', [fsBold], 72); // Grande police pour une visibilité claire
    HotPDF.CurrentPage.SetRGBStrokeColor(clRed); // Couleur de contour rouge
    HotPDF.CurrentPage.SetRGBFillColor(clYellow); // Couleur de remplissage jaune

    // Démontrer le mode de rendu Remplir - texte coloré solide
    HotPDF.CurrentPage.SetTextRenderingMode(trFill);
    HotPDF.CurrentPage.TextOut(90, 670, 0, WideString('P'));

    // Démontrer le mode de rendu Contour - texte contouré seulement
    HotPDF.CurrentPage.SetTextRenderingMode(trStroke);
    HotPDF.CurrentPage.TextOut(215, 670, 0, WideString('D'));

    // Démontrer le mode de rendu Remplir+Contour - texte rempli avec contour coloré
    HotPDF.CurrentPage.SetTextRenderingMode(trFillThenStroke);
    HotPDF.CurrentPage.TextOut(340, 670, 0, WideString('F'));

    // Démontrer le mode de rendu Invisible - le texte est présent mais pas visible
    // (utile pour le texte recherchable sur les images, ou techniques de mise en page avancées)
    HotPDF.CurrentPage.SetTextRenderingMode(trInvisible);
    HotPDF.CurrentPage.TextOut(475, 670, 0, WideString('X'));

    // Remettre au mode de rendu par défaut pour tout texte subséquent
    HotPDF.CurrentPage.SetTextRenderingMode(trFillThenStroke);

    // Finaliser et sauvegarder le document PDF
    HotPDF.EndDoc;

  finally
    // Assurer un nettoyage approprié du composant HotPDF
    HotPDF.Free;
  end;
end.
losLab

Devoted to developing PDF and Spreadsheet developer library, including PDF creation, PDF manipulation, PDF rendering library, and Excel Spreadsheet creation & manipulation library.

Recent Posts

HotPDF Delphi组件:在PDF文档中创建垂直文本布局

HotPDF Delphi组件:在PDF文档中创建垂直文本布局 本综合指南演示了HotPDF组件如何让开发者轻松在PDF文档中生成Unicode垂直文本。 理解垂直排版(縦書き/세로쓰기/竖排) 垂直排版,也称为垂直书写,中文称为縱書,日文称为tategaki(縦書き),是一种起源于2000多年前古代中国的传统文本布局方法。这种书写系统从上到下、从右到左流动,创造出具有深厚文化意义的独特视觉外观。 历史和文化背景 垂直书写系统在东亚文学和文献中发挥了重要作用: 中国:传统中文文本、古典诗歌和书法主要使用垂直布局。现代简体中文主要使用横向书写,但垂直文本在艺术和仪式场合仍然常见。 日本:日语保持垂直(縦書き/tategaki)和水平(横書き/yokogaki)两种书写系统。垂直文本仍广泛用于小说、漫画、报纸和传统文档。 韩国:历史上使用垂直书写(세로쓰기),但现代韩语(한글)主要使用水平布局。垂直文本出现在传统场合和艺术应用中。 越南:传统越南文本在使用汉字(Chữ Hán)书写时使用垂直布局,但随着拉丁字母的采用,这种做法已基本消失。 垂直文本的现代应用 尽管全球趋向于水平书写,垂直文本布局在几个方面仍然相关: 出版:台湾、日本和香港的传统小说、诗集和文学作品…

2 days ago

HotPDF Delphi 컴포넌트: PDF 문서에서 세로쓰기

HotPDF Delphi 컴포넌트: PDF 문서에서 세로쓰기 텍스트 레이아웃 생성 이 포괄적인 가이드는 HotPDF 컴포넌트를 사용하여…

2 days ago

HotPDF Delphiコンポーネント-PDFドキュメントでの縦書き

HotPDF Delphiコンポーネント:PDFドキュメントでの縦書きテキストレイアウトの作成 この包括的なガイドでは、HotPDFコンポーネントを使用して、開発者がPDFドキュメントでUnicode縦書きテキストを簡単に生成する方法を実演します。 縦書き組版の理解(縦書き/세로쓰기/竖排) 縦書き組版は、日本語では縦書きまたはたてがきとも呼ばれ、2000年以上前の古代中国で生まれた伝統的なテキストレイアウト方法です。この書字体系は上から下、右から左に流れ、深い文化的意義を持つ独特の視覚的外観を作り出します。 歴史的・文化的背景 縦書きシステムは東アジアの文学と文書において重要な役割を果たしてきました: 中国:伝統的な中国語テキスト、古典詩、書道では主に縦書きレイアウトが使用されていました。現代の簡体字中国語は主に横書きを使用していますが、縦書きテキストは芸術的・儀式的な文脈で一般的です。 日本:日本語は縦書き(縦書き/たてがき)と横書き(横書き/よこがき)の両方の書字体系を維持しています。縦書きテキストは小説、漫画、新聞、伝統的な文書で広く使用されています。 韓国:歴史的には縦書き(세로쓰기)を使用していましたが、現代韓国語(한글)は主に横書きレイアウトを使用しています。縦書きテキストは伝統的な文脈や芸術的応用で見られます。 ベトナム:伝統的なベトナム語テキストは漢字(Chữ Hán)で書かれた際に縦書きレイアウトを使用していましたが、この慣行はラテン文字の採用とともにほぼ消失しました。 縦書きテキストの現代的応用 横書きへの世界的な傾向にもかかわらず、縦書きテキストレイアウトはいくつかの文脈で関連性を保っています: 出版:台湾、日本、香港の伝統的な小説、詩集、文学作品…

2 days ago

Отладка проблем порядка страниц PDF: Реальный кейс-стади

Отладка проблем порядка страниц PDF: Реальный кейс-стади компонента HotPDF Опубликовано losLab | Разработка PDF |…

4 days ago

PDF 페이지 순서 문제 디버깅: HotPDF 컴포넌트 실제 사례 연구

PDF 페이지 순서 문제 디버깅: HotPDF 컴포넌트 실제 사례 연구 발행자: losLab | PDF 개발…

4 days ago

PDFページ順序問題のデバッグ:HotPDFコンポーネント実例研究

PDFページ順序問題のデバッグ:HotPDFコンポーネント実例研究 発行者:losLab | PDF開発 | Delphi PDFコンポーネント PDF操作は特にページ順序を扱う際に複雑になることがあります。最近、私たちはPDF文書構造とページインデックスに関する重要な洞察を明らかにした魅力的なデバッグセッションに遭遇しました。このケーススタディは、一見単純な「オフバイワン」エラーがPDF仕様の深い調査に発展し、文書構造に関する根本的な誤解を明らかにした過程を示しています。 PDFページ順序の概念 - 物理的オブジェクト順序と論理的ページ順序の関係 問題 私たちはHotPDF DelphiコンポーネントのCopyPageと呼ばれるPDFページコピーユーティリティに取り組んでいました。このプログラムはデフォルトで最初のページをコピーするはずでしたが、代わりに常に2番目のページをコピーしていました。一見すると、これは単純なインデックスバグのように見えました -…

4 days ago