PDF Filter Support

Overview

PDF 스트림과 임베드된 이미지는 필터 이름으로 인코딩 방식을 식별합니다. HotPDF는 문서를 생성하거나 외부 콘텐츠를 디코딩할 때 주로 다음 필터 계열을 다룹니다

Common Filters

  • FlateDecode: 생성되는 스트림의 주된 압축 필터이자 zlib 기반의 기본 압축 해제 경로
  • LZWDecode: HPDFLZW.pas를 통해 레거시 및 호환성 시나리오에서 지원
  • DCTDecode: HotPDF 이미지 로딩 경로가 처리하는 표준 JPEG 이미지 데이터에 사용
  • CCITTFaxDecode: 로드된 Group 3 및 Group 4 흑백 이미지 스트림은 표준 DecodeParms 항목을 통해 1차원 및 2차원 행, T.4/T.6 uncompressed 확장, EOFB 처리, 바이트 정렬, 출력 극성, 손상된 행의 제한적 복구를 지원
  • ASCIIHexDecode / ASCII85Decode / RunLengthDecode: HotPDF v2.4.0부터 HPDFTypes.pas에 노출되는 인코더 헬퍼(_ASCIIHexEncode, _ASCII85Encode, _RunLengthEncode). 임의의 바이너리 콘텐츠를 7비트 채널용으로 감싸거나 PDF 1.7 7.4 왕복 변환을 명시적으로 지원해야 할 때 유용
  • JBIG2Decode / JPXDecode: PDF 1.7 7.4.7 / 7.4.9에서 정의한 필터 이름. HotPDF는 JPXDecode 이미지 스트림과 JPEG 2000 파일을 OpenJPEG 기반 JPEG2000 디코더로 처리한 뒤, 호출자가 선택한 압축으로 결과를 임베드합니다. 이진(bilevel) JBIG2 출력과 로드된 JBIG2Decode 이미지 경로는 심볼 사전, 전역 세그먼트, 손실 레벨, black-dot 필터링 제어를 포함하는 네이티브 JBIG2 인코더 및 디코더 파이프라인을 사용

