Привет мир от Delphi HotPDF Component

Привет мир от 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-документах
  • Соображения производительности: Сравнивает различные стратегии сжатия и их компромиссы

Начало работы

Для запуска этой примерной программы:

  1. Убедитесь, что HotPDF Component правильно установлен в вашей IDE Delphi
  2. Откройте файл проекта HelloWorld.dpr
  3. Скомпилируйте и запустите программу
  4. Программа автоматически создаст два PDF-файла, демонстрирующих различия в сжатии
  5. Изучите сгенерированные файлы, чтобы увидеть многоязычное отображение текста и сравнить размеры файлов

Исходный код

Ниже приведен полный, хорошо документированный исходный код демонстрационной программы HelloWorld:

{************************************************************}
// 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.

 

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