empira / PDFsharp-1.5

A .NET library for processing PDF
MIT License
1.28k stars 588 forks source link

Azure function error #124

Closed williammsouza closed 4 years ago

williammsouza commented 4 years ago

https://github.com/empira/PDFsharp/blob/3205bd933b464d150c0f42e8bcdff3314b6c6164/src/PdfSharp/Drawing/XFontSource.cs#L151

I'm trying to run in azure function and I'm getting this error. Does anyone know why this is?

flensrocker commented 4 years ago

You must implement a font resolver. I embed some fonts like Liberation and Roboto into my assembly, so it is easier to distribute.

I use something like this:

  public class MyFontResolver : IFontResolver
  {
    public byte[] GetFont(string faceName)
    {
      // TODO read bytes from ttf files, e.g. from embedded resources
      return ...
    }

    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
    {
      var name = familyName.ToLower().TrimEnd('#');
      switch (name)
      {
        case "liberation mono":
          {
            if (isBold)
            {
              if (isItalic)
                return new FontResolverInfo("Liberation_Mono.LiberationMono-BoldItalic", false, false);
              return new FontResolverInfo("Liberation_Mono.LiberationMono-Bold", false, false);
            }

            if (isItalic)
              return new FontResolverInfo("Liberation_Mono.LiberationMono-Italic", false, false);
            return new FontResolverInfo("Liberation_Mono.LiberationMono-Regular", false, false);
          }
        default:
        case "liberation sans":
          {
            if (isBold)
            {
              if (isItalic)
                return new FontResolverInfo("Liberation_Sans.LiberationSans-BoldItalic", false, false);
              return new FontResolverInfo("Liberation_Sans.LiberationSans-Bold", false, false);
            }

            if (isItalic)
              return new FontResolverInfo("Liberation_Sans.LiberationSans-Italic", false, false);
            return new FontResolverInfo("Liberation_Sans.LiberationSans-Regular", false, false);
          }
        case "liberation serif":
          {
            if (isBold)
            {
              if (isItalic)
                return new FontResolverInfo("Liberation_Serif.LiberationSerif-BoldItalic", false, false);
              return new FontResolverInfo("Liberation_Serif.LiberationSerif-Bold", false, false);
            }

            if (isItalic)
              return new FontResolverInfo("Liberation_Serif.LiberationSerif-Italic", false, false);
            return new FontResolverInfo("Liberation_Serif.LiberationSerif-Regular", false, false);
          }
        case "roboto slab":
          {
            if (isBold)
              return new FontResolverInfo("Roboto_Slab.RobotoSlab-Bold", false, isItalic);

            return new FontResolverInfo("Roboto_Slab.RobotoSlab-Regular", false, isItalic);
          }
        case "roboto":
          {
            if (isBold)
            {
              if (isItalic)
                return new FontResolverInfo("Roboto.Roboto-BoldItalic", false, false);
              return new FontResolverInfo("Roboto.Roboto-Bold", false, false);
            }

            if (isItalic)
              return new FontResolverInfo("Roboto.Roboto-RegularItalic", false, false);
            return new FontResolverInfo("Roboto.Roboto-Regular", false, false);
          }
      }
    }

    private static MyFontResolver _fontResolver = null;
    internal static MyFontResolver Instance
    {
      get
      {
        if (_fontResolver == null)
          _fontResolver = new MyFontResolver();
        return _fontResolver;
      }
    }

and then do once on startup

      if (PdfSharp.Fonts.GlobalFontSettings.FontResolver == null)
        PdfSharp.Fonts.GlobalFontSettings.FontResolver = MyFontResolver.Instance;

PdfSharp is not really thread safe, I had to serialize the creation of documents. Be sure to test this.