Categories: Programação PDF

Exemplo HotPDF Component Delphi TextOut

Exemplo HotPDF Component Delphi TextOut – Estilo de Fonte e Conjunto de Caracteres

Este exemplo abrangente do componente HotPDF TextOut demonstra o manuseio avançado de fontes, suporte a conjuntos de caracteres, dimensionamento de texto, ajustes de espaçamento e modos de renderização. O exemplo gera demonstrações detalhadas de fontes e conjuntos de caracteres com exemplos práticos para geração de PDF em aplicações Delphi.

Principais Recursos Demonstrados

  • Suporte a Famílias de Fontes: Arial, Times New Roman, Courier New com vários estilos
  • Manuseio de Conjuntos de Caracteres: Conjuntos de caracteres árabe, europeu oriental, OEM, russo e turco
  • Dimensionamento de Texto: Compressão e expansão horizontal do texto
  • Espaçamento de Caracteres: Ajuste fino do espaçamento de caracteres para melhor legibilidade
  • Espaçamento de Palavras: Ajuste do espaço entre palavras para melhor layout do texto
  • Modos de Renderização: Renderização de texto preenchido, contornado, preenchido+contornado e invisível

📝 Nota Importante

ShowCharset é usado apenas para demonstrar tecnicamente a exibição de caracteres de um conjunto de caracteres através de códigos de caracteres. Para exibição de texto regular, você pode simplesmente usar TextOut para exibir diretamente a string desejada sem precisar especificar códigos de caracteres.

O procedimento ShowCharset neste exemplo é especificamente projetado para mostrar como diferentes codificações de caracteres renderizam caracteres individuais por seus códigos Unicode/ASCII. Em aplicações reais, simplesmente use o método TextOut com suas strings de texto diretamente.

Implementação Técnica

Este exemplo demonstra as capacidades abrangentes de saída de texto do componente HotPDF, incluindo:

  • Incorporação de fontes para exibição consistente multiplataforma
  • Suporte a caracteres Unicode para texto internacional
  • Posicionamento e rotação avançados de texto
  • Geração de estrutura/marcadores PDF para navegação
  • Criação de documentos multipáginas com gerenciamento automático de páginas
{***************************************************************}
// Componente PDF HotPDF - Demonstração de Estilo de Texto e Conjunto de Caracteres
// 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;

// Variáveis globais para gerenciamento de documento PDF e estrutura
var
  HotPDF: THotPDF; // Instância principal do componente HotPDF
  OutlineRoot: THPDFDocOutlineObject; // Objeto de estrutura raiz para navegação do documento
  CurrnetOutline: THPDFDocOutlineObject; // Objeto de estrutura atual para estrutura aninhada

  {
    ====================================================================
    ShowFontGroup - Exibe uma família de fontes com diferentes estilos
    ====================================================================

    PROPÓSITO:
    Demonstra como exibir a mesma fonte em diferentes estilos (normal, negrito,
    itálico, negrito-itálico) com vários ângulos de rotação de texto.

    PARÂMETROS:
    @param FontGroup: String - Nome da família de fontes a exibir (ex: 'Arial')
    @param Position: Integer - Coordenada X para posicionamento do texto

    FUNCIONALIDADE:
    1. Exibe o nome da fonte em estilo normal na posição base
    2. Mostra a versão negrito com rotação positiva (+1 grau)
    3. Mostra a versão itálico com rotação negativa (-1 grau)
    4. Mostra a combinação negrito-itálico em orientação normal

    LAYOUT:
    Cada estilo de fonte é exibido 20 pixels abaixo do anterior
  }

