2011-09-22 13 views
5

Quando viene creato un file XPS, è sottoinsiemi e offusca i font del documento originale come file di font ODTTF, e li fasci nel file XPS (che è solo un file zip, in modo che siano facilmente estratti.)C'è un modo per usare un file di font ODTTF nella mia app WPF?

I' Ho estratto uno di questi file ODTTF e l'ho incluso come risorsa nella mia app WPF.

Ora sto provando ad usarlo come FontFamily di un TextBlock. Ho provato varie stringhe URI per fare riferimento al carattere ODTTF nel mio XAML, ma non riesco a farlo funzionare affatto. (Posso ottenere un normale file TTF per funzionare, ma non un ODTTF)

C'è un modo per farlo? Ho trovato prove in alcune ricerche su Google che le persone riescono a fare!

risposta

9

I file ODTTF sono offuscati. Per usarli come TTF devi deobfuscarli. È possibile utilizzare questo codice:

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); 
     } 
    } 
} 

Una volta scritto in un file .TTF in questo modo è possibile utilizzare il tipo di carattere. Nota che i font nei file XPS sono sottoinsiemi, contenenti solo quei caratteri effettivamente usati nel file XPS, quindi non saranno utili da usare, per esempio, in MS-Word come font.

Problemi correlati