Search

2019/03/18

PDFSharp1.5で日本語を使うときはTTFファイルを指定する:FontResolver

.NETでPDFを出力するライブラリ。
探してもほとんどみつからない。
PDFSharp、または、iTextSharp-LGPL 。
※PDFSharpはMITライセンス。
※iTextSharp 5はAGPLなのでライセンス的に使いづらいかも。


PDFSharpの日本語フォントの参考情報はこちら。

C#で日本語をPDFに出力する(PDFSharpを利用)
PDFSharp MigraDoc を使ってC#でPDF生成
FontResolverで指定すれば日本語フォントも使えるが、
改行がうまくいかないらしい。
TTFファイルを埋め込みリソースとして使うとき。
Embedded resourceみたいな指定でやる。


PDFSharpはGDIなのでサーバーではあまり良くないっぽい。
.NETの日本語対応のPDF出力ライブラリは有料を使うしかないかも。
簡単なのはPDFSharpで対応。


直接にTTFフォントのファイルパスを指定するのも可能。
C#で書いたコードを無くしたので、メモを書いておく。
改行が正しくいけばいいのにと思う。
Loading a Font with PdfSharp .Net Standard preview from Xamarin.Forms fails: No appropriate font found


参照サイトのをそのままでコピペして少し変更。
呼び出し元でFontResolver を呼び出す。
PdfSharp.Fonts.GlobalFontSettings.FontResolver = new FileFontResolver ();

この行でデフォルトのフォントを設定しない。
public string DefaultFontName => throw new NotImplementedException();

代わりに下記のreturnでデフォルトのフォントを指定する。
return PlatformFontResolver.ResolveTypeface("Arial", isBold, isItalic);

この箇所でフォントファイルのフルパスを入れる。
return new FontResolverInfo("Fonts/Verdana-BoldItalic.ttf");


public class FileFontResolver : IFontResolver // FontResolverBase
{
    //public string DefaultFontName => throw new NotImplementedException();

    public byte[] GetFont(string faceName)
    {
        using (var ms = new MemoryStream())
        {
            using (var fs = File.Open(faceName, FileMode.Open))
            {
                fs.CopyTo(ms);
                ms.Position = 0;
                return ms.ToArray();
            }
        }
    }

    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
    {
        if (familyName.Equals("Verdana", StringComparison.CurrentCultureIgnoreCase))
        {
            if (isBold && isItalic)
            {
                return new FontResolverInfo("Fonts/Verdana-BoldItalic.ttf");
            }
            else if (isBold)
            {
                return new FontResolverInfo("Fonts/Verdana-Bold.ttf");
            }
            else if (isItalic)
            {
                return new FontResolverInfo("Fonts/Verdana-Italic.ttf");
            }
            else
            {
                return new FontResolverInfo("Fonts/Verdana-Regular.ttf");
            }
        }
        //return null;
        return PlatformFontResolver.ResolveTypeface("Arial", isBold, isItalic);
    }
}


雑文ですみません。雑記的なブログです。

0 件のコメント:

コメントを投稿