procedure ShowFontGroup(FontGroup: AnsiString; Position: Integer);
begin
  // procedure SetFont ( FontName: AnsiString; FontStyle: TFontStyles; ASize: Single; FontCharset: TFontCharset; IsVertiacal: Boolean);
  // Exibir estilo de fonte normal
  HotPDF.CurrentPage.SetFont(FontGroup, [], 12); // Definir fonte sem modificadores de estilo
  // procedure TextOut ( X, Y: Single; Angle: Extended; Text: WideString);
  HotPDF.CurrentPage.TextOut(Position, 70, 0, WideString(FontGroup)); // Exibir na posição Y base (70)

  // Exibir estilo de fonte negrito com ligeira rotação positiva
  HotPDF.CurrentPage.SetFont(FontGroup, [fsBold], 12); // Aplicar estilo negrito
  HotPDF.CurrentPage.TextOut(Position, 90, 1, WideString(FontGroup + '-Bold')); // Rotação +1 grau, Y+20

  // Exibir estilo de fonte itálico com ligeira rotação negativa
  HotPDF.CurrentPage.SetFont(FontGroup, [fsItalic], 12); // Aplicar estilo itálico
  HotPDF.CurrentPage.TextOut(Position, 110, - 1, WideString(FontGroup + '-Italic')); // Rotação -1 grau, Y+40

  // Exibir combinação negrito-itálico sem rotação
  HotPDF.CurrentPage.SetFont(FontGroup, [fsBold, fsItalic], 12); // Aplicar negrito e itálico
  HotPDF.CurrentPage.TextOut(Position, 130, 0, WideString(FontGroup + '-Bold-Italic')); // Orientação normal, Y+60
end;

{
  ====================================================================
  ShowCharset - Exibe caracteres para um conjunto de caracteres específico
  ====================================================================

  PROPÓSITO:
  Demonstra a exibição adequada de caracteres para diferentes codificações de caracteres

  PARÂMETROS:
  @param FontCharset: TFontCharset - Identificador de conjunto de caracteres Windows
  @param First: Integer - Código de caractere Unicode/ASCII inicial
  @param Last: Integer - Código de caractere Unicode/ASCII final (inclusivo)
  @param Y1: Integer - Coordenada Y para exibição do nome do conjunto de caracteres
  @param Y2: Integer - Coordenada Y para exibição da grade de caracteres

  FAIXAS DE CARACTERES:
  Cada conjunto de caracteres exibe caracteres de faixas Unicode/ASCII específicas:

  - ARABIC_CHARSET: Unicode 1536-1625 (caracteres do bloco árabe)
  - EASTEUROPE_CHARSET: Unicode 160-249 (Suplemento Latin-1)
  - OEM_CHARSET: ASCII 32-121 (caracteres ASCII imprimíveis)
  - RUSSIAN_CHARSET: Unicode 1024-1113 (caracteres do bloco cirílico)
  - TURKISH_CHARSET: Unicode 161-255 (Latin estendido imprimível)

  LAYOUT DE EXIBIÇÃO:
  Os caracteres são organizados em 3 fileiras com 30 caracteres por fileira:
  - Fileira 1: Caracteres 0-29, começando em X=50
  - Fileira 2: Caracteres 30-59, começando em X=50, Y+20
  - Fileira 3: Caracteres 60-89, começando em X=50, Y+40
  - Espaçamento de caracteres: 16 pixels horizontalmente, 20 pixels verticalmente
}

procedure ShowCharset(FontCharset: TFontCharset; First, Last: Integer; Y1, Y2: Integer);
var
  i: Integer; // Contador de loop para iteração de caracteres
  CSName: AnsiString; // Nome do conjunto de caracteres para exibição
  XPos, YPos: Integer; // Variáveis de posição
  CharCode: Integer; // Código de caractere a exibir
  CharCount: Integer; // Número de caracteres a exibir
  Row: Integer; // Fileira atual (1, 2 ou 3)
  CharInRow: Integer; // Posição do caractere dentro da fileira atual
