Categories: PDF编程

Delphi HotPDF 开发组件 Hello World 示例程序

Delphi HotPDF 组件 Hello World 示例

欢迎来到 Delphi HotPDF 组件 HelloWorld 演示程序的详细指南!

关于 HotPDF 组件

HotPDF 组件是一个功能强大且多用途的 PDF 处理库,专为 Delphi 和 C++Builder 开发者设计。这个综合性组件提供了广泛的 API,使开发者能够轻松精确地创建、操作和修改 PDF 文档。

HotPDF 组件的主要功能:

  • PDF 创建与生成: 从零开始创建 PDF 文档,完全控制布局、格式和内容
  • 文本与图形支持: 向 PDF 页面添加文本、图像、形状和复杂图形
  • 多语言支持: 完整的 Unicode 支持,用于国际化文本渲染
  • 字体管理: 嵌入字体以确保在不同系统上的文档外观一致性
  • 压缩选项: 多种压缩算法来优化文件大小
  • 安全功能: 文档加密、密码保护和权限控制
  • 文档操作: 合并、拆分和修改现有 PDF 文档
  • 表格与表单支持: 创建复杂表格和交互式表单

HelloWorld.dpr 程序概述

HelloWorld.dpr 示例程序是 HotPDF 组件功能的绝佳入门介绍。这个演示程序展示了基本的 PDF 创建功能和高级系统集成特性。

核心功能:

1. PDF 文档创建

程序的主要功能是生成包含多语言”Hello World”文本的 PDF 文档。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 组件使用的温和介绍
  • 最佳实践: 演示正确的资源管理和错误处理
  • 系统集成: 展示如何将 PDF 生成与 Windows 系统操作集成
  • 国际化: 说明 PDF 文档中的多语言文本处理
  • 性能考虑: 比较不同压缩策略及其权衡

入门指南

要运行此示例程序:

  1. 确保 HotPDF 组件已正确安装在您的 Delphi IDE 中
  2. 打开 HelloWorld.dpr 项目文件
  3. 编译并运行程序
  4. 程序将自动创建两个 PDF 文件,演示压缩差异
  5. 检查生成的文件以查看多语言文本渲染并比较文件大小

源代码

以下是 HelloWorld 演示程序的完整、详细注释的源代码:

{************************************************************}
// HotPDF PDF 组件
// 版权所有(c)2007-2025, https://www.loslab.com
{************************************************************}
// HotPDF 组件的 HelloWorld 演示程序
// 此程序演示基本的 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 主组件单元

// 创建包含多语言 "Hello World" 文本的 PDF 文件
// 参数:
//   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('Creating compressed PDF: ', FileName);
    end
    else
    begin
      HotPDF.Compression := cmNone;         // 不压缩
      WriteLn('Creating uncompressed 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, Angle, Text)
    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 created successfully: ', 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;                           // 循环计数器(当前实现中未使用)

// EnumWindows API 的回调函数
// 此函数对系统中的每个顶级窗口调用
// 参数:
//   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 阅读器和编辑器以及许多其他 PDF 应用程序
    Titles.CommaText := '"HelloWorld-compressed.pdf", "HelloWorld-uncompressed.pdf", "Foxit"';

    // 枚举所有顶级窗口并关闭匹配的窗口
    // EnumWindows 为每个窗口调用我们的回调函数
    EnumWindows(@EnumWindowsProc, LPARAM(Titles));
  finally
    Titles.Free;  // 清理字符串列表
  end;

  // 显示程序标题
  WriteLn('=== HotPDF Compression Test ===');
  WriteLn('This demo creates two PDF files to demonstrate compression differences.');
  WriteLn('');

  // 首先创建未压缩的 PDF
  // 此版本文件较大但创建速度更快
  CreatePDF('HelloWorld-uncompressed.pdf', False);

  // 然后创建压缩的 PDF
  // 此版本文件较小但创建时间稍长
  CreatePDF('HelloWorld-compressed.pdf', True);

  // 显示完成消息
  WriteLn('');
  WriteLn('All PDF files created successfully!');
  WriteLn('Please check the files to compare compressed vs uncompressed versions.');
  WriteLn('You can examine file sizes to see the compression effect.');
  WriteLn('');
  WriteLn('Press Enter to exit...');
  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