我想用iTextSharp写一些文字。我正在使用这种方法:
var font = BaseFont.CreateFont(BaseFont.TIMES_BOLD, BaseFont.WINANSI, BaseFont.EMBEDDED);
我的问题是:iTextSharp是否支持系统字体目录中的所有字体?
假设我在字体选择器对话框中选择了一个名为'mycoolfont'的字体。我可以创建这样的新iTextSharp字体吗?
var font = BaseFont.CreateFont("mycoolfont", BaseFont.WINANSI, BaseFont.EMBEDDED);
overContent.SetFontAndSize(font, fontSize);
更新
我尝试了var font = BaseFont.CreateFont("Verdana", BaseFont.WINANSI, BaseFont.EMBEDDED);
但得到错误“Verdana”无法被itextsharp识别
答案 0 :(得分:19)
首先你需要注册字体然后从FontFactory中检索它(并且不要每次都创建它):
public static iTextSharp.text.Font GetTahoma()
{
var fontName = "Tahoma";
if (!FontFactory.IsRegistered(fontName))
{
var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf";
FontFactory.Register(fontPath);
}
return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}
答案 1 :(得分:9)
我最后将这两个答案合并到这个方法中:
public static Font GetFont(string fontName, string filename)
{
if (!FontFactory.IsRegistered(fontName))
{
var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\" + filename;
FontFactory.Register(fontPath);
}
return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}
然后我在我的代码中使用它:
writer.DirectContent.SetFontAndSize(GetFont("Franklin Gothic Medium Cond", "FRAMDCN.TTF").BaseFont, 24f);
在Windows上,您可以从字体的属性表中找到字体的文件名:
我还发现您必须在“详细信息”标签上使用字体的确切名称:
答案 2 :(得分:5)
我发布这个,因为其他人可能会觉得这很有用。 当我在服务器上运行代码时,我遇到了类似的问题。原因是itextsharp无法在OS中找到字体样式。 我的PDF在找不到字体时显示了一些随机的字体样式(dint throw error)。 我将所需的字体文件(.ttf)复制到我的项目bin文件夹并使用以下代码。
public static BaseFont GetFont(string fontName)
{
return BaseFont.CreateFont(HttpContext.Current.Server.MapPath("~/Bin/" + fontName + ".ttf"), BaseFont.CP1252, BaseFont.EMBEDDED);
}
这里我得到了所需的字体
`BaseFont sm = GetFont("comic"); //The fontName here should exactly match` the` file name in bin folder
答案 3 :(得分:1)
如果这种变化可以帮助某人。 这是VahidN答案的一种变体。
在此解决方案中,您可以(至少在我们的文件系统上)使用Visual Studio的fonts文件夹中的字体。这使得Visual Studio项目更加独立(并且可能更加“便携”)。因此,与其尝试在Windows操作系统上查找字体文件夹,不如在下一次Windows开发新操作系统时可能会更改字体,字体都在您的Project中。
请注意,对于我的特定项目,我需要“ BaseFont.EMBEDDED”为真。通常并非所有项目都需要这样做(请参阅此页面上的其他答案)。请根据您的项目需要更改'FontFactory.GetFont()'的参数。有很多重载可用。
旁注:Windows文件系统的fonts文件夹不应更改。但是,可以保证在下一版本的Windows中留在同一位置吗?另外,如果由于硬盘驱动器崩溃而将Project加载到新计算机上,并且正在使用Project备份... Windows文件系统的fonts文件夹中是否已经需要字体?如果是这样,那太好了。如果没有,您必须去得到它。通常没什么大不了的。但是,如果您通过此解决方案将字体永久地绑定到Project,那么麻烦就少了。
代码的主要更改是:
而不是'Environment.GetEnvironmentVariable(“ SystemRoot”)'
使用:System.Web.Hosting.HostingEnvironment.MapPath(“ \”)
还请注意,“ ttf”字体文件已放置在我项目的“ fonts”文件夹中:
public static iTextSharp.text.Font GetFontAwesome()
{
string fontName = "fontawesome";
if (!FontFactory.IsRegistered(fontName))
{
var fontPath = System.Web.Hosting.HostingEnvironment.MapPath("\\") + "fonts\\fontawesome-webfont.ttf";
FontFactory.Register(fontPath, fontName);
}
var FontColour = new BaseColor(0, 0, 0); // optional... ints 0, 0, 0 are red, green, blue
int FontStyle = iTextSharp.text.Font.NORMAL; // optional
float FontSize = iTextSharp.text.Font.DEFAULTSIZE; // optional
return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, FontSize, FontStyle, FontColour );
// last 3 arguments can be removed
}
然后只需调用该函数...
var fontawesomeFont = GetFontAwesome();
使用功能:
Paragraph paragraph = new Paragraph();
paragraph.Add(new Chunk("Hello world! "));
paragraph.Add(new Chunk("\xf118", fontawesomeFont));
paragraph.Add(new Chunk("\xf14a", fontawesomeFont));
paragraph.Add(new Chunk("\xf0c8", fontawesomeFont));
paragraph.Add(new Chunk("\xf046", fontawesomeFont));
paragraph.Add(new Chunk("\xf096", fontawesomeFont));
document.Add(paragraph);
此变体允许您通过上面的'new BaseColor(0,0,0)'随意更改颜色。 (如果需要,请尝试(255,0,0)设置红色字体。)
FYI-特定于fontawesome
中的字体很棒的速查表代码