개요

많은 문서 형식은 글꼴과 밀접하게 연결되어 있습니다. 예를 들어 사용자가 DOCX 문서에 텍스트를 추가하면 해당 텍스트에는 항상 정의된 글꼴이 지정됩니다. 일부 문서 형식은 글꼴 데이터를 문서 파일 자체에 포함시켜 저장하지만(예: PDF), Office 계열 형식과 같이 운영 체제에 설치된 글꼴에 의존하는 경우도 있습니다.

글꼴 형식도 다양합니다. 예를 들어 대부분 설치된 글꼴은 TTF (TrueType)OTF (OpenType) 형식으로 제공됩니다. Office Open XML 문서는 또한 EOT (Embedded OpenType) 형식을 지원합니다. 웹에서는 WOFFWOFF2가 가장 많이 사용되는 형식입니다.

목차

사용된 모든 글꼴 가져오기

글꼴과 관련된 가장 유용한 기능은 글꼴을 나열하고 반환하는 것입니다. GroupDocs.Viewer는 특수 메서드 GetAllFonts()를 제공합니다 — Viewer 클래스 인스턴스로 문서를 로드한 뒤 이 메서드를 호출하면 해당 문서에서 사용된 모든 글꼴 목록을 얻을 수 있습니다. 반환된 목록의 각 글꼴은 IFontInfo 인터페이스를 구현하는 타입의 인스턴스로 제공됩니다. 이 인터페이스에는 글꼴 패밀리 이름, 스타일, 형식 및 이진 콘텐츠와 같은 공통 속성이 포함됩니다.

WordProcessing, Spreadsheet, Presentation, PDF와 같은 특정 형식 패밀리에는 IFontInfo의 특수 구현이 존재합니다; 이러한 구현은 해당 형식 패밀리와 관련된 추가 데이터를 제공합니다. 예를 들어 WordProcessingFontInfo, PresentationFontInfo, PdfFontInfo 타입에는 IsEmbedded 불리언 속성이 포함되어 있어 글꼴이 로드된 문서 본문에 포함되어 있는지(임베드) 아니면 OS에 설치되어 있는지를 나타냅니다. SpreadsheetFontInfo 타입에는 색상, 밑줄 여부, 취소선 여부 등 스프레드시트 전용 글꼴 데이터가 많이 포함됩니다. WordProcessingFontInfo는 대체 패밀리 이름을 포함할 수도 있습니다. 이와 같은 방식으로 다양한 정보를 제공합니다.

간단한 예시는 다음과 같습니다:

using GroupDocs.Viewer;
// ...

const string filename = "sample.docx";
string inputPath = "\full\path\" + filename;

using (Viewer viewer = new Viewer(inputPath))
{
    Fonts.IFontInfo[] allFonts = viewer.GetAllFonts();
    Console.WriteLine("{0} fonts found in the '{1}' document", allFonts.Length, filename);
    foreach (Fonts.IFontInfo font in allFonts)
    {
        Console.WriteLine("Font '{0}' of '{1}' style has {2} bytes and is of '{3}' format",
            font.FamilyName,
            font.Style,
            font.Content.Length,
            font.Format);
    }
}

※ 글꼴 추출은 WordProcessing, Spreadsheet, Presentation, PDF 형식 패밀리에서만 지원되며, 다른 문서 형식에 대해서는 GetAllFonts() 메서드가 빈 배열을 반환합니다.

누락된 글꼴 처리

어떤 문서가 작성자 머신에서 생성돼 글꼴 “AAA”를 사용했지만, 이를 클라이언트 머신에서 GroupDocs.Viewer로 처리할 때 “AAA” 글꼴이 없는 상황은 흔히 발생합니다. 이 경우 GroupDocs.Viewer는 복잡한 글꼴 대체 규칙을 적용해 해당 글꼴을 대체하려 시도합니다. 여기에는 문서 메타데이터, 누락된 글꼴의 대체 이름, 문서 설정, OS 설정, OS에 설치된 모든 글꼴 목록 등이 분석됩니다. 최종적으로 OS에 글꼴이 전혀 설치되어 있지 않은 “깨끗한” 상태일 경우, GroupDocs.Viewer는 자체 어셈블리(DLL) 내부에 내장된 글꼴을 사용해 누락된 글꼴을 대체합니다. 이 글꼴은 다른 글꼴이 전혀 없을 때 “최후의 수단”으로 작동합니다. 예를 들어 WordProcessing 형식의 경우, GroupDocs.Viewer는 내부적으로 무료 글꼴 “Fanwood”를 보관하고 있습니다.

