Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用iTextSharp在系统中使用字体_C#_Pdf_Fonts_Itextsharp - Fatal编程技术网

C# 使用iTextSharp在系统中使用字体

C# 使用iTextSharp在系统中使用字体,c#,pdf,fonts,itextsharp,C#,Pdf,Fonts,Itextsharp,我想用iTextSharp写一些文字。我正在使用这种方法: var font = BaseFont.CreateFont(BaseFont.TIMES_BOLD, BaseFont.WINANSI, BaseFont.EMBEDDED); public static Font GetFont(string fontName, string filename) { if (!FontFactory.IsRegistered(fontName)) { var fon

我想用iTextSharp写一些文字。我正在使用这种方法:

var font = BaseFont.CreateFont(BaseFont.TIMES_BOLD, BaseFont.WINANSI, BaseFont.EMBEDDED);
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);
}
我的问题是:iTextSharp是否支持system fonts目录中的所有字体

假设用户在字体选择器对话框中选择了一种名为“MyColFont”的字体。我可以像这样创建一个新的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识别。首先,您需要注册字体,然后从FontFactory检索它(不要每次都创建):


我发布这篇文章是因为其他人可能会觉得这很有用。 在服务器上运行代码时,我遇到了类似的问题。原因是itextsharp无法在操作系统中找到字体样式。 我的PDF在找不到字体时显示了一些随机字体样式(dint-throw错误)。 我将所需的字体文件(.ttf)复制到我的project 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

最后,我将这里的两个答案结合到这个方法中:

var font = BaseFont.CreateFont(BaseFont.TIMES_BOLD, BaseFont.WINANSI, BaseFont.EMBEDDED);
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上,您可以从字体的属性页中找到字体的文件名:

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


以防这种变化对某人有所帮助。 这是VahidN答案的一个变体

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

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

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

代码的主要变化是:

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

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

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

然后调用函数

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);
此变体还允许您通过上面的“新基色(0,0,0)”更改颜色。(如果需要,请尝试使用(255,0,0)作为红色字体。)

仅供参考-特定于以下项目:


我使用的字体是:我有点困惑。。。你有所有的代码。。。你试过运行它吗?发生了什么?我不知道这是否是正确的方法,我不能使用字体对象来处理内容过多;我需要使用BaseFont BaseFont和Font@JeffBridgman请参阅updateBut overContent.SetFontAndSize不以iTextSharp.text.Font作为参数,它需要BaseFontUse其
BaseFont
属性(Font.BaseFont)。我可以在开始时注册字体文件夹中的所有字体吗?某些基本字体在使用字体时返回Null。基本字体为什么会返回Null?可能是许可问题?并非所有字体都可嵌入。谢谢您的回答。。。我现在有点放弃了这个项目。不记得是什么问题。你的回答会帮助其他人:)