Font Fallback and Vertical Text
HotPDF는 Unicode script별로 fallback 폰트를 고르고, 미해결 code point를 보고하고, 실제 세로 CID writing mode로 CJK 텍스트를 기록할 수 있습니다
문서 수준 폴백 체인
THotPDF.SetFontFallbackChain은 THPDFFontScript 범주 하나에 대한 순서 있는 글꼴 패밀리 목록을 저장합니다
THPDFPage.TextOutWithFallback는 각 Unicode scalar를 선택 폰트, 그 script 체인, 공용 체인으로 해석한 뒤 같은 폰트의 인접 scalar를 하나의 텍스트 run으로 출력합니다
- 폴백 체인은 문서 설정이라 페이지에 걸쳐 계속 유효합니다
- 중복·빈 폰트 이름은 제거되되 호출자 순서는 유지됩니다
- 설치 폰트 탐색은 커버리지를 인정하기 전에 조용한 GDI 치환을 거부합니다
- 보충 평면 scalar는 분류 전에 UTF-16 surrogate pair에서 디코딩됩니다
- 각 폴백 run은 기존 내장 Type0 폰트, subsetting,
ToUnicode, 공유 교차 페이지 폰트 경로를 씁니다 - 폴백 레이아웃은 요청된 bold 및 italic 서체로 설치된 글꼴 패밀리를 검사하고, 모든 글꼴 스타일, 문자셋, 크기, 쓰기 방향 설정을 run 전체에서 유지하며, 이후 호출자의 글꼴을 복원합니다
Actionable diagnostics
AnalyzeUnresolvedGlyphs는 읽기 전용 커버리지 감사를 수행하고, TextOutWithFallback은 출력 중 만난 미해결 scalar를 기록합니다
각 THPDFUnresolvedGlyphInfo에는 scalar code point, 기본 폰트, 분류된 script, 세미콜론 구분 폴백 제안 목록이 담깁니다
GetUnresolvedGlyphs는 현재 문서 보고서를 반환하고, ClearUnresolvedGlyphs는 새 보고 구간을 시작합니다
THotPDF.ResolveFontForCodePoint와 THotPDF.AnalyzeUnresolvedGlyphs의 explicit-style overload는 TFontStyles를 받아 preflight가 출력에 쓰이는 것과 같은 서체를 검사할 수 있습니다. 기존 overload는 계속 regular 서체를 검사합니다
텍스트 박스, SVG 내장 텍스트, 로드된 text appearance는 폴백 레이아웃 전체에서 스타일이 적용된 글꼴 패밀리를 유지합니다. PDF 내부 글꼴 이름을 시스템 패밀리처럼 다루거나 모든 run을 regular 서체로 바꾸지 않습니다
Vertical CJK writing
THPDFPage.TextOutVertical는 현재 폰트의 세로 변형을 골라 모든 문자를 수동 배치하는 대신 Identity-V 텍스트 run 하나를 출력합니다
- CID 자손 폰트는
/DW2기본값과 glyph별/W2항목을 담습니다 - OpenType
vhea/vmtx는 세로 advance와 위 side bearing을 공급합니다. TrueType 원점은 각glyfbounding box에서 도출되고,VORG는 권위 있는 CFF 원점 기본값과 예외를 공급합니다 - vertical 테이블이 없는 폰트는 설정 가능한 1000 유닛 advance와 880 유닛 origin 기본값을 씁니다
sfVerticalAlternates가 켜지면 길이 보존 GSUB run 전체가 알려져 있을 때vrt2를 쓰고 아니면vert로 폴백하며, 활성 script와 언어 선택을 유지합니다- 폰트가 문점부호 치환은 빼뜨렸지만 Unicode 세로 presentation form을 매핑하고 있다면, 쉼표, 점, 괄호, 대시, 말줄임 등 관련 문점부호가 그 glyph을 쓰고
ToUnicode는 소스 텍스트를 유지합니다 - 세로
vkrn/vpalGPOS feature는ShapingFeatures를 통해 계속 쓸 수 있습니다 GetVerticalTextAdvance는 다음 세로 run을 배치하는 데 필요한 사용자 공간 advance를 반환합니다
예제
PDF.SetFontFallbackChain(hfsCJK,
['Microsoft YaHei UI', 'Yu Gothic UI', 'Malgun Gothic']);
PDF.SetFontFallbackChain(hfsEmoji, ['Segoe UI Emoji']);
PDF.CurrentPage.SetFont('Arial', [], 12);
PDF.CurrentPage.TextOutWithFallback(72, 72, 0, Text);
PDF.CurrentPage.SetFont('Yu Gothic UI', [], 14);
PDF.CurrentPage.TextOutVertical(420, 72, VerticalText);
Missing := PDF.GetUnresolvedGlyphs;