使用iTextSharp在系统中使用字体

问题描述 投票:12回答:4

我想用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识别

c# pdf fonts itextsharp
4个回答
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); 
}

10
投票

我最后将这两个答案合并到这个方法中:

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上,您可以从字体的属性表中找到字体的文件名:

enter image description here

我还发现你必须在Details选项卡上使用字体的确切名称:

enter image description here


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

1
投票

如果这种变化有助于某人。这是VahidN答案的变体。

在此解决方案中,您可以使用(至少在我们的文件系统上)Visual Studio的fonts文件夹中的字体。这使得Visual Studio项目更加独立(可能更“便携”)。因此,不要试图在Windows操作系统上找到fonts文件夹...这可能会在Windows下一次开发新操作系统时发生变化,这些字体都在您的项目中。

请注意,我需要'BaseFont.EMBEDDED'才能适用于我的特定项目。所有项目通常不需要这样做(请参阅本页的其他答案)。请根据项目的需要更改“FontFactory.GetFont()”的参数。有许多重载可用。

附注:Windows文件系统的fonts文件夹不应更改。但它是否保证在下一版Windows中保持相同的位置?此外,如果您将项目加载到新计算机上,因为您的硬盘驱动器崩溃了,并且您正在使用项目备份...是您在Windows文件系统的fonts文件夹中已经需要的字体?如果是这样,很好。如果没有,你必须得到它。通常没什么大不了的。但是,如果你通过这个解决方案将字体永久地绑定到你的项目上,那就不那么麻烦了。

代码的主要变化是:

而不是'Environment.GetEnvironmentVariable(“SystemRoot”)'

使用:System.Web.Hosting.HostingEnvironment.MapPath(“\”)

另请注意'ttf'字体文件已放置在我的项目的'fonts'文件夹中:font files in fonts directory in Visual Studio Project

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 font awesome Font = GetFont Awesome();

使用功能:

    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);

此变体允许您通过上面的“新BaseColor(0,0,0)”更改颜色。 (如果需要,请尝试(255,0,0)获取红色字体。)

仅供参考 - 具体到fontawesome

我正在使用来自https://fontawesome.com/v4.7.0/cheatsheet/的字体令人敬畏的备忘单代码

© www.soinside.com 2019 - 2024. All rights reserved.