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 주석 샘플: 다국어 문서 데모
다음은 모든 CJK 주석 기능을 보여주는 완전한 CJKAnnotations.dpr 샘플 프로그램입니다:
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 문자 표시를 위해 올바른 폰트 설정이 매우 중요합니다. 업데이트된 폰트 설정 방법은 단순화된 2단계 폴백 전략을 채택했습니다:
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('중국 검토자 댓글: 이 부분은 더 명확히 해야 합니다. 추가 세부 정보를 권장합니다.'); 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 애플리케이션 개발을 지원하는 것을 목표로 합니다. 기술적 세부사항부터 실용적인 응용 예제까지, 모든 측면을 포괄하는 종합적인 리소스로 활용하시기 바랍니다.