Hola Mundo del Componente Delphi HotPDF
¡Bienvenido a la guía completa del programa de demostración HelloWorld del Componente Delphi HotPDF!
Acerca del Componente HotPDF
El Componente HotPDF es una biblioteca de procesamiento de PDF potente y versátil diseñada específicamente para desarrolladores de Delphi y C++Builder. Este componente integral proporciona una API extensa que permite a los desarrolladores crear, manipular y modificar documentos PDF con facilidad y precisión.
Características Principales del Componente HotPDF:
- Creación y Generación de PDF: Crear documentos PDF desde cero con control total sobre el diseño, formato y contenido
- Soporte de Texto y Gráficos: Agregar texto, imágenes, formas y gráficos complejos a las páginas PDF
- Soporte Multilingüe: Soporte completo de Unicode para renderizado de texto internacional
- Gestión de Fuentes: Incrustar fuentes para una apariencia consistente del documento en diferentes sistemas
- Opciones de Compresión: Múltiples algoritmos de compresión para optimizar el tamaño del archivo
- Características de Seguridad: Cifrado de documentos, protección con contraseña y controles de permisos
- Manipulación de Documentos: Fusionar, dividir y modificar documentos PDF existentes
- Soporte de Tablas y Formularios: Crear tablas complejas y formularios interactivos
Descripción General del Programa HelloWorld.dpr
El programa de ejemplo HelloWorld.dpr
sirve como una excelente introducción a la característica más básica e importante del Componente HotPDF: La función TexOut. Este programa de demostración también muestra la funcionalidad básica de creación de PDF.
Funcionalidad Principal:
1. Creación de Documentos PDF
La función principal del programa es generar documentos PDF que contienen texto “Hola Mundo” multilingüe. El procedimiento CreatePDF
demuestra:
- Inicialización del Componente: Configuración y configuración adecuada del componente THotPDF
- Propiedades del Documento: Establecer metadatos como opciones de compresión e incrustación de fuentes
- Renderizado de Texto Multilingüe: Mostrar texto en 11 idiomas diferentes incluyendo inglés, español, alemán, francés, italiano, portugués, ruso, japonés, turco, chino y coreano
- Gestión de Fuentes: Usar Arial Unicode MS para la mayoría de idiomas y Malgun Gothic para texto coreano
- Comparación de Compresión: Crear versiones comprimidas y sin comprimir para demostrar las diferencias de tamaño de archivo
2. Gestión de Ventanas e Integración del Sistema
El programa incluye funcionalidad sofisticada de enumeración de ventanas que demuestra:
- Enumeración de Ventanas del Sistema: Usar la función
EnumWindows
de la API de Windows para iterar a través de todas las ventanas de nivel superior - Coincidencia de Títulos de Ventana: Implementar coincidencia de subcadenas para identificar aplicaciones objetivo
- Cierre Automatizado de Ventanas: Enviar mensajes
WM_CLOSE
para cerrar visores de PDF que podrían tener archivos abiertos - Prevención de Conflictos: Asegurar que no ocurran conflictos de acceso a archivos al crear nuevos archivos PDF
3. Manejo de Errores y Gestión de Recursos
El programa demuestra las mejores prácticas para:
- Gestión de Memoria: Creación y eliminación adecuada de instancias de componentes
- Seguridad de Excepciones: Usar bloques try-finally para asegurar la limpieza de recursos
- Retroalimentación del Usuario: Proporcionar salida de consola para informar a los usuarios del progreso del programa
Detalles de Implementación Técnica:
Tecnología de Compresión
El programa crea dos versiones del mismo PDF para demostrar la efectividad de la compresión FlateDecode:
- Versión Sin Comprimir: Tiempo de creación más rápido, tamaño de archivo más grande
- Versión Comprimida: Tiempo de creación ligeramente más largo, tamaño de archivo significativamente más pequeño
Estrategia de Manejo de Fuentes
El programa emplea una estrategia sofisticada de selección de fuentes:
- Arial Unicode MS: Usado para la mayoría de idiomas debido a su amplio soporte de caracteres
- Malgun Gothic Semilight: Específicamente elegido para renderizado de texto coreano
- Incrustación de Fuentes: Asegura apariencia consistente en diferentes sistemas
Compatibilidad Entre Versiones
El código incluye directivas de compilación condicional para soportar versiones modernas y heredadas de Delphi:
- Soporte XE2+: Usa unidades con espacios de nombres (WinApi.Windows, System.SysUtils, etc.)
- Soporte Heredado: Recurre a nombres de unidades tradicionales para versiones más antiguas de Delphi
- Integración EurekaLog: Detección opcional de fugas de memoria y soporte de depuración
Valor Educativo
Este ejemplo HelloWorld sirve múltiples propósitos educativos:
- Introducción al Componente: Proporciona una introducción suave al uso del Componente HotPDF
- Mejores Prácticas: Demuestra gestión adecuada de recursos y manejo de errores
- Integración del Sistema: Muestra cómo integrar la generación de PDF con operaciones del sistema Windows
- Internacionalización: Ilustra el manejo de texto multilingüe en documentos PDF
- Consideraciones de Rendimiento: Compara diferentes estrategias de compresión y sus compensaciones
Primeros Pasos
Para ejecutar este programa de ejemplo:
- Asegúrese de que el Componente HotPDF esté instalado correctamente en su IDE de Delphi
- Abra el archivo de proyecto HelloWorld.dpr
- Compile y ejecute el programa
- El programa creará automáticamente dos archivos PDF demostrando las diferencias de compresión
- Examine los archivos generados para ver el renderizado de texto multilingüe y comparar los tamaños de archivo
Código Fuente
A continuación se encuentra el código fuente completo y bien documentado para el programa de demostración HelloWorld:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
{************************************************************} // Componente PDF HotPDF // Copyright(c)2007-2025, https://www.loslab.com {************************************************************} // Programa Demo HelloWorld para Componente HotPDF // Este programa demuestra capacidades básicas de creación de PDF // incluyendo soporte de texto multilingüe y opciones de compresión {************************************************************} program HelloWorld; {$APPTYPE CONSOLE} // Tipo de aplicación de consola {$I ..\..\..\Lib\HotPDF.inc} // Incluir archivo de configuración HotPDF uses // Unidades EurekaLog para detección de fugas de memoria y depuración (opcional) {$IFDEF EurekaLog} EMemLeaks, // Detección de fugas de memoria EResLeaks, // Detección de fugas de recursos EDebugJCL, // Soporte de depuración JCL EDebugExports, // Exportar información de depuración EFixSafeCallException, // Manejo de excepciones SafeCall EMapWin32, // Soporte de mapeo Win32 EAppConsole, // Soporte de aplicación de consola EDialogConsole, // Soporte de diálogo de consola ExceptionLog7, // Registro de excepciones {$ENDIF EurekaLog} // Unidades del sistema - diferentes espacios de nombres para XE2+ vs versiones más antiguas {$IFDEF XE2+} WinApi.Windows, // Funciones de la API de Windows WinApi.Messages, // Constantes de mensajes de Windows System.SysUtils, // Utilidades del sistema System.Classes, // Clases base (TStringList, etc.) Vcl.Graphics, // Soporte de gráficos {$ELSE} Windows, // Funciones de la API de Windows (Delphi más antiguo) Messages, // Constantes de mensajes de Windows (Delphi más antiguo) SysUtils, // Utilidades del sistema (Delphi más antiguo) Classes, // Clases base (Delphi más antiguo) Graphics, // Soporte de gráficos (Delphi más antiguo) {$ENDIF} HPDFDoc; // Unidad del componente principal HotPDF // Crea un archivo PDF con texto "Hola Mundo" multilingüe // Parámetros: // FileName: Nombre del archivo PDF de salida // UseCompression: True para habilitar compresión FlateDecode, False para sin compresión procedure CreatePDF(const FileName: string; UseCompression: Boolean); var HotPDF: THotPDF; // Instancia del componente principal HotPDF begin // Crear instancia del componente HotPDF HotPDF := THotPDF.Create(nil); try // Configurar propiedades del PDF HotPDF.AutoLaunch := true; // Abrir automáticamente el PDF después de la creación HotPDF.FileName := FileName; // Establecer nombre del archivo de salida // Establecer compresión basada en el parámetro if UseCompression then begin HotPDF.Compression := cmFlateDecode; // Habilitar compresión FlateDecode WriteLn('Creando PDF comprimido: ', FileName); end else begin HotPDF.Compression := cmNone; // Sin compresión WriteLn('Creando PDF sin comprimir: ', FileName); end; HotPDF.FontEmbedding := true; // Incrustar fuentes para mejor compatibilidad HotPDF.BeginDoc; // Iniciar creación del documento PDF // Establecer fuente Unicode para soporte de texto multilingüe // Arial Unicode MS soporta la mayoría de idiomas excepto coreano // procedure SetFont ( FontName: AnsiString; FontStyle: TFontStyles; ASize: Single; FontCharset: TFontCharset = DEFAULT_CHARSET; IsVertical: boolean = false); // DEFAULT_CHARSET: 1 - La fuente se elige basada en el Nombre. Si la fuente descrita no está disponible en el sistema, Windows sustituirá otra fuente HotPDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 1, False); // Mostrar "Hola Mundo" en múltiples idiomas // Parámetros de TextOut: (X, Y, Ángulo, Texto) HotPDF.CurrentPage.TextOut(80, 50, 0, 'Hello, Delphi PDF world!'); // Inglés HotPDF.CurrentPage.TextOut(80, 70, 0, 'Hola, mundo Delphi PDF!'); // Español HotPDF.CurrentPage.TextOut(80, 90, 0, 'Hallo, Delphi PDF Welt!'); // Alemán HotPDF.CurrentPage.TextOut(80, 110, 0, 'Bonjour, monde PDF Delphi!'); // Francés HotPDF.CurrentPage.TextOut(80, 130, 0, 'Ciao, mondo Delphi PDF!'); // Italiano HotPDF.CurrentPage.TextOut(80, 150, 0, 'Olá, mundo Delphi PDF!'); // Portugués HotPDF.CurrentPage.TextOut(80, 170, 0, 'Здравствуйте, Delphi PDF мир!'); // Ruso HotPDF.CurrentPage.TextOut(80, 190, 0, 'こんにちは、Delphi PDFの世界!'); // Japonés HotPDF.CurrentPage.TextOut(80, 210, 0, 'Merhaba, Delphi PDF dünyası!'); // Turco HotPDF.CurrentPage.TextOut(80, 230, 0, '你好,Delphi PDF世界'); // Chino // El texto coreano requiere una fuente coreana específica // Arial Unicode MS no soporta adecuadamente los caracteres coreanos HotPDF.CurrentPage.SetFont('Malgun Gothic Semilight', [], 12, 0, False); HotPDF.CurrentPage.TextOut(80, 250, 0, '여보세요, Delphi PDF 세계!'); // Coreano HotPDF.EndDoc; // Finalizar y guardar el documento PDF WriteLn('PDF creado exitosamente: ', FileName); finally HotPDF.Free; // Limpiar componente HotPDF end; end; // Variables globales para enumeración de ventanas y creación de PDF var Title: String; // Cadena de título individual (no usado en la implementación actual) Titles: TStrings; // Lista de títulos de ventana a buscar Window: HWND; // Manejador de ventana (no usado en la implementación actual) WindowText: array[0..255] of Char; // Buffer para texto de ventana (no usado en la implementación actual) WindowTitle: String; // Cadena de título de ventana (no usado en la implementación actual) I: Integer; // Contador de bucle (no usado en la implementación actual) // Función de callback para la API EnumWindows // Esta función se llama para cada ventana de nivel superior en el sistema // Parámetros: // hWnd: Manejador de la ventana actual siendo enumerada // lParam: Datos definidos por el usuario (en nuestro caso, puntero a TStrings con títulos objetivo) // Retorna: True para continuar enumeración, False para parar function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; var Titles: TStrings; // Lista de títulos de ventana objetivo I: Integer; // Contador de bucle WindowText: array[0..255] of Char; // Buffer para almacenar texto de ventana WindowTitle: String; // Título de la ventana actual como cadena begin Result := True; // Continuar enumeración por defecto Titles := TStrings(lParam); // Convertir lParam de vuelta a TStrings // Obtener el texto del título de la ventana if GetWindowText(hWnd, WindowText, SizeOf(WindowText)) > 0 then begin WindowTitle := String(WindowText); // Convertir array de char a string // Verificar si el título de la ventana contiene alguna de nuestras cadenas objetivo for I := 0 to Titles.Count - 1 do begin // Usar función Pos para verificar si la cadena objetivo está contenida en el título de la ventana if Pos(Titles[I], WindowTitle) > 0 then begin // Enviar mensaje WM_CLOSE para cerrar la ventana PostMessage(hWnd, WM_CLOSE, 0, 0); Break; // Salir del bucle después de encontrar la primera coincidencia end; end; end; end; // La ejecución del programa principal comienza aquí begin // Cerrar cualquier archivo PDF existente que pueda estar abierto en visores de PDF // Esto previene conflictos de acceso a archivos al crear nuevos PDFs con los mismos nombres Titles := TStringList.Create; try // Definir lista de subcadenas de títulos de ventana a buscar // Cualquier ventana que contenga estas cadenas será cerrada // Esto cerrará Adobe y Foxit PDF reader & editor y muchas otras aplicaciones PDF Titles.CommaText := '"HelloWorld-compressed.pdf", "HelloWorld-uncompressed.pdf", "Foxit"'; // Enumerar todas las ventanas de nivel superior y cerrar las coincidentes // EnumWindows llama a nuestra función de callback para cada ventana EnumWindows(@EnumWindowsProc, LPARAM(Titles)); finally Titles.Free; // Limpiar lista de cadenas end; // Mostrar encabezado del programa WriteLn('=== Prueba de Compresión HotPDF ==='); WriteLn('Esta demo crea dos archivos PDF para demostrar las diferencias de compresión.'); WriteLn(''); // Crear PDF sin comprimir primero // Esta versión será más grande pero más rápida de crear CreatePDF('HelloWorld-uncompressed.pdf', False); // Crear PDF comprimido segundo // Esta versión será más pequeña pero toma ligeramente más tiempo crear CreatePDF('HelloWorld-compressed.pdf', True); // Mostrar mensaje de finalización WriteLn(''); WriteLn('¡Todos los archivos PDF creados exitosamente!'); WriteLn('Por favor revise los archivos para comparar versiones comprimidas vs sin comprimir.'); WriteLn('Puede examinar los tamaños de archivo para ver el efecto de compresión.'); WriteLn(''); WriteLn('Presione Enter para salir...'); ReadLn; // Esperar entrada del usuario antes de cerrar la consola end. |
Discover more from losLab Software Development
Subscribe to get the latest posts sent to your email.