현재 GroupDocs.Viewer는 렌더링 중(Viewer.View() 메서드 호출 시) 글꼴 대체 작업을 조용히 수행합니다. 즉, 글꼴 대체 메커니즘이 작동했는지, 어떤 글꼴이 누락됐는지, 어떤 글꼴로 교체됐는지에 대한 메시지나 이벤트가 전혀 제공되지 않으며, 정확히 어느 문서에 대해 발생했는지도 알 수 없습니다. 이러한 정보를 어떻게 전달할지에 대한 명확하고 일관된 방안을 정의하기가 어려워 구현이 복잡합니다.

그럼에도 불구하고 GroupDocs.Viewer는 다음 두 가지 방법을 통해 사용자가 직접 문제를 해결할 수 있도록 지원합니다:

  1. 누락된 글꼴을 직접 지정
  2. 누락된 글꼴을 다른 글꼴로 교체

누락된 글꼴 지정

사용자가 문서가 글꼴 “AAA”를 사용한다는 사실을 알고, 해당 글꼴이 대상 머신에 설치되지 않았으며, 그리고 “AAA”의 이진 콘텐츠를 보유하고 있는 경우, Viewer.View() 메서드를 호출하기 에 이를 지정할 수 있습니다.

대상 운영 체제에 설치되지 않은 하나 이상의 사용자 정의 글꼴을 지정하려면 글꼴 소스를 추가해야 합니다. 글꼴 소스는 실제 글꼴 파일이 들어 있는 폴더를 의미하며, FolderFontSource 클래스로 표현됩니다. 그리고 FontSettings 클래스의 SetFontSources() 메서드를 사용해 글꼴 소스를 GroupDocs.Viewer에 등록합니다.

다음 예제는 이를 보여줍니다. 예를 들어 “sample.docx” 문서가 대상 OS에 설치되지 않은 희귀 글꼴 “AAA.ttf”를 사용한다고 가정합니다. 사용자는 “AAA.ttf” 파일을 C:\custom_fonts 폴더에 복사하고, 해당 폴더를 가리키는 FolderFontSource 인스턴스를 생성합니다. 이후 이 인스턴스를 FontSettings 정적 클래스에 전달하고, “sample.docx” 파일을 HTML 형식으로 렌더링하면 결과 HTML 문서에 “AAA” 글꼴이 적용됩니다.

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
using GroupDocs.Viewer.Fonts;
// ...

// 글꼴 소스를 지정합니다.
FolderFontSource fontSource = 
    new FolderFontSource(@"C:\custom_fonts", SearchOption.TopFolderOnly);
FontSettings.SetFontSources(fontSource);

using (Viewer viewer = new Viewer("sample.docx"))
{
    // HTML 파일을 생성합니다.
    HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
    viewer.View(viewOptions);
}

누락된 글꼴 교체

사용자가 문서가 글꼴 “AAA”를 사용한다는 사실과, 해당 글꼴이 대상 머신에 설치되지 않았다는 사실은 알지만, “AAA”의 이진 콘텐츠가 없을 경우, 대신 사용할 다른 글꼴 “BBB”를 지정할 수 있습니다. 이 경우는 뷰 옵션에 기본 글꼴 이름을 지정하는 방식으로 구현합니다.

이 옵션은 DefaultFontName이라고 하며, 문자열 타입의 속성으로 추상 클래스 BaseViewOptions에 선언되어 있습니다. 따라서 모든 렌더링 옵션(HtmlViewOptions, PdfViewOptions, PngViewOptions, JpgViewOptions)에서 공통으로 사용할 수 있습니다.

이 옵션을 지정하면 GroupDocs.Viewer는 사용 불가능한 글꼴 대신 지정된 글꼴을 사용해 렌더링합니다. 예를 들어 문서에 비영어권 문자 세트가 포함된 경우, 기본 글꼴 이름을 지정해 동일한 문자 세트를 지원하는 글꼴로 누락된 글꼴을 대체하도록 할 수 있습니다. 단, DefaultFontName 속성에 지정한 글꼴은 실제로 해당 운영 체제에 설치돼 있어야 합니다.

