2015-01-15 2 views
1

열 필요가있는 글꼴 (다른 것들 중에서)이 들어있는 압축 된 폴더가 있습니다. 임시 폴더에 글꼴을 추출하여 그 방법으로 사용할 수 있다는 것을 알고 있지만 가능한 경우 메모리에 유지하는 해결책을 찾으려합니다.압축 된 폴더의 글꼴 사용

System.IO.Compression을 사용하여 글꼴을 스트림으로 가져 오지만 그때부터 나는 조금 붙어 있습니다!

using (ZipArchive zipArchive = ZipFile.Open(filelocation, ZipArchiveMode.Update)) 
{ 
    ZipArchiveEntry fontEntry = zipArchive.Entries.FirstOrDefault(ze => ze.Name.EndsWith("ttf")); 
    if (fontEntry != null) 
    { 
     Stream fontStream = fontEntry.Open(); 
     // I need a TextBlock to somehow use this stream as the FontFamily 
    } 
} 

내가 스트림을 포장 한 후 패키지 URI를 사용하여 글꼴 패밀리를로드하려고 System.IO.Packaging 살펴 보았다하지만 난 그 일을 가져올 수 없습니다.

+0

글꼴 경로를 'c : \ folder \ file.zip \ fontname.ttf'로 지정할 수 있습니까? – DavidG

+1

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+1

'PrivateFontCollection.AddMemoryFont'가 도움이 될지 모르지만 이전에는 시도한 적이 없지만 아마도 그 일을 할 것입니다. –

답변

1

맞습니다. System.IO.Packaging을 사용할 수 있습니다. "TextBlock의는"사용하려는 컨트롤이라고 가정하면 다음과 같습니다

using (ZipArchive zipArchive = ZipFile.Open(filelocation, ZipArchiveMode.Update)) 
{ 
    ZipArchiveEntry fontEntry = zipArchive.Entries.FirstOrDefault(ze => ze.Name.EndsWith("ttf")); 
    if (fontEntry != null) 
    { 
     Stream fontStream = fontEntry.Open(); 
     Uri uri = CreateMemoryUriFromStream(fileStream); 
     textBlock.FontFamily = new FontFamily(uri, "myFont"); 
    } 
} 

CreateMemoryUriFromStream 방법

public static Uri CreateMemoryUriFromStream(Stream stream) 
{ 
    MemoryStream memoryStream = new MemoryStream(); 
    byte[] streamData = new byte[stream.Length]; 
    stream.Read(streamData, 0, streamData.Length); 

    Package pack = Package.Open(memoryStream, FileMode.Create, FileAccess.ReadWrite); 
    Uri packageUri = new Uri("memory:"); 

    PackageStore.AddPackage(packageUri, pack); 

    Uri packagePartUri = new Uri("/packagePart", UriKind.Relative); 
    PackagePart packagePart = pack.CreatePart(packagePartUri, "application/font"); 

    Stream packageStream = packagePart.GetStream(); 
    packageStream.Write(streamData, 0, streamData.Length); 

    return PackUriHelper.Create(packageUri, packagePart.Uri); 
} 

그래서 임시 폴더를 사용할 필요가 없습니다!

+0

Il Vic 시도해 주셔서 감사하지만 제안을 시도했지만 Arial이 화면에 표시되고 FontFamily 내에서 FamilyNames를 검토 할 때 en-us : Arial에 대한 항목이 하나만 있습니다. – User

+0

사실 WPF 창에서 내 솔루션을 사용했고 제대로 작동하는지 확인할 수 있습니다. 원하면 전체 코드를 게시 할 수 있습니다. 어쨌든 .ttf 파일에주의하십시오. 예를 들어 굵은 글꼴이 들어 있으면 TextBlock의 속성 'FontWeight'을'Bold'으로 설정해야합니다. 그렇지 않으면 시스템 기본 글꼴 (Arial?) 만 표시됩니다. –

+0

죄송합니다. Il Vic, 당신은 절대적으로 옳았습니다. 폰트 이름 끝에 Regular를 추가해야만했습니다. – User

관련 문제