PDFSharp private fonts for azure 1.50

后端 未结 2 1100
天涯浪人
天涯浪人 2021-01-20 22:07

I have downloaded and installed PDFSharp 1.5 and I am having trouble using private fonts. I have created in testing a pdf creator and it works great. When I load it into A

相关标签:
2条回答
  • 2021-01-20 22:27

    When using the WPF build of PDFsharp 1.50, you can implement IFontResolver in a class of your own and assign an instance of that class to GlobalFontSettings.FontResolver.

    PDFsharp 1.50 is still under construction. When it is final it should include FontResolver samples.

    Sample code can be found on the PDFsharp forum:
    http://forum.pdfsharp.net/viewtopic.php?p=8961#p8961

    Note: The XPrivateFontCollection should work with both the GDI and the WPF build. You have to use XPrivateFontCollection if you use the DocumentPreview and want to see your fonts there.
    IFontResolver is probably the best choice for processes without user interface (e.g. PDF generation on web servers), but it does not work with the GDI build.

    0 讨论(0)
  • 2021-01-20 22:31

    This is for PdfSharp 1.5 beta3b. Here is a complete and fixed example based on links from other answers, and other questions - but for Arial.

    Add the fonts you want to your project - in my example below I put Arial in MyProject\fonts\arial\arial.ttf etc. Set each font file as an embedded resource (properties -> build action).

    Apply the font resolver using the static call like this:

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

    Here's the font resolver class:

    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)
提交回复
热议问题