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 文档中的多语言文本处理
- 性能考虑: 比较不同压缩策略及其权衡
入门指南
要运行此示例程序:
- 确保 HotPDF 组件已正确安装在您的 Delphi IDE 中
- 打开 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 |
{************************************************************} // 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. |
Discover more from losLab Software Development
Subscribe to get the latest posts sent to your email.