iTextSharp 将字体样式应用于现有字体

iTextSharp apply font style to existing font

在文档的开头我创建了一个新字体:

BaseFont baseFont = BaseFont.CreateFont(@"C:\Windows\Fonts\Calibri.ttf", "Identity-H", BaseFont.EMBEDDED);
var font1 = new Font(baseFont, 12, Font.NORMAL);

我想在同一文档中间的某处使用不同样式的相同字体(字体系列和大小):粗体和斜体。

我能以某种方式改变 font1 的样式还是必须创建一个新字体?

注意:我知道我能做到:

font1.SetStyle("bold");
font1.SetStyle("italic");

但是两者都怎么样?也许还有 下划线...

首先,在

BaseFont baseFont = BaseFont.CreateFont(@"C:\Windows\Fonts\Calibri.ttf", "Identity-H", BaseFont.EMBEDDED);

您加载常规 Calibri 的字体文件。如果您从这个 BaseFont 派生任何 Font,它使用常规的 Calibri 字体文件,无论您设置哪种样式属性。这尤其意味着

  • “粗体”样式的实现不仅要填充正常的字形轮廓,还要沿着它画一条线(所谓的“穷人的粗体”的变体)和
  • “斜体”样式是通过应用稍微倾斜的变换矩阵实现的。

通过加载粗体或斜体 Calibri,您可以获得质量更好的粗体和斜体变化

BaseFont baseFontBold = BaseFont.CreateFont(@"C:\Windows\Fonts\Calibrib.ttf", "Identity-H", BaseFont.EMBEDDED);
BaseFont baseFontItalic = BaseFont.CreateFont(@"C:\Windows\Fonts\Calibrii.ttf", "Identity-H", BaseFont.EMBEDDED);
BaseFont baseFontBoldItalic = BaseFont.CreateFont(@"C:\Windows\Fonts\Calibriz.ttf", "Identity-H", BaseFont.EMBEDDED);

并从匹配的 BaseFont.

中导出样式为“normal”的 Font

话虽如此,现在回答您的主要问题:

I know I can do:

font1.SetStyle("bold");
font1.SetStyle("italic");

but how about both? And maybe also underline...

对于两个你可以简单地按照你写的去做

font1.SetStyle("bold");
font1.SetStyle("italic");

即按顺序设置两者,因为 SetStyle(String) 实际上更像 AddStyle。不过,您也可以选择

font1.SetStyle("bold italic");

如果您需要将所选样式集重置为正常,您可以使用 SetStyle(int),它确实像 setter 应该:

font1.SetStyle(0);

And maybe also underline...

可用样式的String常量是

  • “正常”
  • “粗体”
  • “斜体”
  • “斜”
  • “下划线”
  • “直通”