HotPDF組件によるCJK文字対応PDF注釈機能の完全マスターガイド
PDF注釈機能は、インタラクティブで協調的なドキュメント作成において最も強力な機能の一つです。これらの機能により、ユーザーは元のドキュメント構造を変更することなく、PDFファイルに直接コメント、ハイライト、スタンプ、マルチメディアコンテンツを追加することができます。この包括的なガイドでは、HotPDF組件を使用して中日韓(CJK)文字に対応したさまざまなタイプの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組件'; // CJK文字サポートのためのフォント埋め込みを設定 HotPDF.FontEmbedding := True; // 初期ズームを設定 HotPDF.InitialZoom := izFitV; HotPDF.BeginDoc; // CJK互換フォントの設定を試行 try HotPDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 0, False); except // Microsoft YaHeiにフォールバック(中国語フォントとして広く利用可能) 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 |
{*****************************************************************} // 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 + '技術サポート: 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組件'; HotPDF.Subject := 'CJK多言語注釈サンプル'; 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 // Microsoft YaHeiにフォールバック(広く利用可能な中国語フォント) // Microsoft YaHeiフォントは日本語と韓国語文字の表示を正しくサポートしない場合があります。 // 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 // Microsoft YaHeiにフォールバック(広く利用可能な中国語フォント) // Microsoft YaHeiフォントは日本語と韓国語文字の表示を正しくサポートしない場合があります // 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フォントソリューションです
- Microsoft YaHeiフォールバック:中国語に適していますが、日韓文字サポートに制限があります
- 言語特定フォント:異なる言語に専用フォントの使用を推奨
- フォント埋め込み:クロスプラットフォーム互換性を確保
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; |
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 |
// 高度なCJK注釈機能 procedure AddAdvancedCJKAnnotations(PDF: THotPDF); var PopupAnnotation: Boolean; CustomColor: TColor; begin WriteLn('高度なCJK注釈を追加中...'); // カスタムカラーを定義 CustomColor := RGB(255, 200, 100); // カスタムオレンジ色 // ポップアップ注釈を有効化 PopupAnnotation := True; // 複雑な多言語注釈 PDF.CurrentPage.AddTextAnnotation( WideString('高度な機能デモンストレーション:' + #13#10 + 'この注釈は複数の高度な機能を示しています:' + #13#10 + '• カスタムカラー設定' + #13#10 + '• ポップアップ表示制御' + #13#10 + '• 複雑な多言語テキスト' + #13#10 + '• 自動サイズ調整' + #13#10 + 'これらの機能により、プロフェッショナルなPDFドキュメントを作成できます。'), Rect(50, 400, 300, 480), PopupAnnotation, taComment, CustomColor ); // 条件付きCJK注釈 if True then // 実際の条件をここに設定 begin PDF.CurrentPage.AddTextAnnotation( WideString('条件付き注釈:この注釈は特定の条件が満たされた場合にのみ表示されます。' + #13#10 + '動的なコンテンツ生成に有用です。'), Rect(50, 500, 250, 550), False, taNote, clGreen ); end; end; |
6. 多言語リソース管理
効率的な多言語リソース管理:
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 |
// 多言語リソース管理 unit CJKResourceManager; interface uses Classes, SysUtils; type TCJKLanguage = (clChinese, clJapanese, clKorean, clMultilingual); TCJKResourceManager = class private FCurrentLanguage: TCJKLanguage; FResourceStrings: TStringList; public constructor Create; destructor Destroy; override; procedure LoadLanguageResources(Language: TCJKLanguage); function GetLocalizedString(const Key: string): WideString; function GetAnnotationText(const Category: string): WideString; property CurrentLanguage: TCJKLanguage read FCurrentLanguage write FCurrentLanguage; end; implementation constructor TCJKResourceManager.Create; begin inherited Create; FResourceStrings := TStringList.Create; FCurrentLanguage := clMultilingual; end; destructor TCJKResourceManager.Destroy; begin FResourceStrings.Free; inherited Destroy; end; procedure TCJKResourceManager.LoadLanguageResources(Language: TCJKLanguage); begin FCurrentLanguage := Language; FResourceStrings.Clear; case Language of clChinese: begin FResourceStrings.Add('IMPORTANT=重要提示'); FResourceStrings.Add('NOTE=备注信息'); FResourceStrings.Add('HELP=帮助说明'); end; clJapanese: begin FResourceStrings.Add('IMPORTANT=重要な情報'); FResourceStrings.Add('NOTE=注記情報'); FResourceStrings.Add('HELP=ヘルプ情報'); end; clKorean: begin FResourceStrings.Add('IMPORTANT=중요 정보'); FResourceStrings.Add('NOTE=참고 정보'); FResourceStrings.Add('HELP=도움말 정보'); end; clMultilingual: begin FResourceStrings.Add('IMPORTANT=重要提示 / 重要な情報 / 중요 정보'); FResourceStrings.Add('NOTE=备注信息 / 注記情報 / 참고 정보'); FResourceStrings.Add('HELP=帮助说明 / ヘルプ情報 / 도움말 정보'); end; end; end; function TCJKResourceManager.GetLocalizedString(const Key: string): WideString; var Index: Integer; begin Index := FResourceStrings.IndexOfName(Key); if Index >= 0 then Result := WideString(FResourceStrings.ValueFromIndex[Index]) else Result := WideString(Key); // キーが見つからない場合はキー自体を返す end; function TCJKResourceManager.GetAnnotationText(const Category: string): WideString; begin Result := GetLocalizedString(Category); end; end. |
実践的な応用例
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 |
// 多言語ドキュメントレビューシステム procedure CreateMultilingualReviewSystem(PDF: THotPDF); var ReviewerComments: array[0..2] of WideString; ReviewerColors: array[0..2] of TColor; i: Integer; begin WriteLn('多言語レビューシステムを作成中...'); // レビュアーコメントを定義 ReviewerComments[0] := WideString('中国审核员评论:此处需要进一步clarification。建议增加更多详细信息。'); ReviewerComments[1] := WideString('日本のレビュアーコメント:この部分は明確化が必要です。追加の詳細情報をお勧めします。'); ReviewerComments[2] := WideString('한국 검토자 댓글: 이 부분은 더 명확히 해야 합니다. 추가 세부 정보를 권장합니다.'); // レビュアーカラーを定義 ReviewerColors[0] := clRed; // 中国レビュアー ReviewerColors[1] := clBlue; // 日本レビュアー ReviewerColors[2] := clGreen; // 韓国レビュアー // レビュアーコメントを追加 for i := 0 to 2 do begin PDF.CurrentPage.AddTextAnnotation( ReviewerComments[i], Rect(50 + i * 200, 100, 150 + i * 200, 150), True, taComment, ReviewerColors[i] ); end; // 統合されたレビューサマリー PDF.CurrentPage.AddTextAnnotation( WideString('综合评审总结 / 総合レビュー要約 / 종합 검토 요약:' + #13#10 + '所有审核员都同意需要进行修改。' + #13#10 + 'すべてのレビュアーが修正の必要性に同意しています。' + #13#10 + '모든 검토자가 수정이 필요하다는 데 동의했습니다。'), Rect(50, 200, 400, 280), False, taNote, RGB(255, 255, 0) // 黄色 ); 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 38 39 40 41 42 43 44 45 46 47 48 49 |
// 国際化フォームシステム procedure CreateInternationalizedForm(PDF: THotPDF); var FormFields: array[0..3] of WideString; FieldPositions: array[0..3] of TRect; i: Integer; begin WriteLn('国際化フォームを作成中...'); // フォームフィールドラベルを定義 FormFields[0] := WideString('姓名 / 氏名 / 성명:'); FormFields[1] := WideString('电子邮件 / 電子メール / 이메일:'); FormFields[2] := WideString('电话号码 / 電話番号 / 전화번호:'); FormFields[3] := WideString('备注 / 備考 / 비고:'); // フィールド位置を定義 FieldPositions[0] := Rect(50, 100, 200, 120); FieldPositions[1] := Rect(50, 140, 200, 160); FieldPositions[2] := Rect(50, 180, 200, 200); FieldPositions[3] := Rect(50, 220, 200, 260); // フォームフィールドを追加 for i := 0 to 3 do begin PDF.CurrentPage.TextOut(FieldPositions[i].Left, FieldPositions[i].Top, 0, FormFields[i]); // 入力フィールドを表示する注釈を追加 PDF.CurrentPage.AddTextAnnotation( WideString('请在此处输入信息 / ここに情報を入力してください / 여기에 정보를 입력하세요'), Rect(FieldPositions[i].Right + 10, FieldPositions[i].Top, FieldPositions[i].Right + 150, FieldPositions[i].Bottom), False, taNote, RGB(200, 200, 255) // 薄い青色 ); end; // フォーム説明を追加 PDF.CurrentPage.AddFreeTextAnnotation( WideString('多语言表单说明 / 多言語フォーム説明 / 다국어 양식 설명:' + #13#10 + '请用您的首选语言填写此表单。' + #13#10 + 'お好みの言語でこのフォームにご記入ください。' + #13#10 + '선호하는 언어로 이 양식을 작성하세요。'), Rect(50, 300, 450, 380), ftLeftJust, RGB(240, 240, 240) // 薄いグレー ); end; |
総括とまとめ
更新されたHotPDF組件は、中日韓文字のPDF注釈機能を完全にサポートし、現代的なDelphiプログラミング実践と包括的な多言語サポートを提供します。CJK注釈デモンストレーションプロジェクトは、すべての注釈タイプの多言語応用を展示し、改良されたコード構造、エラーハンドリング、リソース管理を備えています。
主な改善点:
- 完全CJKサポート:中国語(簡体字/繁体字)、日本語(ひらがな/カタカナ/漢字)、韓国語(ハングル)をサポート
- 現代的コード構造:条件付きコンパイルを使用してXE2+互換性をサポート
- 強化されたエラーハンドリング:堅牢な例外処理とリソースクリーンアップ
- フォント最適化:インテリジェントなフォントフォールバックメカニズムと埋め込み最適化
- パフォーマンス向上:FlateDecode圧縮とフォント埋め込み最適化
- 組織化された構造:異なる言語注釈タイプのモジュール化プロセス
- プロフェッショナル機能:完全な多言語メタデータサポートと最適化設定
- 実践的応用:実際のレビューシステムと国際化フォームの実装例
- 高度な機能:リソース管理システムとカスタマイズ可能な注釈機能
英語/ラテン文字注釈を使用したサンプルはこちらをクリック;多言語ドキュメントレビューシステム、国際化インタラクティブフォーム、異文化間マルチメディアプレゼンテーションのいずれを構築する場合でも、HotPDF組件は包括的なCJK注釈サポートを備えたプロフェッショナルPDFドキュメントを作成するために必要なツールとサンプルを提供します。
この完全な日本語版ガイドは、HotPDF組件の強力なCJK注釈機能を日本語開発者コミュニティに提供し、多言語PDFアプリケーションの開発を支援することを目的としています。技術的な詳細から実践的な応用例まで、すべての側面を網羅した包括的なリソースとして活用していただけます。