[]
PDF ドキュメントを使用する際は、さまざまなフォントをサポートするライブラリが必要です。DioDocs for PDF では、次のフォントタイプがサポートされています。
OpenType
TrueType
WOFF
また、DioDocs for PDFライブラリにはPDF標準のフォントが組み込まれており、上記のフォントを用意しなくても使用することができます。詳細は「PDF標準フォントの使用」をご確認ください。
外部のフォントファイルを使用し、期待通りのPDF出力結果を得るためには、ドキュメントで利用しているフォントに物理的にアクセスできる状態にすることが重要です。例えば、ドキュメントで利用しているフォントにアクセスできない、そもそも利用中のフォントがシステムに存在しない、などの場合には、期待通りの出力結果とならなくなる恐れがあります。
外部のフォントファイルを使用するには2種類の方法があります。 1つはシステムにフォントをインストールする方法、もう1つはフォントファイルを任意のフォルダに格納し、そのファイルパスをDioDocs for PDFライブラリに登録する方法です。後者は、必要なフォントを追加でインストールすることが難しいサーバーレスやPaaSなどのクラウド環境の場合に特に有効です。
<フォントファイルへのパスをGcPDFに登録する方法>
PDF ファイルの作成中に、標準フォント以外のフォントを使用したい場合があります。それには、通常、C:\Windows\Fonts ディレクトリからフォントを追加する必要があります。異なるフォントを使用するたびにディレクトリ全体を登録すると、管理が困難になり、時間もかかります。DioDocs for PDF ライブラリには、この問題を解決する FontCollection クラスが用意されています。このクラスを使用すると、グローバルなフォント管理サービスがアプリケーションに追加されます。FontCollection クラスは、さまざまなプログラムモジュールにフォント関連のサービスを提供します。RegisterFont メソッドまたは RegisterDirectory メソッドを使用して、FontCollection にフォントを登録できます。これらのメソッドは、ディスクファイルを登録しますが、実際のフォントをメモリにロードしません。フォントは必要時にのみロードされるため、容量を節約でき、パフォーマンスが向上します。
DioDocs for PDFには、PDF 仕様 1.7(セクション 9.6.2)に記載されている 14 個の標準フォントが組み込まれています。これらの標準フォントを使用するには、StandardFonts 列挙型メンバを使用して、標準フォントのいずれかを指定します。なお、日本語をレンダリングするには、外部のフォントファイルを使用する必要があります。
public void CreatePDF(Stream stream)
{
var doc = new GcPdfDocument();
var page = doc.NewPage();
var g = page.Graphics;
var textFormat = new TextFormat()
{
Font = StandardFonts.HelveticaBold,
FontSize = 14
};
// フォント使用してテキストをレンダリングします
g.DrawString("1. サンプル文字列", textFormat, new PointF(72, 72));
// ドキュメントを保存します
doc.Save(stream);
}外部のフォントファイルを使用してフォントを適用するには
Font.FromFile メソッドを使用して、フォントファイルから新しいフォントを作成します。
フォント(たとえば、Gabriola)を使用して、DrawString メソッドでテキストをレンダリングします。
public void CreatePDF(Stream stream)
{
GrapeCity.Documents.Text.Font gabriola =
GrapeCity.Documents.Text.Font.FromFile
(Path.Combine("Resources", "Fonts", "Gabriola.ttf"));
// フォント使用してテキストをレンダリングします
TextFormat tf = new TextFormat()
{
Font = gabriola,
FontSize = 16
};
GcPdfDocument doc = new GcPdfDocument();
GcPdfGraphics g = doc.NewPage().Graphics;
g.DrawString("フォント{gabriola.FontFamilyName}を使用してレンダリングされているサンプルテキスト。",
tf, new PointF(72, 72));
// ドキュメントを保存します
doc.Save(stream);
}PDF ファイルにフォントを埋め込むには、GcPdfDocument クラスの FontEmbedMode プロパティを使用します。デフォルトでは、ドキュメントで使用されているグリフのみを含むフォントサブセットが埋め込まれます。ただし、FontEmbedMode 列挙を使用してこの設定を変更し、フォント全体を埋め込むこともできます。この場合、ファイルのサイズは非常に大きくなります。
// GcPdfDocumentオブジェクトを使用してFontEmbedModeを設定します
doc.FontEmbedMode = FontEmbedMode.EmbedFullFont;FontCollection を使用するには
FontCollection クラスのインスタンスを作成します。
RegisterFont メソッドを使用して、特定のファイルからフォントを登録します。また、RegisterDirectory メソッドを使用して、フォントが入った 1 つ以上のディレクトリを登録することもできます。
フォントコレクションインスタンスを GcGraphics.FontCollection プロパティに割り当てます。
DrawString メソッドを使用してテキストをレンダリングし、フォントコレクションに保存されているフォントの名前を指定します。
public void CreatePDF(Stream stream)
{
// FontCollection のインスタンスを作成します
FontCollection fc = new FontCollection();
// RegisterFontメソッドを使用してフォントファイルを取得します
fc.RegisterFont(Path.Combine("Resources", "Fonts", "georgia.ttf"));
// フォントを提供するために、フォントコレクションを使用してサンプルドキュメントを生成します
var doc = new GcPdfDocument();
var page = doc.Pages.Add();
var g = page.Graphics;
// フォントコレクション内の指定されたフォントを見つけることができるように、
// TextLayoutをGcGraphicsによって内部的に作成されることを許可します
g.FontCollection = fc;
// FontCollectionが一度設定したら、GcGraphics.DrawStringを使用して、
// フォントコレクションがグラフィックスでも使用されることを示します。
g.DrawString("Georgia bold フォント、GcGraphics.DrawString()メソッドによって描画されているテキスト。",
new TextFormat() { FontName = "georgia", FontSize = 10 },
new PointF(72, 72 * 4));
// ドキュメントを保存します
doc.Save(stream);
}フォールバックフォントを使用するには
GcPdfDocument クラスのインスタンスを作成します。
GetFallbackFontFamilies メソッドを使用して、フォールバックフォントファミリのリストを取得します。
AppendFallbackFontFamilies メソッドを使用して、フォールバックフォントファミリのリストをグローバルな SystemFonts に追加します。
AppendFallbackFonts メソッドを使用して、日本語のグリフを含むフォールバックファイルをロードします。
DrawString メソッドを使用して、日本語のテキストをレンダリングします。
public void CreatePDF(Stream stream)
{
// GcPdfDocumentを設定します
GcPdfDocument doc = new GcPdfDocument();
GcPdfGraphics g = doc.NewPage().Graphics;
// テキスト行をレンダリングするためのヘルパー変数を設定します
const float margin = 36;
PointF ip = new PointF(margin, margin);
// 標準フォントのいずれかを使用してテキスト形式を初期化します。標準フォントは最小限で、
// ラテン文字以外の文字にはほとんどグリフが含まれていません
TextFormat tf = new TextFormat() { Font = StandardFonts.Courier, FontSize = 14 };
// フォールバックフォントファミリのリストを取得します
string[] fallbacks = FontCollection.SystemFonts.GetFallbackFontFamilies();
// グローバルなSystemFontsにフォールバックフォントファミリの元のリストを追加します
FontCollection.SystemFonts.AppendFallbackFontFamilies(fallbacks);
// 一部のシステムでは、デフォルトのシステムフォールバック内で日本語のグリフが提供されない場合があるため、
// 独自のフォールバックを追加します
Font arialuni = Font.FromFile(Path.Combine("Resources", "Fonts", "ARIALUNI.TTF"));
FontCollection.SystemFonts.AppendFallbackFonts(arialuni);
// フォールバックフォントが利用できるようになると、
// 適切なフォールバックが見つかったため、日本語のテキストが正しくレンダリングされます
g.DrawString("フォールバックが利用可能なサンプルテキスト: 日本語が話せますか。", tf, ip);
ip.Y += 36;
// ドキュメントを保存します
doc.Save(stream);
}PDFドキュメントに含まれるすべてのフォントとその重要なプロパティを一覧表示するには、次のサンプルコードを使用します。このサンプルコードは、PDFドキュメントを一時ドキュメントにロードしてすべてのフォントを一覧で取得し、各フォントから Font オブジェクトを作成して、操作が成功するかどうかを確認します。
//任意のPDFを開き、一時ドキュメントにロードし、すべてのフォントを取得します
using (var fs = new FileStream(Path.Combine("Resources", "PDFs", "Test.pdf"),
FileMode.Open, FileAccess.Read))
{
var doc1 = new GcPdfDocument();
doc1.Load(fs);
var fonts = doc1.GetFonts();
tl.AppendLine($"{sourcePDF}で見つかった{fonts.Count}フォントの合計:");
tl.AppendLine();
int i = 0;
foreach (var font in fonts)
{
var nativeFont = font.CreateNativeFont();
tl.Append($"{i}:\tBaseFont: {font.BaseFont}; IsEmbedded: {font.IsEmbedded}.");
tl.AppendParagraphBreak();
if (nativeFont != null)
tl.AppendLine($"\tCreateNativeFont が成功した、ファミリ: {nativeFont.FontFamilyName};" +
$" bold: {nativeFont.FontBold}; italic: {nativeFont.FontItalic}.");
else
tl.AppendLine("\tCreateNativeFont が失敗しました。");
tl.AppendLine();
++i;
}
tl.PerformLayout(true);DioDocs for PDF ライブラリでは、多言語文字に使用できるさまざまなフォントがサポートされているため、PDF をさまざまな言語で書き込むことができます。また、フォント機能のほかに、ユーザー定義文字(End-User Defined Character:EUDC)、サロゲート、合字、Unicode 文字などの特殊文字もサポートされています。
DioDocs for PDF を使用したフォント機能の実装の詳細については、DioDocs for PDF サンプルブラウザを参照してください。