2011-09-22 22 views
5

Cuando se crea un archivo XPS, que subconjuntos y ofusca las fuentes del documento original como ficheros ODTTF, y los lotes en el archivo XPS (que es sólo un archivo zip, por lo que se extraen fácilmente.)¿Hay alguna manera de usar un archivo de fuente ODTTF en mi aplicación WPF?

I' he extraído uno de estos archivos ODTTF y lo incluí como un recurso en mi aplicación WPF.

Ahora estoy tratando de usarlo como la FontFamily de un TextBlock. Intenté varias cadenas de URI para hacer referencia a la fuente ODTTF en mi XAML, pero no puedo hacer que funcione en absoluto. (Puedo obtener un archivo TTF normal para trabajar, simplemente no es un ODTTF)

¿Hay alguna manera de hacerlo? ¡He encontrado pruebas en algunas búsquedas de Google de que las personas logran hacer esto!

Respuesta

9

Los archivos ODTTF están ofuscados. Para utilizarlos como TTF, debe desofuscularlos. Puede usar este código:

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 vez escrito en un archivo .TTF de esta manera puede usar la fuente. Tenga en cuenta que las fuentes en los archivos XPS son subconjuntos, que solo contienen los caracteres realmente utilizados en el archivo XPS, por lo que no serán útiles para utilizar, por ejemplo, en MS-Word como fuente.

Cuestiones relacionadas