Привет мир от Delphi HotPDF Component
Добро пожаловать в подробное руководство по демонстрационной программе HelloWorld для Delphi HotPDF Component!
О HotPDF Component
HotPDF Component – это мощная и универсальная библиотека для обработки PDF, специально разработанная для разработчиков Delphi и C++Builder. Этот комплексный компонент предоставляет обширный API, который позволяет разработчикам легко и точно создавать, манипулировать и изменять PDF-документы.
Ключевые особенности HotPDF Component:
- Создание и генерация PDF: Создание PDF-документов с нуля с полным контролем над макетом, форматированием и содержимым
- Поддержка текста и графики: Добавление текста, изображений, фигур и сложной графики на страницы PDF
- Многоязычная поддержка: Полная поддержка Unicode для международного отображения текста
- Управление шрифтами: Встраивание шрифтов для согласованного внешнего вида документа в различных системах
- Опции сжатия: Множественные алгоритмы сжатия для оптимизации размера файла
- Функции безопасности: Шифрование документов, защита паролем и контроль разрешений
- Манипуляция документами: Объединение, разделение и изменение существующих PDF-документов
- Поддержка таблиц и форм: Создание сложных таблиц и интерактивных форм
Обзор программы HelloWorld.dpr
Пример программы HelloWorld.dpr
служит отличным введением в самую базовую и важную функцию HotPDF Component: функцию TexOut. Эта демонстрационная программа также демонстрирует базовую функциональность создания PDF.
Основная функциональность:
1. Создание PDF-документа
Основная функция программы – генерация PDF-документов, содержащих многоязычный текст “Hello World”. Процедура CreatePDF
демонстрирует:
- Инициализация компонента: Правильная настройка и конфигурация компонента THotPDF
- Свойства документа: Установка метаданных, таких как опции сжатия и встраивание шрифтов
- Многоязычное отображение текста: Отображение текста на 11 различных языках, включая английский, испанский, немецкий, французский, итальянский, португальский, русский, японский, турецкий, китайский и корейский
- Управление шрифтами: Использование Arial Unicode MS для большинства языков и Malgun Gothic для корейского текста
- Сравнение сжатия: Создание как сжатых, так и несжатых версий для демонстрации различий в размере файла
2. Управление окнами и интеграция с системой
Программа включает сложную функциональность перечисления окон, которая демонстрирует:
- Перечисление системных окон: Использование Windows API функции
EnumWindows
для итерации по всем окнам верхнего уровня - Сопоставление заголовков окон: Реализация сопоставления подстрок для идентификации целевых приложений
- Автоматическое закрытие окон: Отправка сообщений
WM_CLOSE
для закрытия PDF-просмотрщиков, которые могут иметь открытые файлы - Предотвращение конфликтов: Обеспечение отсутствия конфликтов доступа к файлам при создании новых PDF-файлов
3. Обработка ошибок и управление ресурсами
Программа демонстрирует лучшие практики для:
- Управление памятью: Правильное создание и освобождение экземпляров компонентов
- Безопасность исключений: Использование блоков try-finally для обеспечения очистки ресурсов
- Обратная связь с пользователем: Предоставление вывода в консоль для информирования пользователей о ходе выполнения программы
Детали технической реализации:
Технология сжатия
Программа создает две версии одного и того же PDF для демонстрации эффективности сжатия FlateDecode:
- Несжатая версия: Более быстрое время создания, больший размер файла
- Сжатая версия: Немного более длительное время создания, значительно меньший размер файла
Стратегия обработки шрифтов
Программа использует сложную стратегию выбора шрифтов:
- Arial Unicode MS: Используется для большинства языков из-за широкой поддержки символов
- Malgun Gothic Semilight: Специально выбран для отображения корейского текста
- Встраивание шрифтов: Обеспечивает согласованный внешний вид в различных системах
Совместимость между версиями
Код включает директивы условной компиляции для поддержки как современных, так и устаревших версий Delphi:
- Поддержка XE2+: Использует модули с пространствами имен (WinApi.Windows, System.SysUtils и т.д.)
- Поддержка устаревших версий: Возвращается к традиционным именам модулей для старых версий Delphi
- Интеграция EurekaLog: Дополнительная поддержка обнаружения утечек памяти и отладки
Образовательная ценность
Этот пример HelloWorld служит нескольким образовательным целям:
- Введение в компонент: Предоставляет мягкое введение в использование HotPDF Component
- Лучшие практики: Демонстрирует правильное управление ресурсами и обработку ошибок
- Системная интеграция: Показывает, как интегрировать генерацию PDF с операциями системы Windows
- Интернационализация: Иллюстрирует обработку многоязычного текста в PDF-документах
- Соображения производительности: Сравнивает различные стратегии сжатия и их компромиссы
Начало работы
Для запуска этой примерной программы:
- Убедитесь, что HotPDF Component правильно установлен в вашей IDE Delphi
- Откройте файл проекта HelloWorld.dpr
- Скомпилируйте и запустите программу
- Программа автоматически создаст два PDF-файла, демонстрирующих различия в сжатии
- Изучите сгенерированные файлы, чтобы увидеть многоязычное отображение текста и сравнить размеры файлов
Исходный код
Ниже приведен полный, хорошо документированный исходный код демонстрационной программы 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 |
{************************************************************} // HotPDF PDF Component // Copyright(c)2007-2025, https://www.loslab.com {************************************************************} // Демонстрационная программа HelloWorld для HotPDF Component // Эта программа демонстрирует базовые возможности создания PDF // включая многоязычную поддержку текста и опции сжатия {************************************************************} program HelloWorld; {$APPTYPE CONSOLE} // Тип консольного приложения {$I ..\..\..\Lib\HotPDF.inc} // Включить файл конфигурации HotPDF uses // Модули EurekaLog для обнаружения утечек памяти и отладки (опционально) {$IFDEF EurekaLog} EMemLeaks, // Обнаружение утечек памяти EResLeaks, // Обнаружение утечек ресурсов EDebugJCL, // Поддержка отладки JCL EDebugExports, // Экспорт отладочной информации EFixSafeCallException, // Обработка исключений SafeCall EMapWin32, // Поддержка сопоставления Win32 EAppConsole, // Поддержка консольного приложения EDialogConsole, // Поддержка консольного диалога ExceptionLog7, // Логирование исключений {$ENDIF EurekaLog} // Системные модули - разные пространства имен для XE2+ против старых версий {$IFDEF XE2+} WinApi.Windows, // Функции Windows API WinApi.Messages, // Константы сообщений Windows System.SysUtils, // Системные утилиты System.Classes, // Базовые классы (TStringList и т.д.) Vcl.Graphics, // Поддержка графики {$ELSE} Windows, // Функции Windows API (старый Delphi) Messages, // Константы сообщений Windows (старый Delphi) SysUtils, // Системные утилиты (старый Delphi) Classes, // Базовые классы (старый Delphi) Graphics, // Поддержка графики (старый Delphi) {$ENDIF} HPDFDoc; // Основной модуль компонента HotPDF // Создает PDF-файл с многоязычным текстом "Hello World" // Параметры: // FileName: Имя выходного PDF-файла // UseCompression: True для включения сжатия FlateDecode, False для отсутствия сжатия procedure CreatePDF(const FileName: string; UseCompression: Boolean); var HotPDF: THotPDF; // Экземпляр основного компонента HotPDF begin // Создать экземпляр компонента HotPDF HotPDF := THotPDF.Create(nil); try // Настроить свойства PDF HotPDF.AutoLaunch := true; // Автоматически открыть PDF после создания HotPDF.FileName := FileName; // Установить имя выходного файла // Установить сжатие на основе параметра if UseCompression then begin HotPDF.Compression := cmFlateDecode; // Включить сжатие FlateDecode WriteLn('Создание сжатого PDF: ', FileName); end else begin HotPDF.Compression := cmNone; // Без сжатия WriteLn('Создание несжатого PDF: ', FileName); end; HotPDF.FontEmbedding := true; // Встроить шрифты для лучшей совместимости HotPDF.BeginDoc; // Начать создание PDF-документа // Установить Unicode шрифт для поддержки многоязычного текста // Arial Unicode MS поддерживает большинство языков, кроме корейского // procedure SetFont ( FontName: AnsiString; FontStyle: TFontStyles; ASize: Single; FontCharset: TFontCharset = DEFAULT_CHARSET; IsVertical: boolean = false); // DEFAULT_CHARSET: 1 - Шрифт выбирается на основе имени. Если описанный шрифт недоступен в системе, Windows заменит его другим шрифтом HotPDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 1, False); // Отобразить "Hello World" на нескольких языках // Параметры TextOut: (X, Y, Угол, Текст) HotPDF.CurrentPage.TextOut(80, 50, 0, 'Hello, Delphi PDF world!'); // Английский HotPDF.CurrentPage.TextOut(80, 70, 0, 'Hola, mundo Delphi PDF!'); // Испанский HotPDF.CurrentPage.TextOut(80, 90, 0, 'Hallo, Delphi PDF Welt!'); // Немецкий HotPDF.CurrentPage.TextOut(80, 110, 0, 'Bonjour, monde PDF Delphi!'); // Французский HotPDF.CurrentPage.TextOut(80, 130, 0, 'Ciao, mondo Delphi PDF!'); // Итальянский HotPDF.CurrentPage.TextOut(80, 150, 0, 'Olá, mundo Delphi PDF!'); // Португальский HotPDF.CurrentPage.TextOut(80, 170, 0, 'Здравствуйте, Delphi PDF мир!'); // Русский HotPDF.CurrentPage.TextOut(80, 190, 0, 'こんにちは、Delphi PDFの世界!'); // Японский HotPDF.CurrentPage.TextOut(80, 210, 0, 'Merhaba, Delphi PDF dünyası!'); // Турецкий HotPDF.CurrentPage.TextOut(80, 230, 0, '你好,Delphi PDF世界'); // Китайский // Корейский текст требует специального корейского шрифта // Arial Unicode MS не поддерживает корейские символы должным образом HotPDF.CurrentPage.SetFont('Malgun Gothic Semilight', [], 12, 0, False); HotPDF.CurrentPage.TextOut(80, 250, 0, '여보세요, Delphi PDF 세계!'); // Корейский HotPDF.EndDoc; // Завершить и сохранить PDF-документ WriteLn('PDF успешно создан: ', FileName); finally HotPDF.Free; // Очистить компонент HotPDF end; end; // Глобальные переменные для перечисления окон и создания PDF var Title: String; // Отдельная строка заголовка (не используется в текущей реализации) Titles: TStrings; // Список заголовков окон для поиска Window: HWND; // Дескриптор окна (не используется в текущей реализации) WindowText: array[0..255] of Char; // Буфер для текста окна (не используется в текущей реализации) WindowTitle: String; // Строка заголовка окна (не используется в текущей реализации) I: Integer; // Счетчик цикла (не используется в текущей реализации) // Функция обратного вызова для API EnumWindows // Эта функция вызывается для каждого окна верхнего уровня в системе // Параметры: // hWnd: Дескриптор текущего перечисляемого окна // lParam: Пользовательские данные (в нашем случае указатель на TStrings с целевыми заголовками) // Возвращает: True для продолжения перечисления, False для остановки function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; var Titles: TStrings; // Список целевых заголовков окон I: Integer; // Счетчик цикла WindowText: array[0..255] of Char; // Буфер для хранения текста окна WindowTitle: String; // Заголовок текущего окна как строка begin Result := True; // Продолжить перечисление по умолчанию Titles := TStrings(lParam); // Привести lParam обратно к TStrings // Получить текст заголовка окна if GetWindowText(hWnd, WindowText, SizeOf(WindowText)) > 0 then begin WindowTitle := String(WindowText); // Преобразовать массив символов в строку // Проверить, содержит ли заголовок окна любую из наших целевых строк for I := 0 to Titles.Count - 1 do begin // Использовать функцию Pos для проверки, содержится ли целевая строка в заголовке окна if Pos(Titles[I], WindowTitle) > 0 then begin // Отправить сообщение WM_CLOSE для закрытия окна PostMessage(hWnd, WM_CLOSE, 0, 0); Break; // Выйти из цикла после нахождения первого совпадения end; end; end; end; // Основное выполнение программы начинается здесь begin // Закрыть любые существующие PDF-файлы, которые могут быть открыты в PDF-просмотрщиках // Это предотвращает конфликты доступа к файлам при создании новых PDF с теми же именами Titles := TStringList.Create; try // Определить список подстрок заголовков окон для поиска // Любое окно, содержащее эти строки, будет закрыто // Это закроет Adobe и Foxit PDF reader & editor и многие другие PDF-приложения Titles.CommaText := '"HelloWorld-compressed.pdf", "HelloWorld-uncompressed.pdf", "Foxit"'; // Перечислить все окна верхнего уровня и закрыть соответствующие // EnumWindows вызывает нашу функцию обратного вызова для каждого окна EnumWindows(@EnumWindowsProc, LPARAM(Titles)); finally Titles.Free; // Очистить список строк end; // Отобразить заголовок программы WriteLn('=== Тест сжатия HotPDF ==='); WriteLn('Эта демонстрация создает два PDF-файла для демонстрации различий в сжатии.'); WriteLn(''); // Сначала создать несжатый PDF // Эта версия будет больше, но быстрее создается CreatePDF('HelloWorld-uncompressed.pdf', False); // Затем создать сжатый PDF // Эта версия будет меньше, но займет немного больше времени для создания CreatePDF('HelloWorld-compressed.pdf', True); // Отобразить сообщение о завершении WriteLn(''); WriteLn('Все PDF-файлы успешно созданы!'); WriteLn('Пожалуйста, проверьте файлы для сравнения сжатых и несжатых версий.'); WriteLn('Вы можете изучить размеры файлов, чтобы увидеть эффект сжатия.'); WriteLn(''); WriteLn('Нажмите Enter для выхода...'); ReadLn; // Ждать ввода пользователя перед закрытием консоли end. |
Discover more from losLab Software Development
Subscribe to get the latest posts sent to your email.