【问题标题】:iTextSharp.text.pdf.FontSelector for Bold textiTextSharp.text.pdf.FontSelector 用于粗体文本
【发布时间】:2014-09-10 18:52:14
【问题描述】:

在windows上打印PDF时,需要根据文本中的字符来选择字体。

我想使用 iTextSharp FontSelector,但我希望粗体和普通字体的正确字体可能不同。但是字体选择器没有粗体的参数。

我不太了解中文字体,但我认为 simsun.ttc 中没有粗体字体,可以选择 simhei.ttf 代替粗体字体(如果我错了,请纠正我)。我应该为粗体选择不同的字体吗?怎么做?

        const int fontSizeforSelector = 12;
        static Font Arial;
        static Font SimplifiedArabic;
        static Font Andalus;
        static Font TraditionalArabic;
        static Font Tahoma;
        static Font Simpo;
        static Font Batang;
        static Font Simsun;
        static Font ArialUni;
        static Font Simpbdo;
        static Font Simhei;

        static iTextSharp.text.pdf.FontSelector _fontSelector = new iTextSharp.text.pdf.FontSelector();

        static MyFontSelector()
        {
            string winDir = Environment.GetEnvironmentVariable("WINDIR");//!-!
            if (winDir.IsNullOrEmpty())
                winDir = GetWindowsDirectory();

            string fontDir = winDir + "\\Fonts\\";//!-!

            Arial = TryCreateFont(fontDir, "arial.ttf");
            SimplifiedArabic = TryCreateFont(fontDir,"simpo.ttf");
            Andalus = TryCreateFont(fontDir,"andlso.ttf");
            TraditionalArabic = TryCreateFont(fontDir,"trado.ttf");
            Tahoma = TryCreateFontEmbedded(fontDir, "tahoma.ttf");
            Simpo = TryCreateFontEmbedded(fontDir, "simpo.ttc");//!-! 
            Batang = TryCreateFontEmbedded(fontDir, "batang.ttc");//!-! 
            Simsun = TryCreateFontEmbedded(fontDir, "simsun.ttc,1");//!-! 
            ArialUni = TryCreateFontEmbedded(fontDir, "arialuni.ttf");//!-! 
            Simpbdo = TryCreateFontEmbedded(fontDir, "simpbdo.ttf");//!-! 
            Simhei = TryCreateFontEmbedded(fontDir, "simhei.ttf");//!-! 

            //http://stackoverflow.com/questions/16415074/detecting-cjk-characters-in-a-string-c/16429065#16429065


            //http://www.computarat.com/files/java/Test9.java

            if (Arial != null)
                _fontSelector.AddFont(Arial);
            if (SimplifiedArabic != null)
                _fontSelector.AddFont(SimplifiedArabic);
            if (Andalus != null)
                _fontSelector.AddFont(Andalus);
            if (SimplifiedArabic != null)
                _fontSelector.AddFont(SimplifiedArabic);
            if (TraditionalArabic != null)
                _fontSelector.AddFont(TraditionalArabic);
            if (Tahoma != null)
                _fontSelector.AddFont(Tahoma);
            if (Batang != null)
                _fontSelector.AddFont(Batang);
            if (Simsun != null)
                _fontSelector.AddFont(Simsun);
            if (ArialUni != null)
                _fontSelector.AddFont(ArialUni);
            if (Simpbdo != null)
                _fontSelector.AddFont(Simpbdo);
            if (Simhei != null)
                _fontSelector.AddFont(Simhei);

        }

        private static Font TryCreateFont(string fontDir, string file)
        {
            try
            {
                return FontFactory.GetFont(fontDir + file, BaseFont.IDENTITY_H, fontSizeforSelector);
            }
            catch(Exception ex)
            {
                Trace.WriteLine(ex);                
            }
            return null;
        }

        private static Font TryCreateFontEmbedded(string fontDir, string file)
        {
            try
            {
                return FontFactory.GetFont(fontDir + file, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex);
            }
            return null;
        }

        public static iTextSharp.text.pdf.FontSelector FontSelector
        {
            get
            {
                return _fontSelector;                
            }
        }

        public static BaseFont GetBaseFont(string text)
        {
            Phrase phrase = _fontSelector.Process(text);
            return phrase.Font.GetCalculatedBaseFont(true);
        }

【问题讨论】:

    标签: c# unicode fonts itextsharp


    【解决方案1】:

    我的回答分为两部分:

    我的回答的第 1 部分:

    中文字体一般没有加粗版本,所以如果你需要中文字体加粗,你应该改变Chunk的渲染模式,用中文来模仿粗体。

    例如,如果您有一个 Chunk 对象 chunk 带有常规字体的文本,您可以这样做以使粗体看起来像粗体:

    chunk.setTextRenderMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE);
    

    这在我书中的SayPeace 示例中得到了证明。默认情况下,字形是用颜色填充的形状。为了使它们看起来更粗,我们更改了渲染模式,使它们不仅被填充,而且被描边。

    我的回答的第 2 部分:

    您正在使用FontSelector 创建一个Phrase。这个phrase 对象将是Chunk 对象的集合,它们具有不同的字体。奇怪的是,您向 phrase 对象询问其字体,因为这只会返回一种字体,而短语中的不同块可以有不同的字体。

    如果我是你,我会获取 phrase 的不同块,检查用于每个块的字体,在必要时更改文本渲染模式,并使用这些块创建一个新短语。

    【讨论】:

      猜你喜欢
      • 2014-09-04
      • 2022-01-13
      • 2011-03-09
      • 2013-01-31
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多