Practical Notes

  • 모든 필터가 범용 API 하나로 노출되는 것은 아니며, 일부는 전용 이미지 또는 스트림 헬퍼 유닛을 통해 접근합니다
  • For generated PDF content, THotPDF.Compression remains the central user-facing setting
  • 외부 데이터를 로드할 때 적용되는 필터는 원본 파일 형식과 사용하는 헬퍼 클래스에 따라 달라집니다
  • 암호화된 PDF는 이러한 필터를 보안 핸들러와 함께 사용합니다. 지원되는 AES‑128(V=4 R=4 / CFM=AESV2) 및 RC4(V=1/V=2) 옵션은 CryptKeyLength를 참조하십시오
  • 예약된 crypt-filter 정책은 문자열, 일반 스트림, 임베드 파일 스트림마다 독립적으로 ConfigureCryptFilterDefaults로 선택할 수 있습니다. 암호 보안은 StdCF 또는 Identity를, 공개 키 보안은 DefaultCryptFilter 또는 Identity를 받습니다. SetStreamCryptFilter는 기존 디코드 파이프라인을 건드리지 않고 맨 앞의 명시적 Crypt 필터를 추가하거나 해제합니다. 스트림별 오버라이드에는 암호화 사전의 /V가 4 이상이어야 합니다
  • 암호화 페이로드 래퍼는 일반 페이지 스트림은 그대로 볼 수 있게 두면서, EFOpen crypt 필터를 통해 임베드 파일의 메타데이터와 바이트를 보호합니다. 로드된 문서를 명시적으로 검사하고 잠금 해제하는 API는 HotPDF v2.715.0부터 사용할 수 있습니다
  • Password-protected attachment streams use /EFF and receive an explicit Crypt filter whenever /EFF differs from /StmF. Public-key encrypted explicit stream filters fail closed because they require a stream-specific recipient envelope
  • 로드된 문서는 원래의 /CF, /StrF, /StmF, /EFF 정책을 노출합니다. 여기에는 대소문자를 구분하는 외부 이름 필터, 명시되었거나 생략된 /CFM /None, 인증 이벤트, 유효 키 길이가 포함되며, 모두 THPDFCryptFilterInfo를 통해 제공됩니다. Standard 핸들러 V2 필터 길이는 바이트 단위로, 공개 키 V2 필터 길이는 비트 단위로 읽으며, 40비트와 128비트 V2 키만 허용됩니다. 평문 객체 스트림 컨테이너는 여전히 묶인 멤버 문자열을 /StrF로 복호화하고, 암호화된 컨테이너는 멤버를 두 번 복호화하지 않습니다. Incremental update는 로드된 정책을 유지합니다. HotPDF v2.675.0부터 사용할 수 있습니다
  • 대화형 양식 필드는 뷰어가 그리는 Widget 주석으로 출력됩니다. AcroForm Support를 참조하십시오
  • 텍스트 마크업 주석(Highlight, Underline, Squiggly, StrikeOut)과 문서 내 이동 링크(GoTo, GoToR, Launch)는 HotPDF v2.6.0부터 새 THPDFPage.Add*Annotation / AddGoToLink / AddGoToRLink / AddLaunchLink 메서드로 제공됩니다
  • DeviceCMYK 출력은 THPDFPage.SetCMYKColor / SetCMYKFillColor / SetCMYKStrokeColor로 사용할 수 있습니다. ICC 관리 색 공간은 THotPDF.RegisterICCProfile로 등록하고, HotPDF v2.7.0부터 SetFillColorSpace / SetStrokeColorSpace + SetFillColor / SetStrokeColor로 적용합니다
  • 저장하기 전에 THotPDF.UseXRefStream을 true로 설정하면 FlateDecode로 압축된 /Type /XRef 상호 참조 스트림 하나가 출력되며, 텍스트 형식의 xref / trailer / startxref 시퀀스는 생략됩니다(PDF 1.7 7.5.8). HotPDF v2.8.0부터 사용할 수 있습니다
  • THotPDF.EnableXMPMetadata를 true로 설정하면 Catalog에 XMP /Type /Metadata /Subtype /XML 스트림이 연결됩니다(PDF 1.7 14.3.2). Info 사전 필드에서 자동으로 만들어지며, CustomXMP로 직접 작성한 패킷을 제공할 수도 있습니다. HotPDF v2.9.0부터 사용할 수 있습니다
  • 메서드별 PDF 버전 게이팅(HotPDF v2.24.0부터). v2.4.0 이후에 도입된 모든 기능 메서드는 출력에 앞서 RequirePDFVersion을 확인합니다. StrictVersionLock=false(기본값)이면 문서 Version이 그 기능에 필요한 최소 버전으로 조용히 자동 상향되고, StrictVersionLock=true이면 호출이 거부되어 저장된 파일이 선택한 1.3 / 1.4 / 1.5 / 1.6 / 1.7 참조 규격을 엄격히 준수합니다
  • FlateDecode로 압축된 이미지 데이터를 위한 PNG 및 TIFF predictor 인코더(PDF 1.7 7.4.4.4). _PNGPredictorEncode는 libpng의 최소 절대 차이 필터 휴리스틱을 적용하고(Predictor=15), _TIFFPredictor2Encode는 수평 차분을 적용합니다(Predictor=2). HotPDF v2.10.0부터 사용할 수 있습니다
  • Tagged PDF entry points (PDF 1.7 14.7-14.8): THotPDF.Lang populates /Lang in the Catalog, EnableTaggedPDF emits /MarkInfo <</Marked true>> and a stub /StructTreeRoot, and the new THPDFPage.BeginMarkedContent / BeginMarkedContentMCID / EndMarkedContent methods write the BMC / BDC / EMC content-stream operators. Available since HotPDF v2.11.0
  • 축 방향(axial) 및 방사형(radial) 그라디언트(PDF 1.7 7.10 / 8.7). THotPDF.RegisterAxialGradient / RegisterRadialGradient는 Function Type 2 / Shading Type 2-3 / Pattern Type 2 스택 전체를 구성하고 안정적인 패턴 이름을 반환하며, THPDFPage.SetFillPattern / SetStrokePattern이 이를 페이지에 적용합니다. 시작 / 끝 색의 구성 요소 수로 DeviceGray(1) / DeviceRGB(3) / DeviceCMYK(4)가 결정됩니다. HotPDF v2.13.0부터 사용할 수 있으며, Function Type 3 다중 정지점 그라디언트는 v2.18.0부터 RegisterMultiStopAxialGradient, v2.686.0부터 RegisterMultiStopRadialGradient로 제공됩니다
  • THPDFPage.DrawInlineImage를 통한 인라인 이미지(PDF 1.7 8.9.7). Filter를 지정하지 않으면 콘텐츠 스트림이 7비트 클린 상태를 유지하도록 원시 바이트를 ASCIIHex로 자동 래핑합니다. HotPDF v2.18.0부터 사용할 수 있습니다
  • THotPDF.AddOutputIntent를 통한 OutputIntents(PDF 1.7 14.11). 호출할 때마다 Catalog에 /Type /OutputIntent 사전이 추가되며, 등록된 ICC 프로파일을 참조하는 /DestOutputProfile은 선택 사항입니다. HotPDF v2.18.0부터 사용할 수 있습니다
  • AcroForm 모양 스트림 자동 생성(PDF 1.7 12.5.5 / 12.7.3.3 / 8.10). 대화형 양식 필드를 추가하기 전에 THotPDF.AutoFormAppearances를 true로 설정하면 HotPDF가 각 위젯에 대해 /Subtype /Form Form XObject를 미리 생성해 /AP /N 항목에 넣고(버튼은 'Yes / Off' 하위 사전), AcroForm의 /DR 기본 리소스에 Helvetica / ZapfDingbats 간접 글꼴 사전을 채우며, 렌더러가 임베드된 스트림을 따르도록 /NeedAppearances를 false로 전환합니다. HotPDF v2.28.0부터 사용할 수 있습니다
  • ViewerPreferences /ViewArea와 /ViewClip(PDF 1.4 12.2 Table 152)이 이제 THotPDF.ViewArea / THotPDF.ViewClip 속성(대응하는 vpViewArea / vpViewClip 집합 멤버 포함)으로 제공됩니다. 둘 다 THPDFPageBoundary 값(MediaBox / CropBox / BleedBox / TrimBox / ArtBox)을 받으며, PDF 1.4의 페이지 경계 ViewerPreferences 네 가지에 대한 'HotPDF 지원 범위'를 완성합니다. HotPDF v2.29.0부터 사용할 수 있습니다
  • 페이지 전환 효과(PDF 1.1 / 1.5 12.4.4). THPDFPage.SetPageTransition은 페이지에 /Trans 사전을 기록하여, /PageMode /FullScreen의 PDF 리더가 페이지 이동을 애니메이션으로 보여 주게 합니다. PDF 1.1 스타일(Split, Blinds, Box, Wipe, Dissolve, Glitter, R)과 PDF 1.5 스타일(Fly, Push, Cover, Uncover, Fade)은 THPDFTransitionStyle 열거형으로 제공되며, 부수적인 /Dm, /M, /Di 하위 옵션도 노출됩니다. THPDFPage.SetPageDuration은 자동 진행 지연 시간을 초 단위로 /Dur에 기록합니다. HotPDF v2.30.0부터 사용할 수 있습니다
  • 페이지 수준 투명도 그룹(PDF 1.4 11.6.6 / 7.5.5). THPDFPage.SetTransparencyGroup은 /Group 사전(/Type /Group /S /Transparency)을 연결하여 렌더러가 알파를 가진 콘텐츠를 예측 가능하게 합성하도록 합니다. 장치 색 공간은 THPDFGroupColorSpace 열거형(DeviceGray / DeviceRGB / DeviceCMYK 또는 생략)으로 선택하거나, THPDFPage.SetTransparencyGroupICC를 호출하면서 THotPDF.RegisterICCProfile로 미리 등록한 ICC 프로파일 이름을 전달합니다. 선택 사항인 /I(Isolated)와 /K(Knockout) 플래그는 합성기의 동작을 조정하며, THPDFPage.ClearTransparencyGroup은 이전에 연결한 항목을 제거합니다. HotPDF v2.32.0부터 사용할 수 있습니다
  • Incremental update(PDF 1.7 ISO 32000-1 7.5.6). THotPDF.BeginIncrementalUpdate(SourceFile)는 기존 PDF를 append-only 모드로 로드합니다. 이후의 CreateIndirect* 호출은 새 객체를 자동으로 dirty로 표시하고, THotPDF.MarkDirty(Obj)는 이미 로드된 기존 객체를 다시 기록하도록 표시합니다. THotPDF.SaveIncrementalUpdate(TargetFile)는 원본 소스 바이트를 그대로 기록하고, 객체 번호를 유지한 채 dirty 객체만 덧붙이며, 새 xref 서브섹션을 출력한 뒤, 이전 xref를 가리키는 /Prev가 담긴 트레일러로 마무리합니다. 기존 AddSignedSignatureField + PreparePDFForSigning + InsertSignatureHex 파이프라인과 함께 사용하면, 이미 서명된 문서에 이전 서명을 무효화하지 않고 후속 서명 필드를 추가할 수 있습니다(원본 바이트가 하나도 바뀌지 않으므로 이전 서명의 /ByteRange 다이제스트는 계속 유효합니다). HotPDF v2.35.0부터 사용할 수 있습니다
  • 임베드 TrueType 글꼴 이름 정규화. HotPDF는 임베드된 TrueType name 테이블을 읽어 /BaseFont, /FontDescriptor /FontName, /FontFamily, 하위 CID 글꼴 이름을 글꼴 프로그램의 PostScript 이름과 일치시킵니다. 이렇게 하면 PDF 글꼴 사전과 임베드된 TTF 페이로드가 서로 달라서 생기는 Adobe Acrobat Font Capture 실패를 방지합니다. HotPDF v2.35.1부터 사용할 수 있습니다
  • TrueType 글꼴 서브셋팅(PDF 1.7 ISO 32000-1 9.6.4 / 9.8.2). THotPDF.EnableFontSubsetting을 true로 설정한 뒤 BeginDoc을 호출하면 HotPDF가 임베드되는 TrueType 페이로드를 문서에서 실제로 사용한 글리프만 포함하도록 다시 구성합니다. 일반적인 Latin 문서에서는 임베드 글꼴 용량이 약 90% 줄어듭니다(한 줄짜리 "Hello, world."에서 1 MB Arial -> 약 70 KB). Composite 글리프 의존성은 재귀적으로 추적하고, GID 번호는 유지되므로(기존 Type0 / Identity-H 콘텐츠 스트림이 계속 동작합니다), 새 /BaseFont에는 규격이 요구하는 6글자 "+" 접미 접두사가 자동으로 붙습니다(예: /BaseFont /AAAAAA+ArialMT). 기본은 꺼져 있으며, 편집 워크플로우를 위해 전체 글꼴 임베드를 유지하려면 opt-in으로 켜십시오. HotPDF v2.36.0부터 사용할 수 있습니다
  • Compact Font Format(CFF) 서브셋터(PDF 1.7 ISO 32000-1 9.7.4 / 9.9). OpenType-CFF(.otf, sfntVersion OTTO)와 Type 1 / Type 1C 글꼴을 위한 TrueType 서브셋터의 짝입니다. 유닛에서 export되는 HPDFSubsetCFF(CFFBytes, KeepGlyph) 함수는 유지하지 않는 글리프를 최소 1바이트 endchar 스텁으로 바꾼 CharStrings INDEX를 다시 구성하며, GID 번호는 바이트 단위로 그대로 보존합니다. HotPDF v2.37.0부터 사용할 수 있습니다
  • OpenType-CFF(.otf) 임베드 경로가 StoreFont에 연결되었습니다(PDF 1.6+ 9.7.4 Table 117). GDI로 로드한 글꼴 바이너리가 sfnt OTTO 컨테이너이면, HotPDF는 임베드된 'CFF ' 하위 테이블을 HPDFSubsetOTFContainer로 서브셋화하고, 글꼴 프로그램을 /FontFile3 /Subtype /OpenType으로 출력하며, 하위 글꼴 사전을 /Subtype /CIDFontType0으로 기록합니다(/CIDFontType2가 아닙니다). TrueType 글꼴은 동작 변화 없이 기존 /FontFile2 + /CIDFontType2 경로를 그대로 따릅니다. HotPDF v2.38.0부터 사용할 수 있습니다
  • CFF 서브루틴 서브셋팅 종단 간 지원(PDF 1.7 9.7.4 §6 / Adobe Tech Note #5177 §3.1). CFF 서브셋터는 이제 Global Subr INDEX(CFF 바이너리에서 String INDEX 바로 뒤에 위치)와 Local Subr INDEX(Private DICT 아래에 중첩되며 Top DICT 연산자 18 + Private DICT 연산자 19로 도달)의 사용하지 않는 항목을 모두 제거합니다. 단일 고정점 closure가 callsubr(op 0x0A)와 callgsubr(op 0x1D) 체인을 전이적으로 따라가므로, CharString이 Local Subr을 호출하고, 그것이 Global Subr을 호출하고, 다시 다른 Local Subr을 호출하는 경우도 한 번의 반복에서 모두 잡아냅니다. 사용하지 않는 각 항목은 1바이트 return 스텁으로 바뀌고, INDEX는 뒤쪽 여유 공간을 0으로 채워 제자리에서 다시 기록됩니다. 이 동작은 공개 HPDFSubsetCFF 및 HPDFSubsetOTFContainer 헬퍼를 통해 노출되며, 더 낮은 수준의 CFF 스캐너는 내부에 남아 있습니다. HotPDF v2.39.0부터 사용할 수 있습니다
  • CID-keyed CFF 서브셋팅(PDF 1.7 ISO 32000-1 9.7.4 / Adobe Tech Note #5176 §18-19). CFF 서브셋터는 이제 CID-keyed OpenType-CFF 글꼴을 나타내는 Top DICT ROS 연산자(12-30)를 인식하고, 각자 Private DICT와 Local Subr INDEX를 가진 Font DICT들의 FDArray(12-36) INDEX를 순회합니다. 글리프-FD 맵인 FDSelect(12-37)는 바이트 단위로 그대로 보존됩니다. 서브루틴 closure 스캔은 유지되는 각 CharString의 FD 컨텍스트를 추적하므로 FD #5의 글리프는 FD #5의 Local Subr만 표시하며, global subr은 FD들 사이에서 계속 공유됩니다. 각 FD의 Local Subr INDEX는 사용하지 않는 항목이 1바이트 return 스텁으로 축소된 채 제자리에서 다시 기록됩니다. 이제 CJK / Indic / Arabic OTF 글꼴(Adobe Fan/Gothic/Heiti/Ming/Myungjo/Song Std, Kozuka Pr6N, Source Han Sans 등)이 있는 그대로 임베드되는 대신 전체 서브셋팅 파이프라인을 거칩니다. HotPDF v2.40.0부터 사용할 수 있습니다
  • Object Streams(PDF 1.5 ISO 32000-1 7.5.7). THotPDF.UseObjectStreams를 true로 설정하고 UseXRefStream도 함께 켠 상태에서 SaveToStream을 호출하면 이 함수가 대상이 되는 간접 객체(스트림, 암호화 사전, 트레일러가 가리키는 Catalog 및 Info 사전을 제외한 모든 것)를 하나 이상의 /Type /ObjStm 컨테이너 스트림에 묶어 넣습니다. 그러면 상호 참조 스트림은 묶인 객체를 type-2 항목(field-2 = 호스트 ObjStm 객체 번호, field-3 = 스트림 내부 항목 인덱스)으로 참조합니다. 작은 사전이 많은 PDF(다중 페이지 문서, 주석, AcroForm 위젯, 구조 트리 요소, Optional Content 레이어)에서 파일 크기를 크게 줄여 주며, 그래픽만 있는 30페이지 smoke 문서는 14502바이트에서 8488바이트로 줄어듭니다(41.5% 감소). 다음 경우에는 조용히 false로 낮춰집니다. UseXRefStream이 꺼져 있거나(규격상 텍스트 xref 테이블에서는 type-2 항목을 표현할 수 없음) Version이 PDF 1.5 미만인 경우입니다. HotPDF v2.41.0부터 사용할 수 있습니다
  • Soft-mask 이미지 / SMask(PDF 1.4 ISO 32000-1 8.9.5.4). THotPDF.AddImageWithSMask(Width, Height, RGB, Alpha)는 컬러 이미지 XObject와 8비트 DeviceGray soft-mask 이미지 XObject를 출력하고 /SMask 상호 참조를 자동으로 연결하므로, 레거시 /ImageMask 경로의 이진 켜짐/꺼짐 한계 대신 픽셀마다 채널별 완전한 투명도를 담을 수 있습니다. 편의 오버로드인 THotPDF.AddImageWithSMask32(Bitmap32)는 32비트 BGRA TBitmap에서 RGB와 알파 평면을 추출하여, 알파가 있는 PNG를 호출 한 번으로 임베드할 수 있게 해 줍니다. AddImageWithTransparency와 AddImageWithTransparency32는 같은 워크플로우를 이미지 중심의 이름으로 제공합니다. 두 호출 지점 모두 RequirePDFVersion(pdf14)를 거치므로 strict 모드의 1.3 출력도 규격을 준수합니다. HotPDF v2.42.0부터 사용할 수 있습니다
  • 이미지 마스크 편의 헬퍼. AddImageAsMask는 이진 /ImageMask를 출력하고, AddImageWithMask는 생성된 마스크를 /Mask를 통해 컬러 이미지에 연결하며, 둘 다 THPDFPage.ShowImage에서 쓸 수 있는 일반 이미지 인덱스를 반환합니다
  • 이미지별 압축 제어. AddImageWithJpegQuality는 JpegQuality를 바꾸지 않고 호출 한 번으로 JPEG 품질을 적용하고, AddMonochromeImageAuto와 icAutoMono는 1비트 비트맵 입력에 대해 Flate, CCITT Group 4, JBIG2 중 하나를 선택합니다
  • Uncolored Tiling Pattern 그리기(PDF 1.7 ISO 32000-1 8.6.6.1). THotPDF.RegisterTilingPattern은 v2.19.0부터 /PaintType 1(colored)과 /PaintType 2(uncolored)를 모두 출력해 왔지만, 그에 대응하는 페이지 측 연산자 시퀀스는 colored 변형에서만 올바랐습니다. 이제 새 THPDFPage 메서드 여섯 개 - SetFillPatternRGB / SetStrokePatternRGB / SetFillPatternGray / SetStrokePatternGray / SetFillPatternCMYK / SetStrokePatternCMYK - 가 대응하는 [/Pattern /BaseCS] tinting 색 공간을 페이지 Resources/ColorSpace 사전에 자동 등록하고 규격이 요구하는 tint_components /Pn scn 시퀀스를 출력하여 uncolored 경로를 구동합니다. 타일이 자체 색을 가지는 colored 변형에는 기존 SetFillPattern / SetStrokePattern을 사용하십시오. HotPDF v2.43.0부터 사용할 수 있습니다
  • 타일링 패턴 렌더링을 전면 보완했습니다. 이제 패턴 매트릭스를 부모 콘텐츠 스트림의 기본 좌표계 기준으로 적용하고, 세 가지 /TilingType 배치 규칙을 모두 구현하며, 음수 /XStep과 /YStep을 지원합니다. 모든 셀은 독립된 path에서 시작하고, 색이 없는 패턴의 기본 tint는 fill과 stroke 연산 모두에 적용되며, 중첩 패턴 실행은 깊이 제한 하에 유지됩니다. 확장된 RegisterTilingPattern 오버로드와 THPDFTilingPatternBuilder.TilingType / Matrix 속성을 통해 생성하는 PDF에서도 검증된 동일한 제어를 사용할 수 있습니다. HotPDF v2.542.0부터 사용할 수 있습니다
  • CIELab 색 공간(PDF 1.3+ ISO 32000-1 8.6.5.3): THotPDF.RegisterLabColorSpace(Xw, Yw, Zw, aMin, aMax, bMin, bMax)는 인라인 [/Lab << /WhitePoint /BlackPoint /Range >>] 색 공간 배열을 만들고, 자동 생성한 이름(Lab1, Lab2, ...)으로 저장한 뒤 그 이름을 반환합니다. 이 이름은 기존 THPDFPage.SetFillColorSpace / SetStrokeColorSpace + SetFillColor([L, a, b]) / SetStrokeColor([L, a, b]) 파이프라인에 그대로 넘기면 됩니다. ICC 인쇄 워크플로우에는 D50 광원 [0.9505, 1.0, 1.089]을, sRGB에 준하는 디스플레이용으로는 D65 광원 [0.95047, 1.0, 1.08883]을 지정하고, L*은 [0..100], a*와 b*는 선택한 범위(보통 [-128..127]) 안에서 지정해 칠하면 됩니다. HotPDF v2.44.0부터 사용할 수 있습니다
  • 스폿 컬러용 Separation 색 공간(PDF 1.3+ ISO 32000-1 8.6.6.4): THotPDF.RegisterSeparation(ColorantName, AlternateCS, TintC1)는 [0..1] 범위의 tint 피연산자 하나로 제어되는 단일 성분 스폿 잉크를 선언하며, 내부적으로 선형 Function Type 2 tint 변환을 만듭니다. 반환된 이름(Sep1, Sep2, ...)은 기존 SetFillColorSpace / SetStrokeColorSpace + SetFillColor([tint]) / SetStrokeColor([tint]) 파이프라인에서 그대로 사용합니다. AlternateCS에는 DeviceGray, DeviceRGB, DeviceCMYK를 지정할 수 있고, TintC1은 tint = 1.0일 때의 대체 색 공간 성분값을 지정합니다. Pantone처럼 공백이 들어간 잉크 이름도 그대로 넘길 수 있으며, HotPDF가 색 공간 이름을 기록할 때 PDF 1.7 7.3.5에 따라 공백을 #20으로 이스케이프합니다. HotPDF v2.45.0부터 사용할 수 있습니다
  • AcroForm 여러 줄 및 comb 텍스트 appearance stream(PDF 1.7 ISO 32000-1 12.7.4.3): THotPDF.AutoFormAppearances가 켜져 있으면 Flags에 ffMultiline이 포함된 텍스트 필드에 자동 줄 바꿈이 적용된 /AP /N Form XObject가 생성됩니다(Td + T* + /TL leading 레이아웃이며, CR / LF / CRLF 구분자를 인식하고 보이는 행 수에서 잘라 냅니다). Flags에 ffComb가 있고 MaxLen이 양수인 필드는 글리프마다 절대 Tm 매트릭스를 사용해 각 문자를 폭이 같은 개별 셀에 그립니다. 이런 플래그가 없는 필드의 v2.28.0 단일 줄 레이아웃은 바이트 단위로 그대로 유지됩니다. 초기값에 국제 문자가 들어 있으면 지금도 뷰어의 /NeedAppearances 재계산 경로로 넘어가며, 임베드된 CID 폰트를 이용한 완전한 appearance 생성은 앞으로의 과제입니다. HotPDF v2.46.0부터 사용할 수 있습니다
  • AcroForm /AP 유니코드 폰트(PDF 1.7 ISO 32000-1 12.7.2 + 12.7.4.3): THotPDF.SetFormUnicodeFontDict(LogicalName, FontDict)는 호출자가 제공한 Type 0 / CIDFontType2 + Identity-H 복합 폰트를 AcroForm의 /DR/Font 기본 리소스 dict에 등록합니다. 등록하고 나면 AcroForm 수준의 /DA, 모든 Tx 위젯의 /DA, 그리고 ASCII가 아닌 Tx 초기값에 대해 만들어지는 /AP /N 스트림(AutoFormAppearances가 생성)이 모두 이 논리 이름으로 바뀝니다. Form XObject의 /Resources/Font 하위 dict도 같은 indirect 폰트를 참조하므로, 렌더링 시점에 /DR 해석에 의존하지 않고도 AP가 자체적으로 완결됩니다. 함께 제공되는 헬퍼 THotPDF.CreateIndirectFontDict는 indirect PDF 객체로 등록된 빈 THPDFDictionaryObject를 새로 반환하므로, 내부 헬퍼를 건드리지 않고도 사용자 정의 폰트 dict(또는 "N G R" indirect 직렬화가 필요한 다른 dict)를 만들 수 있습니다. 빈 LogicalName과 nil FontDict를 넘기면 v2.46.0의 ASCII 전용 /Helv 동작으로 되돌아갑니다. ASCII Tx 필드는 계속 /Helv를 사용하며 v2.46.0 / v2.55.0과 출력이 바이트 단위로 동일합니다. 여러 줄 + comb의 non-ASCII /AP와 RTL bidi shaping(UAX #9 + 아랍어 문맥 연결)은 앞으로의 과제입니다. HotPDF v2.56.0부터 사용할 수 있으며, ffMultiline non-ASCII /AP 지원(줄 단위 UTF-16BE hex Tj와 Td / T* / /TL leading, CJK를 고려한 줄 바꿈)은 v2.57.0부터, ffComb non-ASCII /AP 지원(CID별 동일 폭 절대 Tm 셀 + UTF-16 surrogate pair를 처리하는 코드 포인트별 단일 셀 Tj)은 v2.58.0부터, 오른쪽에서 왼쪽 방향을 위한 THotPDF.FormUnicodeRTL 속성(/V는 논리 순서로 유지하면서 /AP Tj hex의 UTF-16 순서를 뒤집으며, 호출자가 아랍 문자를 유니코드 표시 형태 U+FB50..U+FDFF + U+FE70..U+FEFF로 미리 shaping해야 하고, 완전한 UAX #9 + 자동 GSUB shaping은 아직 미구현)은 v2.59.0부터 사용할 수 있습니다
  • AcroForm 리치 텍스트 Tx 위젯(PDF 1.5+ ISO 32000-1 12.7.4.3 + Annex L): THPDFPage.AddRichTextField(FieldName, InitialValue, RichValue, DefaultStyle, Rectangle, [MaxLen], [Flags])는 /RV(리치 텍스트 XHTML 본문)와 /DS(CSS 방식의 기본 스타일)를 가진 텍스트 위젯을 만듭니다. ffRichText(/Ff의 26번 비트) 플래그는 자동으로 OR되며, 일반 텍스트 /V + /DV fallback(/RV를 해석하지 못하는 리더가 사용)도 함께 기록됩니다. Acrobat과 Foxit은 RichText 비트가 켜져 있으면 /RV에서 직접 렌더링하고 폰트 fallback도 리더에 설치된 유니코드 폰트에서 가져오므로, HotPDF가 /DR 리소스에 CID 폰트를 임베드하지 않아도 멀티바이트 콘텐츠(CJK / 키릴 / 아랍 / 악센트가 붙은 라틴 문자)가 올바르게 표시됩니다. /V와 /RV 모두 멀티바이트 입력을 자동으로 감지해 필요하면 UTF-16BE hex 문자열 인코딩(FE FF BOM + big-endian 코드 단위)으로 전환합니다. HotPDF 자체 /AP 경로를 위한 CID 폰트 appearance stream 생성은 앞으로의 과제이며, 리치 텍스트를 지원하는 뷰어에는 필요하지 않습니다. HotPDF v2.55.0부터 사용할 수 있습니다
  • 여러 colorant를 쓰는 스폿 잉크 워크플로우를 위한 DeviceN 색 공간(PDF 1.3+ ISO 32000-1 8.6.6.5): THotPDF.RegisterDeviceN(ColorantNames, AlternateCS, TintC1Matrix)는 RegisterSeparation을 잉크 하나에서 N개로 일반화한 것입니다. tint 변환은 PostScript calculator Function Type 4이며, 전달한 N x M 매트릭스를 기준으로 선형 가중 혼합을 수행합니다(n행 m열은 colorant n만 1.0일 때 AlternateCS의 m번째 채널에 대한 기여도). 반환되는 색 공간 이름(DevN1, DevN2, ...)은 기존 SetFillColorSpace + SetFillColor([t0, t1, ..., t_{N-1}]) 파이프라인에서 사용합니다. AlternateCS에는 DeviceGray, DeviceRGB, DeviceCMYK를 지정할 수 있고, 공백이 들어간 잉크 이름은 PDF 1.7 7.3.5에 따라 #20으로 이스케이프되며, 특수 이름 None은 사용하지 않는 colorant 슬롯을 나타냅니다. HotPDF v2.47.0부터 사용할 수 있습니다
  • Free-form Gouraud 셰이딩 삼각형 메시(PDF 1.3+ ISO 32000-1 8.7.4.5.4): THotPDF.RegisterFreeFormGouraudShading(XMin, YMin, XMax, YMax, NumComponents, Vertices)는 /ShadingType 4 스트림(/BitsPerCoordinate 16 + /BitsPerComponent 8 + /BitsPerFlag 8)을 선언하고, 이를 페이지 Resources/Pattern dict 안의 인라인 Pattern Type 2 항목으로 감싼 다음, 자동 생성한 패턴 이름(Sh1, Sh2, ...)을 반환합니다. 이 이름은 기존 SetFillPattern / SetStrokePattern 파이프라인에 그대로 사용합니다. 각 정점은 flag 1바이트(독립 삼각형이면 항상 0) + big-endian X 2바이트 + big-endian Y 2바이트 + 8비트 색 성분 NumComponents개로 패킹됩니다. NumComponents에는 1(DeviceGray), 3(DeviceRGB), 4(DeviceCMYK)를 지정할 수 있고, 각 정점은 2 + NumComponents개의 Extended 값을 Vertices에 (X, Y, c1...cN) 순서로 넣습니다. 정점 수는 3의 배수여야 합니다. /Decode는 16비트 좌표를 [XMin, XMax] x [YMin, YMax]로, 색 성분을 [0, 1]로 되돌려 매핑합니다. Type 5(lattice), Type 6(Coons patch), Type 7(tensor product) 메시 셰이딩은 앞으로의 과제입니다. HotPDF v2.48.0부터 사용할 수 있습니다
  • Lattice-form Gouraud 셰이딩 삼각형 메시(PDF 1.3+ ISO 32000-1 8.7.4.5.5): THotPDF.RegisterLatticeFormGouraudShading(XMin, YMin, XMax, YMax, NumComponents, VerticesPerRow, Vertices)는 정점을 M행 x N열 격자로 배치하는 /ShadingType 5 스트림을 선언하며, 인접한 두 행 사이를 렌더러가 자동으로 삼각형 스트립으로 분할합니다. RegisterFreeFormGouraudShading(Type 4)과 달리 정점별 flag 바이트가 없어 셰이딩 dictionary에 /BitsPerFlag가 들어가지 않고, 정점 하나가 4 + NumComponents바이트만 차지합니다(big-endian X 2바이트 + big-endian Y 2바이트 + 색 성분 N개). 대신 셰이딩 dictionary에 필수 항목인 /VerticesPerRow N이 들어갑니다. 지형, FEA 결과, 과학용 히트맵처럼 이미 규칙적인 샘플 격자로 되어 있는 데이터에 적합합니다. 애플리케이션이 정점을 행 우선 순서로 넘기면 렌더링 파이프라인이 삼각형 스트립 토폴로지를 알아서 구성합니다. VerticesPerRow는 2 이상이어야 하고, 전체 정점 수는 VerticesPerRow의 배수이면서 최소 두 행이어야 합니다. HotPDF v2.49.0부터 사용할 수 있습니다
  • Coons patch 메시 셰이딩(PDF 1.3+ ISO 32000-1 8.7.4.5.6): THotPDF.RegisterCoonsPatchMesh(XMin, YMin, XMax, YMax, NumComponents, Patches)는 Coons patch로 이루어진 /ShadingType 6 스트림을 선언합니다. 각 patch는 3차 Bezier 곡선 네 개로 둘러싸이고 모서리마다 색을 하나씩 가집니다. 렌더러가 네 변 사이에 Coons 곡면을 맞추므로 임의로 휘어진 컬러 사각형을 만들 수 있습니다. 굽은 경로 위의 포일이나 메탈릭 그라디언트, SVG에서 가져온 그라디언트 메시, 그리고 곡선 변을 가진 사각형을 작은 삼각형 여러 개로 근사해야 했던 경우에 유용합니다. patch 하나는 제어점 12개(X+Y Extended 값 24개, 경계를 따라 시계 방향으로 c1..c12 순서이며 c1 / c4 / c7 / c10이 네 모서리, 나머지 8개는 안쪽 Bezier 핸들)와 모서리 색 4개(4 * NumComponents개의 Extended 값)로 이루어지므로, Patches의 stride는 24 + 4 * NumComponents입니다. 셰이딩 dictionary에는 /BitsPerCoordinate 16 + /BitsPerComponent 8 + /BitsPerFlag 8이 들어가며(Type 4와 동일하고, Type 5와 달리 /VerticesPerRow는 없습니다), 출력되는 모든 patch는 flag = 0(독립 patch)입니다. 연속 flag 1 / 2 / 3(변 공유)은 이 편의 오버로드에서는 지원하지 않습니다. HotPDF v2.50.0부터 사용할 수 있습니다
  • 샘플링 LUT tint 변환을 쓰는 Separation 색 공간(PDF 1.3+ ISO 32000-1 8.6.6.4 + 7.10.2): THotPDF.RegisterSeparationLUT(ColorantName, AlternateCS, Samples)는 RegisterSampledFunction을 감싼 것으로, Function Type 0 dictionary를 직접 구성하지 않고도 비선형 tint -> 대체 색 공간 곡선 전체를 8비트(M-tuple) 샘플의 평탄한 바이트 스트림으로 표현할 수 있습니다. PANTONE Hexachrome 방식의 tint 램프, 감마 보정된 농도 곡선, 인쇄기 특성에 맞춰 손으로 그린 톤 커브, 전체 ICC 프로파일 기능 없이 쓰는 sRGB-스폿 변환 ICC LUT처럼 색 전환이 비선형일 때 LUT 방식을 사용하세요. v2.45.0의 RegisterSeparation은 여전히 선형 단일 끝점 케이스를 담당합니다. AlternateCS에는 DeviceGray, DeviceRGB, DeviceCMYK를 지정할 수 있습니다. Samples의 길이는 M의 양의 배수이면서 보간 가능한 범위를 확보하기 위해 최소 2 * M바이트여야 하고, 격자점 개수 S는 Length(Samples) / M으로 추론합니다. 보간은 PDF 1.7 /Order 1에 따라 기본적으로 선형입니다. 등록된 색 공간 이름(Sep1, Sep2, ...)을 반환하며, 기존 SetFillColorSpace + SetFillColor([tint]) 파이프라인에서 사용합니다. HotPDF v2.53.0부터 사용할 수 있습니다
  • Function Type 0(Sampled) 등록(PDF 1.3+ ISO 32000-1 7.10.2): THotPDF.RegisterSampledFunction(Domain, Range, Size, BitsPerSample, Samples, [Order])는 임의의 입력-출력 매핑을 N차원 규칙 격자 위의 M차원 출력 샘플로 나타내고 격자점 사이를 보간하는 indirect /FunctionType 0 스트림을 선언합니다. ICC 프로파일은 과하지만 손으로 다듬은 컬러 LUT가 필요할 때 사용하세요. /TransferFunction(ExtGState /TR)용 톤 커브, 선형 Type 2 / 산술 Type 4 경로로는 부족한 /Separation / /DeviceN용 샘플링 tint 변환, 하프톤 threshold 곡선, 그 밖에 Function dictionary를 받는 모든 PDF 구조가 대상입니다. Domain은 2N개 항목(입력 차원마다 [min, max] 한 쌍), Range는 2M개 항목(출력 차원마다 한 쌍), Size는 N개의 격자점 개수입니다. BitsPerSample은 PDF 1.7 Table 38에 따라 1, 2, 4, 8, 12, 16, 24, 32를 지정할 수 있습니다. Samples는 비트 단위로 패킹된 원시 샘플 스트림이며(각 샘플 안에서는 MSB 우선, 마지막 바이트의 0 채움을 제외하면 샘플 사이에 패딩 없음, 스펙의 샘플 순서 규칙에 따라 입력 0이 가장 빠르게 변함), Order는 기본값이 1(선형)이고 PDF 1.7 Table 38에 따라 3(3차 스플라인 보간, v2.54.0부터)도 지정할 수 있습니다. HotPDF는 샘플 바이트 수를 ceil(GridPoints * M * BitsPerSample / 8)과 비교해 검증합니다. Function dictionary가 필요한 곳 어디에나 붙일 수 있도록 indirect THPDFStreamObject를 반환합니다. HotPDF v2.52.0부터 사용할 수 있으며, 3차 /Order 3과 다중 입력 / 다중 출력의 엔드투엔드 지원은 v2.54.0부터 사용할 수 있습니다
  • Tensor product patch 메시 셰이딩(PDF 1.3+ ISO 32000-1 8.7.4.5.7): THotPDF.RegisterTensorProductPatchMesh(XMin, YMin, XMax, YMax, NumComponents, Patches)는 tensor-product patch로 이루어진 /ShadingType 7 스트림을 선언합니다. 각 patch는 쌍3차 Bezier 제어점 p[i][j]의 4 x 4 격자 전체와 모서리별 색 하나로 정의됩니다. RegisterCoonsPatchMesh(Type 6)에 경계점 12개 외에 명시적인 내부 제어점 4개(p[1][1], p[1][2], p[2][2], p[2][1])를 더한 것으로, Coons 혼합 곡면으로는 표현할 수 없는 patch 내부까지 더 세밀하게 제어할 수 있습니다. SVG 메시 그라디언트 왕복 변환이나 tensor-product Bezier 곡면이 필요한 아트워크에 유용합니다. patch 하나는 제어점 16개(X+Y Extended 값 32개, 스펙 Table 88의 스트림 순서인 p[0][0..3], p[1][3], p[2][3], p[3][3], p[3][2..0], p[2][0], p[1][0] 뒤에 내부 제어점 4개 p[1][1], p[1][2], p[2][2], p[2][1])와 모서리 색 4개(p[0][0] / p[0][3] / p[3][3] / p[3][0]에 대응하는 4 * NumComponents개의 Extended 값)로 이루어지므로, Patches의 stride는 32 + 4 * NumComponents입니다. 출력되는 모든 patch는 flag = 0(독립 patch)입니다. 이번 릴리스로 ISO 32000-1 8.7.4.5의 메시 셰이딩 계열(Type 4 / 5 / 6 / 7)이 모두 지원됩니다. HotPDF v2.51.0부터 사용할 수 있습니다
  • 주석 테두리 스타일과 Popup 연결(PDF 1.7 12.5.4 / 12.5.6.14): THPDFPage.SetAnnotationBorderStyle(Annot, Width, Style, DashPattern)는 /BS dictionary를 붙이며, 스타일은 선택한 THPDFAnnotBorderStyle(absSolid / absDashed / absBeveled / absInset / absUnderline)로 지정합니다. THPDFPage.AddPopupAnnotationFor(ParentAnnot, Rect, Open)는 양방향으로 연결된 /Popup 주석을 생성하므로(부모의 /Popup -> popup, popup의 /Parent -> 부모) 뷰어가 말풍선 연결선을 그릴 수 있습니다. 새로 추가된 THPDFPage.LastAnnotation 속성은 기존 Add*Annotation 프로시저의 시그니처를 바꾸지 않고도 두 헬퍼에 주석을 넘겨 줍니다. HotPDF v2.34.0부터 사용할 수 있습니다
  • 공개 키 보안 핸들러(ISO 32000-1 7.6.4, ISO 32000-2 7.6.5): THotPDF.EnablePubKeyEncryption(seed, KeyType, EncryptMetadata)와 THotPDF.AddPubKeyRecipient(envelope)는 /Filter /Adobe.PubSec encrypt dictionary를 기록합니다(V=1 RC4-40은 /SubFilter /adbe.pkcs7.s4, V=2 RC4-128 / V=4 AESV2는 /adbe.pkcs7.s5). 호출자는 20바이트 난수 seed와 수신자별 PKCS#7 envelopedData 바이너리 blob을 하나씩 제공해야 합니다(Windows CryptoAPI, OpenSSL, pycryptodome 등으로 외부에서 생성). HotPDF는 ISO 32000-1 7.6.4.3에 설명된 대로(seed와 각 envelope를 이어 붙인 SHA-1) 파일 암호화 키를 도출하고, AES-128 / RC4 스트림에는 표준 객체별 키 도출을 그대로 재사용합니다. HotPDF v2.33.0부터 사용할 수 있습니다
  • 로드한 페이지의 렌더링에서 Shading Type 4~7을 디코딩합니다. 좌표, 성분, flag의 표준 비트 폭을 모두 지원하고, 바이트 정렬된 레코드, Type 4 삼각형 및 Type 6 / 7 patch 연속 flag, 선택적 Function 배열, 선언된 ColorSpace 변환, BBox와 Background 처리, 클립 컬링, 배치 Gouraud fill, 그리고 상한이 있는 적응형 Coons 및 tensor-product 테셀레이션을 처리합니다. HotPDF v2.488.0부터 사용할 수 있습니다

See Also