PDFsharp & MigraDoc Foundation
https://forum.pdfsharp.net/

Suport for private or local fonts
https://forum.pdfsharp.net/viewtopic.php?f=4&t=276
Page 1 of 1

Author:  Vyacheslav Popov [ Mon Dec 17, 2007 12:31 pm ]
Post subject:  Suport for private or local fonts

Hello, this code do soport for fonts.
For example your can create local folder "Fonts" and copy and past fonts type Barcode TrueType ;)

....

and update line 73 in file MigraDoc.Rendering.FontHandler
Code:
        XPdfFontOptions options = null;
        options = new XPdfFontOptions(encoding, fontEmbedding);     
       
        XFontStyle style = GetXStyle(font);
        System.Drawing.Font gdiFont = FontConverter.ConvertToFont(font.Name, (float)font.Size, (System.Drawing.FontStyle)style, System.Drawing.GraphicsUnit.World);
        XFont xFont = new XFont(gdiFont, options);


Other problem is simulate bolt and italic. This is to do.
See: PdfSharp.Drawing.Pdf.XGraphicsPdfRenderer line 520 and 525
Code:
      if (bold && !descriptor.IsBoldFace)
      {
        // TODO: emulate bold by thicker outline
      }

      if (italic && !descriptor.IsBoldFace)
      {
        // TODO: emulate italic by shearing transformation
      }

Author:  Vyacheslav Popov [ Mon Dec 17, 2007 12:37 pm ]
Post subject: 

The code of the FontConverter, i can not send.
This form detect how spam....

Author:  Vyacheslav Popov [ Mon Dec 17, 2007 12:38 pm ]
Post subject: 

Code:
using System;
using System.Drawing;
using System.Drawing.Text;
using System.IO;

namespace MigraDoc.Rendering
{
    /// <summary>
    /// FontConverter
    /// </summary>
    public class FontConverter
    {
        /// <summary>
        /// Convert string name to Font GDI+ type, include private fonts from "Fonts" folder
        /// </summary>
        /// <param name="fontName"></param>
        /// <param name="size"></param>
        /// <param name="style"></param>
        /// <param name="unit"></param>
        /// <returns></returns>
        public static Font ConvertToFont(string fontName, float size, FontStyle style, GraphicsUnit unit)
        {
            fontName = fontName.ToLowerInvariant();

            FontFamily family = LocalFontCollection.Instance.Find(fontName, style);

            if (family == null)
                family = LocalFontCollection.Find(fontName, FontFamily.Families);

            if (family == null)
                return new Font(fontName, size, style, unit);

            return new Font(family, size, style, unit);
        }

        private class LocalFontCollection
        {
            private static LocalFontCollection _instance = new LocalFontCollection();
            public static LocalFontCollection Instance
            {
                get { return _instance; }
            }

            private System.Drawing.Text.PrivateFontCollection _privateFontCollectionRegular;
            private System.Drawing.Text.PrivateFontCollection _privateFontCollectionBold;
            private System.Drawing.Text.PrivateFontCollection _privateFontCollectionItalic;
            private System.Drawing.Text.PrivateFontCollection _privateFontCollectionBoldItalic;

            public LocalFontCollection()
            {
                _privateFontCollectionRegular = new System.Drawing.Text.PrivateFontCollection();
                _privateFontCollectionBold = new System.Drawing.Text.PrivateFontCollection();
                _privateFontCollectionItalic = new System.Drawing.Text.PrivateFontCollection();
                _privateFontCollectionBoldItalic = new System.Drawing.Text.PrivateFontCollection();

                string path = "fonts/";
                if (System.Web.HttpContext.Current != null)
                    path = System.Web.HttpContext.Current.Request.PhysicalApplicationPath + path;
#if DEBUG
                else
                    path = "../../" + path;
#endif

                string[] files = System.IO.Directory.GetFiles(path);
                foreach (string file in files)
                {
                    if (System.IO.Path.GetFileName(file).ToLower().Contains("bolditalic"))
                        _privateFontCollectionBoldItalic.AddFontFile(file);
                    else if (System.IO.Path.GetFileName(file).ToLower().Contains("bold"))
                        _privateFontCollectionBold.AddFontFile(file);
                    else if (System.IO.Path.GetFileName(file).ToLower().Contains("italic"))
                        _privateFontCollectionItalic.AddFontFile(file);
                    else
                        _privateFontCollectionRegular.AddFontFile(file);
                }
            }

            public FontFamily Find(string fontName, FontStyle style)
            {
                FontFamily family = null;

                if ((style & FontStyle.Bold) == FontStyle.Bold)
                {
                    if ((style & FontStyle.Italic) == FontStyle.Italic)
                    {
                        // BoldItalic
                        family = Find(fontName, _privateFontCollectionBoldItalic.Families);
                    }
                    else
                    {
                        // Bold
                        family = Find(fontName, _privateFontCollectionBold.Families);
                    }
                }
                else if ((style & FontStyle.Italic) == FontStyle.Italic)
                {
                    // Italic
                    family = Find(fontName, _privateFontCollectionItalic.Families);
                }
               
                if (family == null)
                {
                    // Regular
                    family = Find(fontName, _privateFontCollectionRegular.Families);
                }

                return family;
            }

            public static FontFamily Find(string fontName, System.Drawing.FontFamily[] families)
            {
                foreach (System.Drawing.FontFamily family in families)
                    if (family.Name.ToLowerInvariant().Equals(fontName))
                        return family;

                return null;
            }
        }
    }
}

Author:  Vyacheslav Popov [ Mon Dec 17, 2007 3:00 pm ]
Post subject: 

New update in FontConverter
Code:
                string[] files = System.IO.Directory.GetFiles(path);
                foreach (string file in files)
                {
                    System.Drawing.Text.PrivateFontCollection temp = new System.Drawing.Text.PrivateFontCollection();
                    temp.AddFontFile(file);

                    if (temp.Families[0].IsStyleAvailable(FontStyle.Bold & FontStyle.Italic))
                        _privateFontCollectionRegular.AddFontFile(file);
                    else if (temp.Families[0].IsStyleAvailable(FontStyle.Bold))
                        _privateFontCollectionBold.AddFontFile(file);
                    else if (temp.Families[0].IsStyleAvailable(FontStyle.Italic))
                        _privateFontCollectionItalic.AddFontFile(file);
                    else
                        _privateFontCollectionBoldItalic.AddFontFile(file);

                    //if (System.IO.Path.GetFileName(file).ToLower().Contains("bolditalic"))
                    //    _privateFontCollectionBoldItalic.AddFontFile(file);
                    //else if (System.IO.Path.GetFileName(file).ToLower().Contains("bold"))
                    //    _privateFontCollectionBold.AddFontFile(file);
                    //else if (System.IO.Path.GetFileName(file).ToLower().Contains("italic"))
                    //    _privateFontCollectionItalic.AddFontFile(file);
                    //else
                    //    _privateFontCollectionRegular.AddFontFile(file);
                }

Page 1 of 1 All times are UTC
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/