2011-09-22 39 views
5

Khi một tệp XPS được tạo, nó đặt và làm xáo trộn phông chữ của tài liệu gốc dưới dạng tệp phông ODTTF và gộp chúng vào tệp XPS (chỉ là tệp zip, do đó chúng dễ dàng được trích xuất.)Có cách nào để sử dụng tệp phông ODTTF trong ứng dụng WPF của tôi không?

I ' đã trích xuất một trong các tệp ODTTF này, và bao gồm nó như là một tài nguyên trong ứng dụng WPF của tôi.

Tôi hiện đang cố gắng sử dụng nó làm FontFamily của một TextBlock. Tôi đã thử các chuỗi URI khác nhau để tham khảo phông chữ ODTTF trong XAML của tôi, nhưng tôi không thể làm cho nó hoạt động được. (Tôi có thể nhận một tệp TTF thông thường để hoạt động, không phải là ODTTF)

Có cách nào để thực hiện việc này không? Tôi đã tìm thấy bằng chứng trong một vài tìm kiếm của Google mà mọi người đang quản lý để làm điều này!

Trả lời

9

Tệp ODTTF bị làm mờ. Để sử dụng chúng như TTF, bạn phải giải mã chúng. Bạn có thể sử dụng mã này:

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

Sau khi ghi vào tệp .TTF theo cách này bạn có thể sử dụng phông chữ. Lưu ý rằng các phông chữ trong các tệp XPS là các tập hợp con, chỉ chứa các ký tự đó thực sự được sử dụng trong tệp XPS, do đó chúng sẽ không hữu ích khi sử dụng trong MS-Word làm phông chữ.

Các vấn đề liên quan