2011-09-22 57 views
5

當創建XPS文件,其子集和混淆了原始文檔的字體作爲ODTTF字體文件,並將它們捆綁在XPS文件(這僅僅是一個zip文件,所以他們很容易被提取。)有沒有辦法在我的WPF應用程序中使用ODTTF字體文件?

我已經提取了其中一個ODTTF文件,並將其作爲資源包含在我的WPF應用程序中。

我現在試圖使用它作爲TextBlock的FontFamily。我嘗試了各種URI字符串來引用我的XAML中的ODTTF字體,但是我根本無法完成它。 (我可以得到一個普通的TTF文件,但不是ODTTF)

有沒有辦法做到這一點?我在一些Google搜索中發現了人們正在設法做到的證據!

回答

9

ODTTF文件被混淆。要將它們用作TTF,您必須對其進行反混淆處理。您可以使用此代碼:

void DeobfuscateFont(XpsFont font, string outname) 
{ 
    using (Stream stm = font.GetStream()) 
    { 
     using (FileStream fs = new FileStream(outname, FileMode.Create)) 
     { 
      byte[] dta = new byte[stm.Length]; 
      stm.Read(dta, 0, dta.Length); 
      if (font.IsObfuscated) 
      { 
       string guid = new Guid(font.Uri.GetFileName().Split('.')[0]).ToString("N"); 
       byte[] guidBytes = new byte[16]; 
       for (int i = 0; i < guidBytes.Length; i++) 
        guidBytes[i] = Convert.ToByte(guid.Substring(i * 2, 2), 16); 

       for (int i = 0; i < 32; i++) 
       { 
        int gi = guidBytes.Length - (i % guidBytes.Length) - 1; 
        dta[i] ^= guidBytes[gi]; 
       } 
      } 
      fs.Write(dta, 0, dta.Length); 
     } 
    } 
} 

一旦以這種方式寫入.TTF文件,您就可以使用該字體。請注意,XPS文件中的字體是子集,只包含XPS文件中實際使用的字符,因此它們在MS-Word中用作字體將沒有用處。

相關問題