使用 iTextSharp 在系统中使用字体

Posted

技术标签:

【中文标题】使用 iTextSharp 在系统中使用字体【英文标题】:Using Fonts in System with iTextSharp 【发布时间】:2013-12-30 08:05:35 【问题描述】:

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

【问题讨论】:

我有点困惑......你有所有的代码......你试过运行它吗?会发生什么? 我不知道这是否是正确的方法,我不能将字体对象与 overContent.SetFontAndSize(font, fontSize);我需要使用BaseFont Basefont和Font有什么区别 @JeffBridgman 查看更新 【参考方案1】:

首先您需要注册字体,然后从 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,fontName);
    
    return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 

【讨论】:

但是 overContent.SetFontAndSize 不以 iTextSharp.text.Font 作为参数,它需要 BaseFont 使用其BaseFont 属性(font.BaseFont)。 我可以在开始时注册字体文件夹中的所有字体吗? 一些 Basefonts 在使用 font.BaseFont 时返回 Null 为什么会这样? 可能是许可问题?并非所有字体都可嵌入。【参考方案2】:

我发布这个是因为其他人可能会觉得这很有用。 当我在服务器上运行我的代码时,我遇到了类似的问题。原因是 itextsharp 在操作系统中找不到字体样式。 我的 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】:

我最终将这里的 2 个答案合并到这个方法中:

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

我还发现您必须在“详细信息”选项卡上使用字体的确切名称:

【讨论】:

感谢您的回答...我现在有点放弃了这个项目。不记得是什么问题。您的回答会帮助其他人:)【参考方案4】:

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

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

请注意,对于我的特定项目,我需要“BaseFont.EMBEDDED”为真。这通常不是所有项目都需要的(请参阅此页面上的其他答案)。请根据您的项目的需要改变“FontFactory.GetFont()”的参数。有许多重载可用。

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

对代码的主要改动是:

而不是'Environment.GetEnvironmentVariable("SystemRoot")'

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

另请注意,“ttf”字体文件已放置在我的项目的“字体”文件夹中:

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) 为红色字体。)

仅供参考 - 特定于 fontawesome

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

【讨论】:

以上是关于使用 iTextSharp 在系统中使用字体的主要内容,如果未能解决你的问题,请参考以下文章

使用itextsharp画pdf文件(工作总结)

如何使用 iTextSharp 设置 PDF 段落或字体行高?

iTextSharp - 是不是可以为相同的单元格和行设置不同的字体颜色?

iTextSharp 如何写上标

使用itextsharp从pdf中提取文本返回空字符串

使用 iTextSharp 删除 PDF 不可见对象