C++에서 스크립트별 테마 글꼴 관리
개요
프레젠테이션 테마는 서로 다른 쓰기 시스템에 대해 서로 다른 글꼴 패밀리를 선택할 수 있습니다. 이를 통해 테마 글꼴을 사용하면서도 다국어 텍스트가 시릴릭, 아랍어, 일본어, 그루지야어, 타아나 등 다양한 스크립트에 적합한 글꼴을 사용하면서 하나의 조화된 글꼴 스키마를 따를 수 있습니다.
테마의 IFontScheme에는 일반적으로 제목에 사용되는 주요 글꼴 컬렉션과 본문에 사용되는 부차적 글꼴 컬렉션이 포함됩니다. 라틴 및 동아시아 글꼴 속성에 추가로, 두 컬렉션 모두 IFonts 인터페이스를 통해 쓰기 시스템 태그와 글꼴 패밀리 이름 사이의 매핑을 노출합니다.
이 문서는 프레젠테이션 마스터 테마에서 해당 매핑을 검사하고 수정하는 방법을 보여주며, 변경 사항이 저장‑재로드 사이클에서도 유지되는지 확인하는 방법을 설명합니다.
스크립트 태그 이해하기
스크립트 글꼴 메서드는 네 글자 BCP 47 스크립트 서브태그를 사용하여 쓰기 시스템을 식별합니다. 일반적인 값은 다음과 같습니다:
| 스크립트 태그 | 작성 시스템 |
|---|---|
Cyrl |
시릴릭 |
Arab |
아랍어 |
Hans |
간체 중국어 |
Jpan |
일본어 |
Geor |
그루지야어 |
Thaa |
타아나 |
이 매핑은 테마 글꼴 스키마에 속하며 개별 텍스트 부분에는 적용되지 않습니다. 프레젠테이션은 주요 컬렉션과 부차적 컬렉션에 대해 서로 다른 매핑을 정의할 수 있으며, 일부 스크립트에 대한 매핑을 생략할 수도 있습니다.
스크립트 글꼴 매핑 접근 및 검사
Presentation::get_MasterTheme을 사용하여 프레젠테이션 수준의 테마에 접근합니다. FontScheme::get_Major 및 FontScheme::get_Minor 메서드는 두 개의 IFonts 컬렉션을 반환합니다.
Fonts::GetScriptFontMap을 호출하면 컬렉션의 모든 매핑을 가져올 수 있습니다. 특정 쓰기 시스템을 조회하려면 해당 스크립트 태그와 함께 Fonts::GetScriptFont를 호출합니다. GetScriptFont는 해당 컬렉션에 요청된 매핑이 정의되지 않은 경우 null 문자열을 반환합니다.
매핑 수정 및 지속성 확인
Fonts::SetScriptFont을 사용하여 매핑을 생성하거나 현재 글꼴 패밀리를 교체합니다. Fonts::RemoveScriptFont을 사용하여 매핑을 제거합니다.
다음은 기존 주요·부차 매핑을 모두 읽고, 일본어 주요 글꼴을 조회한 뒤, 시릴릭 주요 글꼴을 변경하고, 타아나 부차 매핑을 제거한 뒤 프레젠테이션을 저장하고 다시 열어 두 변경 사항을 검증하는 전체 예제입니다. 제거 단계를 초기 테마와 무관하게 만들기 위해, 예제는 타아나 매핑이 아직 정의되지 않은 경우에만 매핑을 생성합니다.
#include <DOM/IFonts.h>
#include <DOM/Presentation.h>
#include <DOM/Theme/IFontScheme.h>
#include <DOM/Theme/IMasterTheme.h>
#include <Export/SaveFormat.h>
#include <system/collections/idictionary.h>
#include <system/console.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto fontScheme = presentation->get_MasterTheme()->get_FontScheme();
auto majorFonts = fontScheme->get_Major();
auto minorFonts = fontScheme->get_Minor();
Console::WriteLine(u"Existing major mappings:");
for (auto&& mapping : majorFonts->GetScriptFontMap())
{
Console::WriteLine(u" {0}: {1}", mapping.get_Key(), mapping.get_Value());
}
Console::WriteLine(u"Existing minor mappings:");
for (auto&& mapping : minorFonts->GetScriptFontMap())
{
Console::WriteLine(u" {0}: {1}", mapping.get_Key(), mapping.get_Value());
}
auto japaneseFont = majorFonts->GetScriptFont(u"Jpan");
if (japaneseFont.IsNull())
{
Console::WriteLine(u"No major Japanese font is defined.");
}
else
{
Console::WriteLine(u"Major Japanese font: {0}", japaneseFont);
}
majorFonts->SetScriptFont(u"Cyrl", u"Arial");
if (minorFonts->GetScriptFont(u"Thaa").IsNull())
{
minorFonts->SetScriptFont(u"Thaa", u"Arial");
}
minorFonts->RemoveScriptFont(u"Thaa");
presentation->Save(u"script-font-mappings.pptx", SaveFormat::Pptx);
auto savedPresentation = MakeObject<Presentation>(u"script-font-mappings.pptx");
auto savedFontScheme = savedPresentation->get_MasterTheme()->get_FontScheme();
auto savedMajorFonts = savedFontScheme->get_Major();
auto savedMinorFonts = savedFontScheme->get_Minor();
auto savedCyrillicFont = savedMajorFonts->GetScriptFont(u"Cyrl");
auto savedThaanaFont = savedMinorFonts->GetScriptFont(u"Thaa");
if (savedCyrillicFont == u"Arial")
{
Console::WriteLine(u"The Cyrillic mapping was preserved.");
}
else
{
Console::WriteLine(u"The Cyrillic mapping was not preserved.");
}
if (savedThaanaFont.IsNull())
{
Console::WriteLine(u"The Thaana mapping removal was preserved.");
}
else
{
Console::WriteLine(u"The Thaana mapping still exists.");
}
검증은 일반 조회와 동일한 null‑string 동작을 사용합니다: 제거가 저장된 후 GetScriptFont(u"Thaa")는 부차 컬렉션에 대해 null 문자열을 반환합니다.
테마 매핑과 기타 글꼴 설정 구분하기
스크립트‑특정 테마 매핑은 글꼴 선택에 참여하지만, 직접 텍스트 서식 지정, 대치 및 폰트 폴백과는 다른 문제를 해결합니다:
| 메커니즘 | 목적 | 테마 매핑 변경 시 효과 |
|---|---|---|
| 스크립트‑특정 테마 글꼴 매핑 | 쓰기 시스템에 대한 주요 또는 부차 테마 글꼴 선택 | 해당 테마 글꼴을 계속 사용하는 텍스트는 새 매핑된 패밀리로 해결될 수 있음 |
| 텍스트 부분에 명시적으로 할당된 글꼴 | 해당 부분에 요청된 글꼴 패밀리를 직접 지정해 테마에 의존하지 않음 | 직접 서식이 테마 선택을 우선하므로 해당 부분은 변하지 않을 수 있음 |
| 글꼴 대치 | 요청된 글꼴이 없거나 대치 규칙이 적용될 때 다른 글꼴로 교체 | 글꼴이 요청된 후에 작동하며, 테마의 스크립트 매핑을 재정의하지 않음 |
| 글꼴 폴백 | 선택된 글꼴에 포함되지 않은 글리프를 제공, 주로 특정 유니코드 범위에 사용 | 누락된 글리프를 채우지만 저장된 테마 매핑을 변경하지 않음 |
마지막 두 메커니즘에 대한 자세한 내용은 Font Substitution 및 Fallback Fonts을 참조하십시오.
Presentation::get_MasterTheme에서 매핑을 변경하면 해당 테마에 여전히 의존하는 효과적인 서식에만 영향을 줍니다. 텍스트가 마스터, 레이아웃 또는 슬라이드에서 테마 오버라이드를 상속하거나 명시적으로 할당된 글꼴을 사용하는 경우, 보이는 결과가 프레젠테이션‑수준 매핑을 따르지 않을 수 있습니다. 이러한 경우 해당 레벨을 검사하십시오.
매핑된 글꼴 사용 가능 상태 확인 및 결과 검증
스크립트 매핑은 글꼴 패밀리 이름만 저장하며, 해당 글꼴 파일을 설치하거나 로드하지는 않습니다. 일관된 렌더링 및 내보내기를 위해 매핑된 모든 글꼴은 환경에 설치되어 있거나 FontsLoader::LoadExternalFonts 또는 LoadOptions::set_DocumentLevelFontSources와 같은 사용자 지정 소스를 통해 Aspose.Slides에 제공되어야 합니다. 사용 가능한 로드 옵션은 Custom Fonts를 참고하십시오.
저장된 매핑을 검증하는 것은 테마 정의가 보존되었는지만 확인합니다. 글꼴이 실제로 사용 가능한지, 모든 필요한 글리프를 포함하는지, 의도한 레이아웃을 생성하는지는 증명하지 못합니다. 각 필수 쓰기 시스템에 대해 대표 텍스트를 이미지 또는 PDF로 렌더링하고 출력을 검사하십시오. 이렇게 하면 누락된 글꼴, 불완전한 글리프 커버리지, 폴백 동작 및 레이아웃 변경을 프레젠테이션 배포 전에 발견할 수 있습니다. 렌더링 및 내보내기 예제는 Convert PowerPoint Presentations를 참조하십시오.
FAQ
GetScriptFont가 매핑되지 않은 스크립트에 대해 반환하는 값은 무엇입니까?
Fonts::GetScriptFont은 요청된 스크립트 매핑이 해당 주요 또는 부차 글꼴 컬렉션에 정의되지 않은 경우 null 문자열을 반환합니다.
SetScriptFont는 이미 존재하는 스크립트에 대해 두 번째 매핑을 추가합니까?
아니오. Fonts::SetScriptFont은 매핑이 없을 때 생성하고, 동일한 스크립트 태그가 이미 존재하면 매핑된 글꼴 패밀리를 교체합니다.
왜 테마 매핑을 변경했는데 일부 텍스트가 바뀌지 않았습니까?
텍스트에 명시적으로 할당된 글꼴이 있거나, 오버라이드를 통해 다른 테마를 상속했거나, 렌더링 중 대치 또는 폴백에 의해 영향을 받았을 수 있습니다. 프레젠테이션‑수준 스크립트 매핑은 해당 테마 글꼴 컬렉션에 여전히 의존하는 텍스트에만 적용됩니다.
저장 후 재열기가 다국어 출력을 검증하기에 충분합니까?
아니오. 재열기는 테마 데이터의 지속성을 확인하지만, 각 쓰기 시스템에 대해 대표 텍스트를 렌더링하여 매핑된 글꼴이 실제로 사용 가능하고 필요한 글리프를 포함하는지 확인해야 합니다.