掌握HotPDF组件中日韩文字PDF注释功能
PDF注释是创建交互式和协作文档最强大的功能之一。它们允许用户直接在PDF文件中添加评论、高亮、印章和多媒体内容,而无需修改原始文档结构。本综合指南探讨了如何使用HotPDF组件实现支持中日韩文字的各种类型的PDF注释,涵盖从基本多语言文本注释到高级多媒体附件的所有内容。
理解PDF注释:多语言文档的交互基础
PDF注释是可以添加到PDF页面的对象,用于提供附加信息、交互性或视觉增强。在多语言环境中,这些注释支持中文、日语、韩语等东亚语言的显示和交互。与常规页面内容不同,注释作为独立对象存储,可以显示或隐藏、编辑或删除,而不会影响底层文档结构。这使它们非常适合:
- 多语言文档审阅:用中文、日语、韩语添加评论、笔记和反馈
- 国际化表单增强:创建支持CJK文字的交互元素和帮助文本
- 跨文化多媒体集成:嵌入多语言音频、视频和文件附件
- 本地化视觉标记:用本地语言标记和形状突出重要部分
- 多语言协作工作流:使不同语言的用户能够无障碍地协作

快速入门:支持CJK文字的注释示例
让我们从一个支持中日韩文字的基本文本注释示例开始,了解多语言PDF注释的核心概念:
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 |
program SimpleCJKAnnotation; {$I ..\..\..\Lib\HotPDF.inc} {$APPTYPE CONSOLE} uses {$IFDEF XE2+} System.Classes, System.SysUtils, Vcl.Graphics, {$ELSE} Classes, SysUtils, Graphics, {$ENDIF} HPDFDoc; var HotPDF: THotPDF; begin HotPDF := THotPDF.Create(nil); try // 配置PDF基本属性 HotPDF.FileName := 'SimpleCJKAnnotation.pdf'; HotPDF.Title := '简单CJK注释演示'; HotPDF.Author := 'HotPDF Component'; // 设置字体嵌入以支持CJK文字 HotPDF.FontEmbedding := True; // 设置初始缩放 HotPDF.InitialZoom := izFitV; HotPDF.BeginDoc; // 尝试设置CJK兼容字体 try HotPDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 0, False); except // 回退到微软雅黑(广泛可用的中文字体) HotPDF.CurrentPage.SetFont('Microsoft YaHei', [], 12, 0, False); end; // 添加页面内容 HotPDF.CurrentPage.TextOut(100, 65, 0, '点击注释图标查看多语言内容:'); // 添加多语言文本注释 HotPDF.CurrentPage.AddTextAnnotation( WideString('重要提示:这是一个中文注释。' + #13#10 + '重要な情報:これは日本語の注釈です。' + #13#10 + '중요 정보: 이것은 한국어 주석입니다.' + #13#10 + 'Important: This is a multilingual annotation.'), Rect(100, 80, 120, 100), True, taComment, clBlue ); HotPDF.EndDoc; finally HotPDF.Free; end; end. |
这个多语言示例演示了PDF注释的几个核心概念:
- CJK文字支持:使用
WideString
确保中日韩文字正确显示 - 字体配置:优先使用
Arial Unicode MS
,回退到Microsoft YaHei
- 字体嵌入:
FontEmbedding := True
确保字体在所有查看器中一致显示 - 多语言内容:在单个注释中包含中文、日语、韩语和英语
- 错误处理:使用异常处理确保字体设置的稳定性
完整CJK注释类型参考
HotPDF组件完全支持中日韩文字的所有注释类型:
1. 中文文本注释
中文文本注释支持简体中文和繁体中文:
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 |
// 中文注释示例过程 procedure AddChineseAnnotationExamples(PDF: THotPDF); begin WriteLn('添加中文注释...'); // 页面标题 PDF.CurrentPage.TextOut(50, 60, 0, 'Chinese Annotations - 中文注释示例:'); // 简体中文重要提示 PDF.CurrentPage.AddTextAnnotation( WideString('重要提示:这是一个重要的中文注释。' + #13#10 + '请仔细阅读相关内容并按要求执行。' + #13#10 + '如有疑问,请联系相关负责人。'), Rect(50, 75, 70, 95), True, taComment, clRed ); // 关键信息注释 PDF.CurrentPage.AddTextAnnotation( WideString('关键信息:此处包含重要的技术参数' + #13#10 + '数据准确性已通过多次验证确认。'), Rect(80, 80, 100, 100), False, taKey, $0080FF // 橙色 ); // 帮助说明注释 PDF.CurrentPage.AddTextAnnotation( WideString('帮助说明:点击查看详细操作指南' + #13#10 + '本帮助文档提供完整的使用说明。'), Rect(110, 80, 130, 100), False, taHelp, clBlue ); // 备注信息注释 PDF.CurrentPage.AddTextAnnotation( WideString('备注信息:补充说明和参考资料' + #13#10 + '此备注提供额外的背景信息。'), Rect(140, 80, 160, 100), False, taNote, clGreen ); // 繁体中文注释 PDF.CurrentPage.AddTextAnnotation( WideString('繁體中文:這是繁體中文注釋範例' + #13#10 + '適用於港澳台地區的文檔處理需求。'), Rect(170, 80, 190, 100), False, taInsert, $800080 // 紫色 ); end; |
2. 日语文本注释
日语注释支持平假名、片假名和汉字:
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 |
// 日语注释示例过程 procedure AddJapaneseAnnotationExamples(PDF: THotPDF); begin WriteLn('添加日语注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 120, 0, 'Japanese Annotations - 日本語注釈:'); // 平假名和片假名注释 PDF.CurrentPage.AddTextAnnotation( WideString('重要な情報:これは日本語の注釈例です。' + #13#10 + 'ひらがな、カタカナ、漢字が含まれています。' + #13#10 + '詳細については担当者にお問い合わせください。'), Rect(50, 135, 70, 155), True, taComment, clRed ); // 技术规格注释 PDF.CurrentPage.AddTextAnnotation( WideString('キーポイント:技術仕様書の重要項目' + #13#10 + 'データの正確性が確認されています。'), Rect(80, 140, 100, 160), False, taKey, $0080FF // 橙色 ); // 帮助指导注释 PDF.CurrentPage.AddTextAnnotation( WideString('ヘルプ:操作方法についてのガイダンス' + #13#10 + 'このヘルプでは使用方法を説明します。'), Rect(110, 140, 130, 160), False, taHelp, clBlue ); // 商务日语注释 PDF.CurrentPage.AddTextAnnotation( WideString('ビジネス文書:会議資料の補足説明' + #13#10 + '承認プロセスについての詳細情報です。'), Rect(140, 140, 160, 160), False, taNote, clGreen ); end; |
3. 韩语文本注释
韩语注释支持韩文字符系统:
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 |
// 韩语注释示例过程 procedure AddKoreanAnnotationExamples(PDF: THotPDF); begin WriteLn('添加韩语注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 190, 0, 'Korean Annotations - 한국어 주석:'); // 韩文注释 PDF.CurrentPage.AddTextAnnotation( WideString('중요 정보: 이것은 한국어 주석 예제입니다.' + #13#10 + '한글로 작성된 문서의 주석 기능을 보여줍니다.' + #13#10 + '자세한 내용은 담당자에게 문의하세요.'), Rect(50, 205, 70, 225), True, taComment, clRed ); // 核心事项注释 PDF.CurrentPage.AddTextAnnotation( WideString('핵심 사항: 기술 사양서의 주요 항목' + #13#10 + '데이터 정확성이 검증되었습니다.'), Rect(80, 210, 100, 230), False, taKey, $0080FF // 橙色 ); // 帮助指南注释 PDF.CurrentPage.AddTextAnnotation( WideString('도움말: 사용 방법에 대한 안내' + #13#10 + '이 도움말은 사용법을 설명합니다.'), Rect(110, 210, 130, 230), False, taHelp, clBlue ); // 商务韩语注释 PDF.CurrentPage.AddTextAnnotation( WideString('업무 문서: 회의 자료 보충 설명' + #13#10 + '승인 프로세스에 대한 상세 정보입니다.'), Rect(140, 210, 160, 230), False, taNote, clGreen ); end; |
4. CJK混合自由文本注释
自由文本注释支持中日韩文字的混合使用:
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 |
// CJK混合自由文本注释示例 procedure AddCJKFreeTextAnnotationExamples(PDF: THotPDF); begin WriteLn('添加CJK自由文本注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 260, 0, WideString('CJK Free Text Annotations - 自由文本注释:')); // 中文标题注释 PDF.CurrentPage.AddFreeTextAnnotation( WideString('中文标题注释'), Rect(50, 280, 200, 300), ftLeftJust, $008000 // 绿色 ); // 混合CJK文本注释 PDF.CurrentPage.AddFreeTextAnnotation( WideString('混合文本: 中文-日本語-한국어'), Rect(220, 280, 420, 300), ftCenter, $FFE4B5 // 浅桃色 ); // 多语言文档状态注释 PDF.CurrentPage.AddFreeTextAnnotation( WideString('机密文件 / 機密文書 / 기밀문서'), Rect(50, 320, 250, 340), ftCenter, clRed ); end; |
5. CJK几何标记注释
几何注释支持多语言描述:
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 |
// CJK几何注释示例 procedure AddCJKGeometricAnnotationExamples(PDF: THotPDF); var StartPoint, EndPoint: THPDFCurrPoint; begin WriteLn('添加CJK几何注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 360, 0, WideString('CJK Geometric Annotations - 几何图形注释:')); // 带中文描述的线条注释 StartPoint.X := 50; StartPoint.Y := 380; EndPoint.X := 150; EndPoint.Y := 400; PDF.CurrentPage.AddLineAnnotation( WideString('重要内容指示线 - 请注意此处信息'), StartPoint, EndPoint, $0080FF // 橙色 ); // 带日语描述的线条注释 StartPoint.X := 170; StartPoint.Y := 390; EndPoint.X := 270; EndPoint.Y := 390; PDF.CurrentPage.AddLineAnnotation( WideString('重要項目の強調線です'), StartPoint, EndPoint, clBlue ); // 带韩语描述的圆形注释 PDF.CurrentPage.AddCircleSquareAnnotation( WideString('중요 영역 표시 원형'), Rect(50, 410, 120, 430), csCircle, clGreen ); // 混合CJK方形注释 PDF.CurrentPage.AddCircleSquareAnnotation( WideString('重点区域 / 重要エリア / 중요 구역'), Rect(140, 410, 210, 430), csSquare, $800080 // 紫色 ); end; |
6. CJK印章注释
印章注释支持多语言工作流状态:
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 |
// CJK印章注释示例 procedure AddCJKStampAnnotationExamples(PDF: THotPDF); begin WriteLn('添加CJK印章注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 455, 0, WideString('CJK Stamp Annotations - 印章注释:')); // 带CJK描述的批准印章 PDF.CurrentPage.AddStampAnnotation( WideString('文档已批准 - 可以发布'), Rect(50, 480, 150, 510), satApproved, clGreen ); PDF.CurrentPage.AddStampAnnotation( WideString('文書却下 - 修正が必要'), Rect(170, 480, 270, 510), satNotApproved, clRed ); // 安全印章 PDF.CurrentPage.AddStampAnnotation( WideString('기밀 정보 표시'), Rect(290, 480, 390, 510), satConfidential, clRed ); PDF.CurrentPage.AddStampAnnotation( WideString('最终版本 / 最終版 / 최종 버전'), Rect(410, 480, 510, 510), satFinal, clBlue ); // 工作流印章 PDF.CurrentPage.AddStampAnnotation( WideString('请审阅并提供意见'), Rect(50, 520, 150, 550), satForComment, $800080 // 紫色 ); PDF.CurrentPage.AddStampAnnotation( WideString('実験版です'), Rect(170, 520, 270, 550), satExperimental, $0080FF // 橙色 ); end; |
完整CJK注释示例:多语言文档演示
以下是完整的CJKAnnotations.dpr示例程序,展示了所有CJK注释功能:
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 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
{*****************************************************************} // HotPDF PDF组件 - 中日韩文注释演示 // 版权所有(c)2007-2025, https://www.loslab.com // 此演示展示了CJK语言注释功能 {*****************************************************************} program CJKAnnotations; {$I ..\..\..\Lib\HotPDF.inc} {$APPTYPE CONSOLE} uses {$IFDEF XE2+} System.Classes, System.SysUtils, Vcl.Graphics, {$ELSE} Classes, SysUtils, Graphics, {$ENDIF} HPDFDoc; var HotPDF: THotPDF; procedure AddChineseAnnotationExamples(PDF: THotPDF); begin WriteLn('正在添加中文注释...'); // 添加页面标题 HotPDF.CurrentPage.TextOut(100, 30, 0, 'HotPDF CJK Annotations Showcase (中日韩文注释展示)'); // 中文章节标题 PDF.CurrentPage.TextOut(50, 60, 0, 'Chinese Annotations - 中文注释示例:'); // 简体中文注释 PDF.CurrentPage.AddTextAnnotation(WideString('重要提示:这是一个重要的中文注释。' + #13#10 + '请仔细阅读相关内容并按要求执行。' + #13#10 + '如有疑问,请联系相关负责人。'), Rect(50, 75, 70, 95), True, taComment, clRed); PDF.CurrentPage.AddTextAnnotation(WideString('关键信息:此处包含重要的技术参数' + #13#10 + '数据准确性已通过多次验证确认。'), Rect(80, 80, 100, 100), False, taKey, $0080FF // 橙色 ); PDF.CurrentPage.AddTextAnnotation(WideString('帮助说明:点击查看详细操作指南' + #13#10 + '本帮助文档提供完整的使用说明。'), Rect(110, 80, 130, 100), False, taHelp, clBlue); PDF.CurrentPage.AddTextAnnotation(WideString('备注信息:补充说明和参考资料' + #13#10 + '此备注提供额外的背景信息。'), Rect(140, 80, 160, 100), False, taNote, clGreen); // 繁体中文注释 PDF.CurrentPage.AddTextAnnotation(WideString('繁體中文:這是繁體中文注釋範例' + #13#10 + '適用於港澳台地區的文檔處理需求。'), Rect(170, 80, 190, 100), False, taInsert, $800080 // 紫色 ); end; procedure AddJapaneseAnnotationExamples(PDF: THotPDF); begin WriteLn('正在添加日语注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 120, 0, 'Japanese Annotations - 日本語注釈:'); // 平假名和片假名注释 PDF.CurrentPage.AddTextAnnotation(WideString('重要な情報:これは日本語の注釈例です。' + #13#10 + 'ひらがな、カタカナ、漢字が含まれています。' + #13#10 + '詳細については担当者にお問い合わせください。'), Rect(50, 135, 70, 155), True, taComment, clRed); PDF.CurrentPage.AddTextAnnotation(WideString('キーポイント:技術仕様書の重要項目' + #13#10 + 'データの正確性が確認されています。'), Rect(80, 140, 100, 160), False, taKey, $0080FF // 橙色 ); PDF.CurrentPage.AddTextAnnotation(WideString('ヘルプ:操作方法についてのガイダンス' + #13#10 + 'このヘルプでは使用方法を説明します。'), Rect(110, 140, 130, 160), False, taHelp, clBlue); // 商务日语注释 PDF.CurrentPage.AddTextAnnotation(WideString('ビジネス文書:会議資料の補足説明' + #13#10 + '承認プロセスについての詳細情報です。'), Rect(140, 140, 160, 160), False, taNote, clGreen); end; procedure AddKoreanAnnotationExamples(PDF: THotPDF); begin WriteLn('正在添加韩语注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 190, 0, 'Korean Annotations - 한국어 주석:'); // 韩文注释 PDF.CurrentPage.AddTextAnnotation(WideString('중요 정보: 이것은 한국어 주석 예제입니다.' + #13#10 + '한글로 작성된 문서의 주석 기능을 보여줍니다.' + #13#10 + '자세한 내용은 담당자에게 문의하세요.'), Rect(50, 205, 70, 225), True, taComment, clRed); PDF.CurrentPage.AddTextAnnotation(WideString('핵심 사항: 기술 사양서의 주요 항목' + #13#10 + '데이터 정확성이 검증되었습니다.'), Rect(80, 210, 100, 230), False, taKey, $0080FF // 橙色 ); PDF.CurrentPage.AddTextAnnotation(WideString('도움말: 사용 방법에 대한 안내' + #13#10 + '이 도움말은 사용법을 설명합니다.'), Rect(110, 210, 130, 230), False, taHelp, clBlue); // 商务韩语注释 PDF.CurrentPage.AddTextAnnotation(WideString('업무 문서: 회의 자료 보충 설명' + #13#10 + '승인 프로세스에 대한 상세 정보입니다.'), Rect(140, 210, 160, 230), False, taNote, clGreen); end; procedure AddCJKFreeTextAnnotationExamples(PDF: THotPDF); begin WriteLn('正在添加CJK自由文本注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 260, 0, WideString('CJK Free Text Annotations - 自由文本注释:')); // 中文自由文本 PDF.CurrentPage.AddFreeTextAnnotation(WideString('中文标题注释'), Rect(50, 280, 200, 300), ftLeftJust, $008000 // 绿色 ); // 混合CJK自由文本 PDF.CurrentPage.AddFreeTextAnnotation(WideString('混合文本: 中文-日本語-한국어'), Rect(220, 280, 420, 300), ftCenter, $FFE4B5 // 浅桃色 ); // 混合CJK文档状态 PDF.CurrentPage.AddFreeTextAnnotation(WideString('机密文件 / 機密文書 / 기밀문서'), Rect(50, 320, 250, 340), ftCenter, clRed); end; procedure AddCJKGeometricAnnotationExamples(PDF: THotPDF); var StartPoint, EndPoint: THPDFCurrPoint; begin WriteLn('正在添加CJK几何注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 360, 0, WideString('CJK Geometric Annotations - 几何图形注释:')); // 带中文描述的线条注释 StartPoint.X := 50; StartPoint.Y := 380; EndPoint.X := 150; EndPoint.Y := 400; PDF.CurrentPage.AddLineAnnotation(WideString('重要内容指示线 - 请注意此处信息'), StartPoint, EndPoint, $0080FF // 橙色 ); // 带日语描述的线条注释 StartPoint.X := 170; StartPoint.Y := 390; EndPoint.X := 270; EndPoint.Y := 390; PDF.CurrentPage.AddLineAnnotation(WideString('重要項目の強調線です'), StartPoint, EndPoint, clBlue); // 带韩语描述的圆形注释 PDF.CurrentPage.AddCircleSquareAnnotation(WideString('중요 영역 표시 원형'), Rect(50, 410, 120, 430), csCircle, clGreen); // 混合CJK方形注释 PDF.CurrentPage.AddCircleSquareAnnotation(WideString('重点区域 / 重要エリア / 중요 구역'), Rect(140, 410, 210, 430), csSquare, $800080 // 紫色 ); end; procedure AddCJKStampAnnotationExamples(PDF: THotPDF); begin WriteLn('正在添加CJK印章注释...'); // 章节标题 PDF.CurrentPage.TextOut(50, 455, 0, WideString('CJK Stamp Annotations - 印章注释:')); // 带CJK描述的批准印章 PDF.CurrentPage.AddStampAnnotation(WideString('文档已批准 - 可以发布'), Rect(50, 480, 150, 510), satApproved, clGreen); PDF.CurrentPage.AddStampAnnotation(WideString('文書却下 - 修正が必要'), Rect(170, 480, 270, 510), satNotApproved, clRed); // 安全印章 PDF.CurrentPage.AddStampAnnotation(WideString('기밀 정보 표시'), Rect(290, 480, 390, 510), satConfidential, clRed); PDF.CurrentPage.AddStampAnnotation(WideString('最终版本 / 最終版 / 최종 버전'), Rect(410, 480, 510, 510), satFinal, clBlue); // 工作流印章 PDF.CurrentPage.AddStampAnnotation(WideString('请审阅并提供意见'), Rect(50, 520, 150, 550), satForComment, $800080 // 紫色 ); PDF.CurrentPage.AddStampAnnotation(WideString('実験版です'), Rect(170, 520, 270, 550), satExperimental, $0080FF // 橙色 ); end; procedure AddCJKDocumentationAndFooter(PDF: THotPDF); begin WriteLn('正在添加CJK文档和页脚...'); // 文档部分 PDF.CurrentPage.TextOut(50, 570, 0, WideString('CJK Annotation Guidelines - 多语言注释使用指南:')); PDF.CurrentPage.TextOut(50, 590, 0, WideString('• 红色注释表示需要立即处理的重要问题')); PDF.CurrentPage.TextOut(50, 605, 0, WideString('• オレンジ色の注釈は警告や注意事項を示します')); PDF.CurrentPage.TextOut(50, 620, 0, WideString('• 파란색 주석은 일반적인 정보를 제공합니다')); PDF.CurrentPage.TextOut(50, 635, 0, WideString('• 绿色注释标记已完成或已批准的项目')); PDF.CurrentPage.TextOut(50, 650, 0, WideString('• 紫色注释表示需要审查的项目')); // 技术信息 PDF.CurrentPage.TextOut(50, 680, 0, WideString('Technical Details - 技术详情:')); PDF.CurrentPage.TextOut(50, 695, 0, WideString('• すべての注釈はインタラクティブで、ユーザーが開閉できます')); PDF.CurrentPage.TextOut(50, 710, 0, WideString('• 멀티미디어 주석은 호환 가능한 PDF 뷰어가 필요합니다')); PDF.CurrentPage.TextOut(50, 725, 0, WideString('• 文件附件嵌入在PDF文档中')); // 页脚 PDF.CurrentPage.TextOut(50, 755, 0, WideString('HotPDF Component - CJK Annotations Demo (中日韩文注释演示)')); PDF.CurrentPage.TextOut(50, 770, 0, 'Generated: ' + DateTimeToStr(Now)); PDF.CurrentPage.TextOut(50, 795, 0, 'Visit https://www.loslab.com for more information'); // 添加最终的多语言总结注释 PDF.CurrentPage.AddTextAnnotation(WideString('总结:本文档演示了HotPDF组件对中日韩文字的注释支持。' + #13#10 + '概要:このドキュメントはHotPDFコンポーネントのCJK文字注釈サポートを示しています。' + #13#10 + '요약: 이 문서는 HotPDF 컴포넌트의 CJK 문자 주석 지원을 보여줍니다。' + #13#10 + 'For technical support: https://www.loslab.com'), Rect(420, 795, 440, 815), False, taNote, clBlue); end; begin WriteLn('HotPDF CJK Annotations Demo (中日韩文注释演示)'); WriteLn('==============================================='); WriteLn('正在创建包含多语言注释的综合CJK PDF...'); WriteLn(''); HotPDF := THotPDF.Create(nil); try try // 配置PDF属性 HotPDF.FileName := 'HotPDF-CJK-Annotations.pdf'; HotPDF.Title := 'HotPDF CJK Annotations Demo (中日韩文注释演示)'; HotPDF.Author := 'HotPDF Component'; HotPDF.Subject := 'CJK multilingual annotation examples'; HotPDF.Keywords := 'PDF, Annotations, CJK, Chinese, Japanese, Korean, HotPDF, Demo, Multilingual, Delphi'; // 设置字体嵌入以支持CJK字符 HotPDF.FontEmbedding := True; // '适合高度' - 在窗口中缩放以适合页面高度 HotPDF.InitialZoom := izFitV; HotPDF.BeginDoc; // 尝试多种CJK兼容字体(按优先级顺序) try HotPDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 0, False); except // 回退到微软雅黑(广泛可用的中文字体) // 微软雅黑字体可能无法正确支持日语和韩语字符的显示。 // 建议使用Arial Unicode MS,如果不可用,请使用其他对CJK字符有良好支持的字体, // 或者为每种语言分别设置合适的字体。 HotPDF.CurrentPage.SetFont('Microsoft YaHei', [], 12, 0, False); end; // 添加所有CJK注释示例 AddChineseAnnotationExamples(HotPDF); AddJapaneseAnnotationExamples(HotPDF); AddKoreanAnnotationExamples(HotPDF); AddCJKFreeTextAnnotationExamples(HotPDF); AddCJKGeometricAnnotationExamples(HotPDF); AddCJKStampAnnotationExamples(HotPDF); AddCJKDocumentationAndFooter(HotPDF); HotPDF.EndDoc; WriteLn('CJK注释PDF创建成功!'); WriteLn(''); WriteLn('输出文件: ' + HotPDF.FileName); WriteLn(''); WriteLn('此PDF包含:'); WriteLn('• 中文注释(简体和繁体)'); WriteLn('• 日语注释(平假名、片假名、汉字)'); WriteLn('• 韩语注释(韩文)'); WriteLn('• 多语言自由文本注释'); WriteLn('• 带描述的CJK几何注释'); WriteLn('• 用于工作流的多语言印章注释'); WriteLn('• 综合CJK文档和指南'); except on E: Exception do begin WriteLn('创建CJK PDF时出错: ' + E.Message); ExitCode := 1; end; end; finally HotPDF.Free; end; end. |
CJK文字支持的最佳实践
1. 字体配置与兼容性
正确配置字体对于CJK文字的显示至关重要。更新后的字体配置方法采用了简化的两级回退策略:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 推荐的CJK字体配置方法(更新版本) procedure ConfigureCJKFonts(PDF: THotPDF); begin // 优先使用Arial Unicode MS(全面支持CJK文字) try PDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 0, False); WriteLn('已使用Arial Unicode MS字体'); except // 回退到微软雅黑(广泛可用的中文字体) // 微软雅黑字体可能无法正确支持日语和韩语字符的显示 // 建议使用Arial Unicode MS,如果不可用,请使用其他对CJK字符有良好支持的字体 // 或者为每种语言分别设置合适的字体 PDF.CurrentPage.SetFont('Microsoft YaHei', [], 12, 0, False); WriteLn('已使用Microsoft YaHei字体(注意:对日韩文字支持有限)'); end; // 字体嵌入是必需的,确保所有查看器都能正确显示CJK文字 PDF.FontEmbedding := True; end; |
重要提示:新的字体配置策略更加务实,重点强调了:
- Arial Unicode MS优先:这是最全面的CJK字体解决方案
- 微软雅黑回退:适用于中文,但对日韩文字支持有限
- 语言特定字体:建议为不同语言使用专门的字体
- 字体嵌入:确保跨平台兼容性
2. 文字编码与WideString使用
正确处理CJK文字编码:
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 |
// 正确的CJK文字处理方法 procedure AddCJKTextCorrectly(PDF: THotPDF); const // 使用常量定义多语言文本 CHINESE_TEXT = '这是中文文本示例'; JAPANESE_TEXT = 'これは日本語のテキスト例です'; KOREAN_TEXT = '이것은 한국어 텍스트 예제입니다'; var MultilingualText: WideString; begin // 组合多语言文本 MultilingualText := WideString(CHINESE_TEXT + #13#10 + JAPANESE_TEXT + #13#10 + KOREAN_TEXT); // 添加多语言注释 PDF.CurrentPage.AddTextAnnotation( MultilingualText, Rect(50, 100, 70, 120), True, taComment, clBlue ); end; |
3. 现代化错误处理
完善的错误处理机制:
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 |
// 现代化的错误处理和资源管理 procedure CreateCJKPDFWithErrorHandling; var HotPDF: THotPDF; Success: Boolean; begin Success := False; HotPDF := THotPDF.Create(nil); try try // 配置CJK支持 HotPDF.FontEmbedding := True; HotPDF.InitialZoom := izFitV; // 设置输出文件 HotPDF.FileName := 'CJK-Test.pdf'; HotPDF.BeginDoc; // 配置字体 ConfigureCJKFonts(HotPDF); // 添加CJK内容 AddCJKTextCorrectly(HotPDF); HotPDF.EndDoc; Success := True; WriteLn('CJK PDF创建成功!'); except on E: Exception do begin WriteLn('创建PDF时出错: ' + E.Message); // 可以在这里添加日志记录 raise; // 重新抛出异常以便上层处理 end; end; finally HotPDF.Free; if Success then WriteLn('所有资源已正确释放') else WriteLn('PDF创建失败,资源已清理'); end; end; |
4. 性能优化建议
针对CJK文字的性能优化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// CJK文档性能优化配置 procedure OptimizeCJKPDFPerformance(PDF: THotPDF); begin // 启用压缩以减小文件大小 PDF.Compression := cmFlateDecode; // 字体嵌入优化 PDF.FontEmbedding := True; // 设置合适的初始缩放 PDF.InitialZoom := izFitV; // 设置页面缓存(如果需要处理大量页面) // PDF.PageCacheSize := 50; // 根据需要调整 WriteLn('CJK PDF性能优化配置完成'); end; |
总结
更新后的HotPDF组件完全支持中日韩文字的PDF注释功能,提供了现代化的Delphi编程实践和完善的多语言支持。CJK注释演示项目展示了所有注释类型的多语言应用,具备改进的代码结构、错误处理和资源管理。
主要改进包括:
- 完整CJK支持:支持中文(简体/繁体)、日语(平假名/片假名/汉字)、韩语(韩文)
- 现代代码结构:使用条件编译支持XE2+兼容性
- 增强错误处理:健壮的异常处理和资源清理
- 字体优化:智能字体回退机制和嵌入优化
- 性能提升:FlateDecode压缩和字体嵌入优化
- 组织化结构:不同语言注释类型的模块化过程
- 专业功能:完整的多语言元数据支持和优化设置
点此查看使用英文/拉丁字符注释的示例;无论您是构建多语言文档审阅系统、国际化交互式表单,还是跨文化多媒体演示,HotPDF组件都提供了创建具有全面CJK注释支持的专业PDF文档所需的工具和示例。