2014-12-22 4 views
1

Я загрузил и установил PDFSharp 1.5, и у меня возникли проблемы с использованием частных шрифтов. Я создал в тестировании создателя PDF, и он отлично работает. Когда я загружаю его в Azure, он дает мне ошибку, не могу загрузить шрифт. Проводили исследования и выяснили, что у них нет загруженных шрифтов, поэтому я должен использовать частный шрифт. Я могу найти только примеры более старой версии 1.3, и методы меняются на новые. Может ли кто-нибудь показать мне простой пример с использованием новой версии PDFSharp?PDFSharp private шрифты для azure 1.50

Благодаря Джон

+0

обновленных образцов для версии 1.50 не были освобождены еще - они должны прийти в январь. Версия 1.50 находится в стадии бета-тестирования. Вы все равно можете получить PDFsharp версии 1.32 (исходные и NuGet-пакеты). –

+0

Я скачал версию 1.32 и версию 1.3, и я все еще смущен. Моя путаница в том, что я вижу во всех примерах, что они используют xprivateFontCollection pfc = new xPrivateFontCollection(); pfc.Add (XXXXXX); и я получаю pfc.AddFont (XXX) Какую версию они используют, чтобы получить только pfc.Add, чтобы я мог использовать примеры? –

+0

ОК понял, почему я не видел .Add, потому что я использовал GDI вместо WPF. Все еще не работает, но я немного приближаюсь. –

ответ

1

При использовании WPF сборки PDFsharp 1,50, вы можете реализовать IFontResolver в классе самостоятельно и назначить экземпляр этого класса GlobalFontSettings.FontResolver.

PDFsharp 1.50 все еще находится в разработке. Когда он окончательный, он должен включать образцы FontResolver.

Пример кода можно найти на форуме PDFsharp:
http://forum.pdfsharp.net/viewtopic.php?p=8961#p8961

Примечание: XPrivateFontCollection должен работать как с GDI и WPF сборки. Вы должны использовать XPrivateFontCollection, если используете DocumentPreview и хотите увидеть свои шрифты.
IFontResolver, вероятно, лучший выбор для процессов без пользовательского интерфейса (например, для создания PDF-файлов на веб-серверах), но он не работает с сборкой GDI.

4

Это для PdfSharp 1.5 beta3b. Вот полный и фиксированный пример, основанный на ссылках на другие ответы и на другие вопросы, но для Arial.

Добавьте шрифты, которые вы хотите к проекту - в моем примере ниже я положил Arial в MyProject\fonts\arial\arial.ttf и т. Д. Установите каждый файл шрифта в качестве встроенного ресурса (свойства -> действие сборки).

Нанести распознаватель шрифта с помощью статического вызова, как это:

MyFontResolver.Apply(); // Ensures it's only applied once 

Вот класс распознаватель шрифта:

class MyFontResolver : IFontResolver 
{ 
    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic) 
    { 
     // Ignore case of font names. 
     var name = familyName.ToLower().TrimEnd('#'); 

     // Deal with the fonts we know. 
     switch (name) 
     { 
      case "arial": 
       if (isBold) 
       { 
        if (isItalic) 
         return new FontResolverInfo("Arial#bi"); 
        return new FontResolverInfo("Arial#b"); 
       } 
       if (isItalic) 
        return new FontResolverInfo("Arial#i"); 
       return new FontResolverInfo("Arial#"); 
     } 

     // We pass all other font requests to the default handler. 
     // When running on a web server without sufficient permission, you can return a default font at this stage. 
     return PlatformFontResolver.ResolveTypeface(familyName, isBold, isItalic); 
    } 

    public byte[] GetFont(string faceName) 
    { 
     switch (faceName) 
     { 
      case "Arial#": 
       return LoadFontData("MyProject.fonts.arial.arial.ttf");; 

      case "Arial#b": 
       return LoadFontData("MyProject.fonts.arial.arialbd.ttf");; 

      case "Arial#i": 
       return LoadFontData("MyProject.fonts.arial.ariali.ttf"); 

      case "Arial#bi": 
       return LoadFontData("MyProject.fonts.arial.arialbi.ttf"); 
     } 

     return null; 
    } 

    /// <summary> 
    /// Returns the specified font from an embedded resource. 
    /// </summary> 
    private byte[] LoadFontData(string name) 
    { 
     var assembly = Assembly.GetExecutingAssembly(); 

     // Test code to find the names of embedded fonts - put a watch on "ourResources" 
     //var ourResources = assembly.GetManifestResourceNames(); 

     using (Stream stream = assembly.GetManifestResourceStream(name)) 
     { 
      if (stream == null) 
       throw new ArgumentException("No resource with name " + name); 

      int count = (int)stream.Length; 
      byte[] data = new byte[count]; 
      stream.Read(data, 0, count); 
      return data; 
     } 
    } 

    internal static MyFontResolver OurGlobalFontResolver = null; 

    /// <summary> 
    /// Ensure the font resolver is only applied once (or an exception is thrown) 
    /// </summary> 
    internal static void Apply() 
    { 
     if (OurGlobalFontResolver == null || GlobalFontSettings.FontResolver == null) 
     { 
      if (OurGlobalFontResolver == null) 
       OurGlobalFontResolver = new MyFontResolver(); 

      GlobalFontSettings.FontResolver = OurGlobalFontResolver; 
     } 
    } 
} 
+0

Это по существу код из сообщения форума, связанный в другом ответе (без каких-либо кредитов). –

+0

Я добавил кредит. – noelicus

+0

Большое вам спасибо. :) – HussainMarvi

Смежные вопросы