web-dev-qa-db-ja.com

iTextSharpを使用したシステムでのフォントの使用

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で認識されません。

12
techno

最初に、フォントを登録し、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); 
}
19
VahidN

私はここでこの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では、フォントのプロパティシートからフォントのファイル名を確認できます。

enter image description here

また、[詳細]タブでフォントの正確な名前を使用する必要があることもわかりました。

enter image description here

10
Matthew Lock

他の誰かがこれを役に立つと思うかもしれないので、これを投稿します。サーバーでコードを実行すると、同様の問題が発生しました。 itextsharpがOSでフォントスタイルを見つけられなかった理由。私のPDFは、フォントが見つからないときにランダムなフォントスタイルを示しました(dint throwエラー)。必要なフォントファイル(.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

このバリエーションが誰かを助ける場合。これはVahidNの回答のバリエーションです。

このソリューションでは、(少なくともファイルシステムでは)Visual Studioのfontsフォルダー内のフォントを使用できます。これは、より自己完結型の(そして潜在的にはより「移植性のある」)Visual Studioプロジェクトになります。したがって、Windowsオペレーティングシステムでフォントフォルダーを検索するのではなく、Windowsが次に新しいオペレーティングシステムを開発するときに変更される可能性があります。フォントはすべてプロジェクトに含まれています。

特定のプロジェクトで「BaseFont.EMBEDDED」がtrueになる必要があることに注意してください。これは通常、すべてのプロジェクトに必要なわけではありません(このページの他の回答を参照してください)。プロジェクトの必要に応じて、「FontFactory.GetFont()」の引数を変更してください。利用可能な多くのオーバーロードがあります。

補足:Windowsファイルシステムのフォントフォルダーは変更しないでください。しかし、次のバージョンのWindowsでも同じ場所にとどまることは保証されていますか?さらに、ハードドライブがクラッシュしたためにプロジェクトを新しいコンピューターにロードし、プロジェクトのバックアップを使用している場合、Windowsファイルシステムのfontsフォルダーに必要なフォントはありますか?もしそうなら、素晴らしい。そうでない場合は、それを取得する必要があります。通常大したことはありません。しかし、このソリューションを介してフォントをプロジェクトに永続的に関連付けていた場合は、面倒が1つ少なくなります。

コードの主な変更点は次のとおりです。

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

このバリエーションでは、上記の「新しいBaseColor(0、0、0)」を使用して、希望する色に変更することもできます。 (必要に応じて、赤いフォントの(255,0,0)を試してください。)

FYI-fontawesomeに固有

私はフォントの素晴らしいチートシートコードを使用しています: https://fontawesome.com/v4.7.0/cheatsheet/

1
Michael M.