使用 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 段落或字体行高?