2014-09-10 63 views
0

在Windows上打印PDF时,需要根据文本中的字符选择字体。用于粗体文本的iTextSharp.text.pdf.FontSelector

我想使用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); 
     } 

回答

1

有两个部分,我的回答:

我回答的第1部分:

通常有中国的字体不是任何大胆的版本,所以如果你需要一个中国的字体大胆,你应该用中文文本改变Chunk的渲染模式,以模仿粗体字体。

举例来说,如果你有一个Chunk对象chunk在常规字体的文字,你可以做到这一点,使大胆看起来好像很大胆:

chunk.setTextRenderMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE); 

这表现在的SayPeace例子我的书。默认情况下,字形是用颜色填充的形状。为了使它们看起来大胆,我们改变了渲染模式,以便它们不仅被填充,而且被抚摸。

我回答的第2部分:

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

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