【问题标题】:Using Fonts in System with iTextSharp使用 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 查看更新

标签: c# pdf fonts itextsharp


【解决方案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/的字体真棒备忘单代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 2014-10-06
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      相关资源
      最近更新 更多