begin
  // Configuração do conjunto de caracteres com nomes descritivos
  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;

  // Definir contagem de caracteres para exibir 90 caracteres (30 por fileira × 3 fileiras)
  CharCount := 90;
  if Last - First + 1 < CharCount then CharCount := Last - First + 1;

  // Exibir cabeçalho do conjunto de caracteres
  HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsItalic], 12);
  HotPDF.CurrentPage.TextOut(50, Y1, 0, WideString(CSName + ' exemplo: '));

  // Definir a fonte apropriada para exibição de caracteres com especificação do conjunto de caracteres
  HotPDF.CurrentPage.SetFont('Arial', [], 14, FontCharset);

  // Exibir caracteres em layout de 3 fileiras sem indentação
  for i := 0 to CharCount - 1 do
  begin
    // Determinar fileira e posição dentro da fileira
    if i < 30 then
    begin
      // Primeira fileira: 30 caracteres, alinhados com o título (x=50)
      Row := 1;
      CharInRow := i;
      XPos := 50 + CharInRow * 16;
      YPos := Y2;
    end else if i < 60 then
    begin
      // Segunda fileira: 30 caracteres, alinhados com o título (x=50)
      Row := 2;
      CharInRow := i - 30;
      XPos := 50 + CharInRow * 16;
      YPos := Y2 + 20; // 20 pixels abaixo da primeira fileira
    end
    else
    begin
      // Terceira fileira: caracteres restantes, alinhados com o título (x=50)
      Row := 3;
      CharInRow := i - 60;
      XPos := 50 + CharInRow * 16;
      YPos := Y2 + 40; // 40 pixels abaixo da primeira fileira
    end;

    // Calcular código do caractere
    CharCode := First + i;

    try
      // Usar conversão WideString para todos os caracteres
        HotPDF.CurrentPage.TextOut(XPos, YPos, 0, WideString(WideChar(CharCode)));
    except
      // Se ocorrer algum erro, exibir um caractere de fallback
        HotPDF.CurrentPage.TextOut(XPos, YPos, 0, WideString('?'));
    end;
  end;
end;

{
  ====================================================================
  ShowTable - Desenha uma estrutura de tabela de demonstração
  ====================================================================

  PROPÓSITO:
  Cria uma estrutura de tabela simples para demonstrar efeitos de formatação de texto.
  Usado nas seções de dimensionamento de texto, espaçamento de caracteres e espaçamento de palavras.

  PARÂMETROS:
  @param X: Integer - Coordenada X da borda esquerda
  @param Y: Integer - Coordenada Y da borda superior

  ESTRUTURA:
  Cria uma tabela de 300x100 pixels dividida em:
  - Célula superior: 300x50 pixels
  - Célula inferior: 300x50 pixels
  - Divisor vertical: 130 pixels da borda esquerda

  Todas as linhas são desenhadas com operação de contorno para visibilidade
}

procedure ShowTable(X, Y: Integer);
begin
  // Desenhar célula superior da tabela (retângulo 300x50)
  HotPDF.CurrentPage.Rectangle(X, Y, 300, 50);
  HotPDF.CurrentPage.Stroke;

  // Desenhar célula inferior da tabela (retângulo 300x50, deslocado 50 pixels para baixo)
  HotPDF.CurrentPage.Rectangle(X, Y + 50, 300, 50);
  HotPDF.CurrentPage.Stroke;

  // Desenhar linha divisória vertical através de ambas as células
  HotPDF.CurrentPage.MoveTo(X + 130, Y); // Começar no topo da célula superior
  HotPDF.CurrentPage.LineTo(X + 130, Y + 100); // Desenhar até o fundo da célula inferior
  HotPDF.CurrentPage.Stroke;
end;