다음 코드는 기본 글꼴 이름을 설정하는 방법을 보여줍니다:

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("sample.pptx"))
{
    // HTML 문서를 임베디드 리소스로 렌더링하기 위한 옵션 생성
    HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
   
    // 옵션에 기본 글꼴 이름 지정
    viewOptions.DefaultFontName = "Courier New";
    
    // 입력 PPTX를 HTML로 렌더링
    viewer.View(viewOptions);
}          

HTML에서 글꼴 제외

문서를 HTML 형식으로 렌더링할 때 GroupDocs.Viewer는 기본적으로 사용된 모든 글꼴을 HTML 문서에 포함시킵니다. 이렇게 하면 뷰어 장치에 해당 글꼴이 없더라도 올바르게 표시됩니다. 글꼴은 외부 리소스로 저장(HtmlViewOptions.ForExternalResources)하거나, base64 인코딩을 사용한 data URI 스킴으로 HTML 마크업에 직접 임베드(HtmlViewOptions.ForEmbeddedResources)할 수 있습니다. 글꼴을 HTML 형식으로 내보내는 기능은 Microsoft Office(Excel 제외), OpenDocument, 이메일, PDF, 전자책 등 거의 모든 글꼴을 지원하는 문서 형식에서 제공됩니다.

하지만 때때로 이 기능이 원치 않을 수 있습니다. 글꼴이 포함되면 생성된 HTML 문서의 크기가 크게 늘어나기 때문입니다. 따라서 대상 머신이나 디바이스에 모든 사용 글꼴이 이미 설치돼 있다면 브라우저가 시스템에 설치된 글꼴을 그대로 사용하도록 하고 싶을 수 있습니다.

이를 위해 GroupDocs.Viewer는 글꼴을 제외하는 기능을 제공하며, 두 가지 방법으로 사용할 수 있습니다:

  • 모든 글꼴 제외
  • 특정 글꼴만 제외

두 옵션은 HtmlViewOptions 클래스의 서로 다른 속성으로 구현됩니다:

  • ExcludeFontstrue 로 설정하면 사용된 모든 글꼴을 HTML에 내보내지 않게 합니다. 기본값은 false(비활성)입니다.
  • FontsToExclude – 제외할 글꼴 이름을 문자열 리스트 형태로 지정합니다. 기본값은 빈 리스트이며, ExcludeFontsfalse일 때만 적용됩니다.

아래 두 코드 스니펫은 각각의 방법을 보여줍니다. 첫 번째는 ExcludeFonts를 이용하고, 두 번째는 FontsToExclude를 이용합니다.

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("sample.docx"))
{
    // HTML 파일을 생성합니다.
    var viewOptions = HtmlViewOptions.ForEmbeddedResources();    
    viewOptions.ExcludeFonts = true;
    viewer.View(viewOptions);
}
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

using (Viewer viewer = new Viewer("presentation.pptx"))
{
    // HTML 파일을 생성합니다.
    var viewOptions = HtmlViewOptions.ForEmbeddedResources();    
    viewOptions.FontsToExclude.Add("Times New Roman"); // Times New Roman 글꼴 제외
    viewOptions.FontsToExclude.Add("Arial"); // Arial 글꼴 제외
    viewer.View(viewOptions);
}

결론

GroupDocs.Viewer는 HTML, PDF, JPEG, PNG 등 일반적으로 널리 사용되는 “뷰어블” 형식으로 다양한 문서 포맷을 렌더링하는 데 초점을 맞추고 있습니다. 최근에는 글꼴 처리와 관련된 여러 유용한 기능을 추가해, 사용된 글꼴을 조회·검토하고, 글꼴 내보내기를 조정하며, 글꼴 대체 동작을 세밀하게 제어할 수 있게 되었습니다.

관련 자료

무료 체험 받기

GroupDocs.Viewer for .NET 무료 체험판은 releases.groupdocs.com에서 다운로드할 수 있습니다. 또한 여기에서 임시 라이선스를 받아 모든 기능을 제한 없이 사용해 볼 수 있습니다.