{
  ====================================================================
  EXECUÇÃO DO PROGRAMA PRINCIPAL
  ====================================================================

  Este é o corpo principal do programa que demonstra todas as capacidades
  de saída de texto do HotPDF. O programa é estruturado em seções, cada uma
  demonstrando um aspecto específico do manuseio de texto:

  1. GRUPOS DE FONTES - Mostra diferentes famílias de fontes e estilos
  2. CONJUNTOS DE CARACTERES - Demonstra o manuseio de codificação de caracteres
  3. DIMENSIONAMENTO DE TEXTO - Mostra efeitos de dimensionamento horizontal de texto
  4. ESPAÇAMENTO DE CARACTERES - Demonstra ajustes de espaçamento de caracteres
  5. ESPAÇAMENTO DE PALAVRAS - Mostra modificações de espaçamento de palavras
  6. MODOS DE RENDERIZAÇÃO - Exibe diferentes efeitos de renderização de texto

  Cada seção inclui cabeçalhos apropriados, estruturas de navegação e
  exemplos práticos com comparações antes/depois quando aplicável.
}
begin
  // Inicializar componente HotPDF
  HotPDF := THotPDF.Create(nil);
  try
    // Configurar propriedades do documento PDF para exibição ótima de texto
    HotPDF.AutoLaunch := true; // Abrir automaticamente o PDF após criação
    HotPDF.FontEmbedding := true; // Habilitar incorporação de fontes para exibição consistente de caracteres em todos os sistemas
    HotPDF.StandardFontEmulation := false; // Desabilitar emulação de fontes para prevenir problemas de mapeamento de caracteres
    HotPDF.FileName := 'TextOut.pdf'; // Definir nome do arquivo de saída
    HotPDF.PageLayout := plOneColumn; // Configurar visualizador para exibir uma coluna

    // Iniciar criação do documento PDF
    HotPDF.BeginDoc(true); // Criar PDF com compressão habilitada
    OutlineRoot := HotPDF.OutlineRoot; // Inicializar navegação da estrutura do documento

    // ====================================================================
    // SEÇÃO 1: DEMONSTRAÇÃO DE GRUPOS DE FONTES
    // ====================================================================
    // Esta seção demonstra como diferentes famílias de fontes aparecem com
    // várias combinações de estilos (normal, negrito, itálico, negrito-itálico)

    // Criar cabeçalho de seção com formatação aprimorada
    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    HotPDF.CurrentPage.TextOut(195, 30, 0, WideString('Mostrar Fontes'));

    // Adicionar entrada de estrutura de navegação para esta seção
    OutlineRoot.AddChild('Mostrar Fontes', 195, 30); // Links para coordenadas

    // Exibir três principais famílias de fontes comumente disponíveis em todos os sistemas
    ShowFontGroup('Arial', 50); // Fonte sans-serif em X=50
    ShowFontGroup('Times New Roman', 180); // Fonte serif em X=180
    ShowFontGroup('Courier New', 350); // Fonte monoespaçada em X=350

    // ====================================================================
    // SEÇÃO 2: DEMONSTRAÇÃO DE CONJUNTOS DE CARACTERES
    // ====================================================================
    // Esta seção demonstra o manuseio adequado de diferentes codificações de caracteres Windows

    // Criar cabeçalho de seção
    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    HotPDF.CurrentPage.TextOut(200, 170, 0, WideString('Conjuntos de Caracteres'));

    // Criar grupo de estrutura para conjuntos de caracteres com estrutura expansível
    // OutlineRoot.AddChild: Cria uma nova entrada de marcador/estrutura na árvore de navegação PDF
    // Parâmetros: ('Título', coordenada-X, coordenada-Y)
    // - 'Conjuntos de Caracteres': Texto de exibição mostrado no painel de estrutura/marcador PDF
    // - 250: Coordenada X (posição horizontal) para onde o clique navegará
    // - 170: Coordenada Y (posição vertical) para onde o clique navegará
    CurrnetOutline := OutlineRoot.AddChild('Conjuntos de Caracteres', 250, 170);
    CurrnetOutline.Opened := true; // Expandir esta seção de estrutura por padrão

    CurrnetOutline.AddChild('ARABIC_CHARSET', 50, 225);
    // Conjunto de caracteres árabe: faixa Unicode U+0600-U+0659 (90 caracteres)
    // Faixa: 1536-1625 (bloco árabe incluindo letras, pontuação, números e diacríticos)
    // Exibe 90 caracteres árabes em 3 fileiras de 30 caracteres cada
    // Usado para: árabe, persa, urdu, pashto, curdo e outros scripts RTL

    // procedure ShowCharset(FontCharset: TFontCharset; First, Last: Integer; Y1, Y2: Integer);
    // First é o código do primeiro caractere, saída sequencial até o último caractere
    // Y1 é a coordenada Y do título, e Y2 é a coordenada Y inicial dos caracteres
    ShowCharset(ARABIC_CHARSET, 1536, 1625, 225, 250);

    CurrnetOutline.AddChild('EASTEUROPE_CHARSET', 50, 325);
    // Conjunto de caracteres europeu oriental: faixa Unicode U+00A0-U+00F9 (90 caracteres)
    // Faixa: 160-249 (Suplemento Latin-1 com caracteres acentuados e símbolos)
    // Exibe 90 caracteres latinos estendidos em 3 fileiras de 30 caracteres cada
    // Usado para: francês, alemão, espanhol, português, italiano, holandês, idiomas nórdicos

    // ShowCharset é apenas para demonstrar a exibição de caracteres do conjunto de caracteres através de códigos de caracteres
    // para exibição de texto regular, você só precisa usar TextOut para mostrar diretamente a string necessária
    ShowCharset(EASTEUROPE_CHARSET, 160, 249, 325, 350);

    CurrnetOutline.AddChild('OEM_CHARSET', 50, 425);
    // Conjunto de caracteres OEM: faixa ASCII 32-121 (90 caracteres)
    // Faixa: 32-121 (ASCII imprimível incluindo espaço, símbolos, números e letras)
    // Exibe 90 caracteres ASCII em 3 fileiras de 30 caracteres cada
    // Usado para: aplicações DOS, saída de console, sistemas legados
    ShowCharset(OEM_CHARSET, 32, 121, 425, 450);

    CurrnetOutline.AddChild('RUSSIAN_CHARSET', 50, 525);
    // Conjunto de caracteres russo: faixa Unicode U+0400-U+0459 (90 caracteres)
    // Faixa: 1024-1113 (bloco cirílico incluindo letras russas, ucranianas, búlgaras)
    // Exibe 90 caracteres cirílicos em 3 fileiras de 30 caracteres cada
    // Usado para: russo, búlgaro, sérvio (cirílico), macedônio, ucraniano, bielorrusso
    ShowCharset(RUSSIAN_CHARSET, 1024, 1113, 525, 550);

    CurrnetOutline.AddChild('TURKISH_CHARSET', 50, 625);
    // Conjunto de caracteres turco: faixa Unicode U+00A1-U+00FF (95 caracteres)
    // Faixa: 161-255 (Suplemento Latin-1 imprimível, evitando caracteres de controle 128-160)
    // Exibe 90 caracteres em 3 fileiras de 30 caracteres cada (primeiros 90 dos 95 disponíveis)
    // Inclui especiais turcos: Ç(199), ç(231), Ğ(208), ğ(240), İ(221), ı(253), Ö(214), ö(246), Ş(222), ş(254), Ü(220), ü(252)
    // Usado para: idioma turco com seus caracteres únicos e símbolos europeus
    ShowCharset(TURKISH_CHARSET, 161, 255, 625, 650);

    // ====================================================================
    // SEÇÃO 3: DEMONSTRAÇÃO DE DIMENSIONAMENTO DE TEXTO
    // ====================================================================
    // Esta seção mostra como o dimensionamento horizontal de texto afeta a aparência do texto
    // O dimensionamento modifica a largura dos caracteres mantendo a altura

    // Iniciar nova página para demonstrações de formatação avançada de texto
    HotPDF.AddPage;

    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    OutlineRoot.AddChild('Dimensionamento horizontal de texto', 180, 40); // Adicionar à navegação da estrutura principal
    HotPDF.CurrentPage.TextOut(180, 40, 0, WideString('Dimensionamento horizontal de texto'));

    // Criar estrutura de tabela de comparação
    ShowTable(130, 80);

    // Adicionar rótulos descritivos para a comparação
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 12);
    HotPDF.CurrentPage.TextOut(160, 100, 0, WideString('padrão 100')); // Rótulo de dimensionamento normal
    HotPDF.CurrentPage.TextOut(165, 145, 0, WideString('definido para 50')); // Rótulo de dimensionamento comprimido

    // Demonstrar dimensionamento normal de texto (100% - padrão)
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 24);
    HotPDF.CurrentPage.TextOut(280, 95, 0, WideString('Palavra'));

    // Demonstrar dimensionamento comprimido de texto (50% de largura)
    HotPDF.CurrentPage.SetHorizontalScaling(50); // Comprimir texto para 50% de largura
    HotPDF.CurrentPage.TextOut(285, 140, 0, WideString('Palavra'));
    HotPDF.CurrentPage.SetHorizontalScaling(100); // Redefinir para dimensionamento normal

    // ====================================================================
    // SEÇÃO 4: DEMONSTRAÇÃO DE ESPAÇAMENTO DE CARACTERES
    // ====================================================================
    // Esta seção demonstra como o espaçamento de caracteres afeta a legibilidade do texto
    // O espaçamento de caracteres adiciona espaço uniforme entre caracteres individuais

    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    OutlineRoot.AddChild('Espaçamento de Caracteres', 200, 220);
    HotPDF.CurrentPage.TextOut(200, 220, 0, WideString('Espaçamento de Caracteres'));

    // Criar tabela de comparação
    ShowTable(130, 260);

    // Adicionar rótulos descritivos
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 12);
    HotPDF.CurrentPage.TextOut(162, 280, 0, WideString('padrão 0')); // Rótulo de espaçamento normal
    HotPDF.CurrentPage.TextOut(162, 330, 0, WideString('espaço definido 5')); // Rótulo de espaçamento expandido

    // Demonstrar espaçamento normal de caracteres (0 - padrão)
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 24);
    HotPDF.CurrentPage.TextOut(278, 275, 0, WideString('Caractere'));

    // Demonstrar espaçamento expandido de caracteres (+5 unidades entre caracteres)
    HotPDF.CurrentPage.SetCharacterSpacing(5); // Adicionar 5 unidades entre cada caractere
    HotPDF.CurrentPage.TextOut(278, 320, 0, WideString('Caractere'));
    HotPDF.CurrentPage.SetCharacterSpacing(0); // Redefinir para espaçamento normal

    // ====================================================================
    // SEÇÃO 5: DEMONSTRAÇÃO DE ESPAÇAMENTO DE PALAVRAS
    // ====================================================================
    // Esta seção demonstra como o espaçamento de palavras afeta o layout do texto
    // O espaçamento de palavras adiciona espaço especificamente entre palavras (em caracteres de espaço)

    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    OutlineRoot.AddChild('Espaçamento de Palavras', 200, 380);
    HotPDF.CurrentPage.TextOut(200, 380, 0, WideString('Espaçamento de Palavras'));

    // Criar tabela de comparação
    ShowTable(130, 420);

    // Adicionar rótulos descritivos
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 12);
    HotPDF.CurrentPage.TextOut(162, 440, 0, WideString('padrão 0')); // Rótulo de espaçamento normal de palavras
    HotPDF.CurrentPage.TextOut(162, 490, 0, WideString('espaço definido 10')); // Rótulo de espaçamento expandido de palavras

    // Demonstrar espaçamento normal de palavras (0 - padrão)
    HotPDF.CurrentPage.SetFont('Times New Roman', [], 24);
    HotPDF.CurrentPage.TextOut(280, 430, 0, WideString('Espaço Palavra'));

    // Demonstrar espaçamento expandido de palavras (+10 unidades entre palavras)
    HotPDF.CurrentPage.SetWordSpacing(10); // Adicionar 10 unidades entre palavras
    HotPDF.CurrentPage.TextOut(280, 480, 0, WideString('Espaço Palavra'));
    HotPDF.CurrentPage.SetWordSpacing(0); // Redefinir para espaçamento normal

    // ====================================================================
    // SEÇÃO 6: DEMONSTRAÇÃO DE MODOS DE RENDERIZAÇÃO DE TEXTO
    // ====================================================================
    // Esta seção demonstra diferentes efeitos de renderização de texto disponíveis em PDF
    // O texto pode ser preenchido, contornado, ambos, ou invisível (para efeitos avançados)

    HotPDF.CurrentPage.SetFont('Arial', [fsBold, fsUnderline], 20);
    OutlineRoot.AddChild('Modos de Renderização', 200, 550);
    HotPDF.CurrentPage.TextOut(200, 550, 0, WideString('Modos de Renderização'));

    // Criar uma estrutura de tabela complexa para comparação de modos de renderização
    // Contorno da tabela principal (500x150 pixels)
    HotPDF.CurrentPage.Rectangle(50, 600, 500, 150);
    HotPDF.CurrentPage.Stroke;

    // Divisores verticais criando 4 colunas de largura igual
    HotPDF.CurrentPage.MoveTo(175, 600); // Primeiro divisor
    HotPDF.CurrentPage.LineTo(175, 750);
    HotPDF.CurrentPage.Stroke;

    HotPDF.CurrentPage.MoveTo(300, 600); // Segundo divisor
    HotPDF.CurrentPage.LineTo(300, 750);
    HotPDF.CurrentPage.Stroke;

    HotPDF.CurrentPage.MoveTo(425, 600); // Terceiro divisor
    HotPDF.CurrentPage.LineTo(425, 750);
    HotPDF.CurrentPage.Stroke;

    // Divisor horizontal separando cabeçalho do conteúdo
    HotPDF.CurrentPage.MoveTo(50, 665);
    HotPDF.CurrentPage.LineTo(550, 665);
    HotPDF.CurrentPage.Stroke;

    // Adicionar cabeçalhos de colunas descrevendo cada modo de renderização
    HotPDF.CurrentPage.SetFont('Arial', [], 12);
    HotPDF.CurrentPage.TextOut(100, 620, 0, WideString('Preencher')); // Modo preencher - texto colorido sólido
    HotPDF.CurrentPage.TextOut(215, 620, 0, WideString('Contorno')); // Modo contorno - texto contornado
    HotPDF.CurrentPage.TextOut(320, 620, 0, WideString('Preencher Contorno')); // Modo combinado - preenchido com contorno
    HotPDF.CurrentPage.TextOut(465, 620, 0, WideString('Invisível')); // Modo invisível - para efeitos especiais

    // Configurar cores para demonstração dramática de efeito de renderização
    HotPDF.CurrentPage.SetFont('Arial', [fsBold], 72); // Fonte grande para visibilidade clara
    HotPDF.CurrentPage.SetRGBStrokeColor(clRed); // Cor de contorno vermelha
    HotPDF.CurrentPage.SetRGBFillColor(clYellow); // Cor de preenchimento amarela

    // Demonstrar modo de renderização Preencher - texto colorido sólido
    HotPDF.CurrentPage.SetTextRenderingMode(trFill);
    HotPDF.CurrentPage.TextOut(90, 670, 0, WideString('P'));

    // Demonstrar modo de renderização Contorno - apenas texto contornado
    HotPDF.CurrentPage.SetTextRenderingMode(trStroke);
    HotPDF.CurrentPage.TextOut(215, 670, 0, WideString('D'));

    // Demonstrar modo de renderização Preencher+Contorno - texto preenchido com contorno colorido
    HotPDF.CurrentPage.SetTextRenderingMode(trFillThenStroke);
    HotPDF.CurrentPage.TextOut(340, 670, 0, WideString('F'));

    // Demonstrar modo de renderização Invisível - texto está presente mas não visível
    // (útil para texto pesquisável sobre imagens, ou técnicas de layout avançadas)
    HotPDF.CurrentPage.SetTextRenderingMode(trInvisible);
    HotPDF.CurrentPage.TextOut(475, 670, 0, WideString('X'));

    // Redefinir para modo de renderização padrão para qualquer texto subsequente
    HotPDF.CurrentPage.SetTextRenderingMode(trFillThenStroke);

    // Finalizar e salvar o documento PDF
    HotPDF.EndDoc;

  finally
    // Garantir limpeza adequada do componente 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