概要
多くの文書形式はフォントと密接に結びついています。たとえば、ユーザーが DOCX 文書にテキストを追加すると、そのテキストには必ず定義されたフォントが設定されます。PDF のようにフォントデータが文書ファイル自体に埋め込まれて保存される形式もありますが、Office 系列の形式のように、通常は OS にインストールされたフォントに依存します。
フォント形式も数多くあります。たとえば、インストールされているフォントの大半は TTF (TrueType) や OTF (OpenType) 形式で提供されています。Office Open XML 文書は EOT (Embedded OpenType) 形式も扱えます。Web では主に WOFF と WOFF2 が最も使用される形式です。
目次
使用されているすべてのフォントを取得する
フォントに関して最も便利な機能は、フォントを列挙して取得できることです。GroupDocs.Viewer は特別なメソッド GetAllFonts() を提供しています。文書を Viewer クラスのインスタンスにロードしたら、このメソッドを呼び出すことで、文書で使用されているすべてのフォントの一覧を取得できます。返される一覧の各フォントは、IFontInfo インターフェイスを実装した型のインスタンスとして表されます。このインターフェイスには、フォントファミリ名、スタイル、形式、バイナリコンテンツといった、あらゆるフォントに共通するプロパティが含まれます。
WordProcessing、Spreadsheet、Presentation、PDF といった特定のフォーマット群は、IFontInfo の専門実装を持ちます。これらの実装は、フォーマット固有の追加データを提供します。たとえば、WordProcessingFontInfo、PresentationFontInfo、PdfFontInfo には IsEmbedded ブールプロパティがあり、フォントが文書本体に埋め込まれているか OS にインストールされているかを示します。SpreadsheetFontInfo には色や下線、取り消し線といったスプレッドシート固有の情報が含まれます。WordProcessingFontInfo には代替ファミリ名が含まれることもあります。
簡単な例は次のとおりです。
using GroupDocs.Viewer;
// ...
const string filename = "sample.docx";
string inputPath = "\full\path\" + filename;
using (Viewer viewer = new Viewer(inputPath))
{
Fonts.IFontInfo[] allFonts = viewer.GetAllFonts();
Console.WriteLine("{0} fonts found in the '{1}' document", allFonts.Length, filename);
foreach (Fonts.IFontInfo font in allFonts)
{
Console.WriteLine("Font '{0}' of '{1}' style has {2} bytes and is of '{3}' format",
font.FamilyName,
font.Style,
font.Content.Length,
font.Format);
}
}
フォント抽出は WordProcessing、Spreadsheet、Presentation、PDF の各ファミリ形式でのみサポートされており、その他の文書形式に対しては GetAllFonts() メソッドは空の配列を返します。
欠損フォントの処理
ある文書が 作成者のマシン で作成され、フォント「AAA」を使用していたが、クライアントのマシン で GroupDocs.Viewer が処理する際にそのフォント「AAA」が存在しない、という状況は典型的です。このような場合、GroupDocs.Viewer は複雑なフォント置換ルールを用いて そのフォントを代替 しようとします。具体的には、文書メタデータ、欠損フォントの代替名、文書設定、OS 設定、OS にインストールされている利用可能なフォント一覧などを解析します。最終的に OS が「クリーン」―つまりフォントがまったくインストールされていない―場合、GroupDocs.Viewer は組み込み DLL に含まれるフォントで欠損フォントを置換します。このフォントは、他に利用可能なフォントが存在しないときの「最終手段」として機能します。たとえば、WordProcessing 系列のフォーマットでは、内部で無料フォント「Fanwood」を保持しています。
現在、GroupDocs.Viewer はドキュメントの レンダリング中に(Viewer.View() が呼び出されたとき)フォント置換 を「黙って」実行します。置換が発生したことや、どのフォントが欠損していたか、何に置き換えられたか、といったメッセージやイベントは提供されません。この機能は、通知の形式やタイミングが曖昧であり、クライアント側での活用方法が不明確なため、実装が難しいとされています。
しかしながら、GroupDocs.Viewer は次の 2 つの方法でこの状況に対処できるようにしています。
- 欠損フォントを 手動で指定 する。
- 欠損フォントを 手動で置換 する。
欠損フォントの指定
ユーザーが「この文書はフォント『AAA』を使用しているが、対象マシンにインストールされていない」ことを事前に把握しており、かつフォント『AAA』のバイナリコンテンツを所有している場合、Viewer.View() を呼び出す 前に そのフォントを指定できます。
ターゲット OS にインストールされていないカスタムフォントを指定するには、フォントソース を追加します。フォントソース とはフォントが格納されたフォルダーのことで、FolderFontSource クラスで表現されます。[FontSettings](https://reference.groupdocs.com/viewer/net/groupdocs.viewer.fonts/fontsettings/) クラスのメソッド SetFontSources() を使って、フォントソースを GroupDocs.Viewer に登録します。
以下のコードスニペットはその手順を示しています。たとえば、sample.docx が対象 OS にインストールされていない稀少フォント「AAA.ttf」を使用しているとします。このとき、"C:\custom_fonts" フォルダーに「AAA.ttf」を配置し、FolderFontSource インスタンスを作成して FontSettings に渡します。その後、sample.docx を HTML にレンダリングすると、出力 HTML 文書で「AAA」フォントが使用されます。
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
using GroupDocs.Viewer.Fonts;
// ...
// フォントソースを指定する。
FolderFontSource fontSource =
new FolderFontSource(@"C:\custom_fonts", SearchOption.TopFolderOnly);
FontSettings.SetFontSources(fontSource);
using (Viewer viewer = new Viewer("sample.docx"))
{
// HTML ファイルを作成。
HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewer.View(viewOptions);
}
欠損フォントの置き換え
ユーザーが「この文書はフォント『AAA』を使用しているが、対象マシンにインストールされていない」ことは分かっているが、フォント『AAA』のバイナリにアクセスできない場合、代わりに別のフォント『BBB』を 欠損フォントの代わりに使用 させることができます。この場合はビューオプションにフォント名を設定し、Viewer.View() に渡します。
このオプションは [DefaultFontName] と呼ばれ、文字列型のプロパティです。抽象クラス BaseViewOptions に宣言されているため、すべてのレンダリングオプション(HtmlViewOptions、PdfViewOptions、PngViewOptions、JpgViewOptions)で共通です。
このプロパティを設定すると、GroupDocs.Viewer は利用できないフォントの代わりに指定したフォントでレンダリングします。たとえば、文書に非英語文字を含むフォントがある場合、同じ文字セットを持つフォントをデフォルトとして指定すれば、欠損フォントが自動的に置き換えられます。もちろん、DefaultFontName に指定したフォントは、レンダリングが行われる OS にインストールされている必要があります。
以下のコードスニペットはデフォルトフォント名の設定例です。
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("sample.pptx"))
{
// 埋め込みリソース付きの HTML ドキュメント用オプションを作成
HtmlViewOptions viewOptions = HtmlViewOptions.ForEmbeddedResources();
// オプションにデフォルトフォント名を指定
viewOptions.DefaultFontName = "Courier New";
// 入力 PPTX を出力 HTML にレンダリング
viewer.View(viewOptions);
}
HTML 用フォントの除外
文書を HTML 形式でレンダリングする際、GroupDocs.Viewer はデフォルトで使用されたすべてのフォントを HTML にエクスポートします。これにより、閲覧側デバイスにフォントが存在しない場合でも正しく表示できます。フォントは外部リソースとして保存(HtmlViewOptions.ForExternalResources)することも、データ URI スキーム と Base64 エンコード を用いて HTML マークアップに直接埋め込むことも可能です(HtmlViewOptions.ForEmbeddedResources)。フォントの HTML へのエクスポートは、フォント機能をサポートしているほとんどの文書形式(Microsoft Office(Excel 除く)、OpenDocument、メール、PDF、電子書籍等)で利用できます。
しかしながら、この機能が不要になるケースもあります。フォントが埋め込まれると、生成された HTML のサイズが大幅に増大するためです。対象マシンやデバイスにすでにすべての使用フォントがインストールされている場合は、ブラウザがシステムフォントを使用できれば、フォントを埋め込む必要はありません。
このような要件に応えるため、GroupDocs.Viewer では フォントを除外 できる機能が用意されています。除外の方法は すべてのフォントを除外 するか、 特定のフォントのみ除外 するかの 2 通りです。
これらは HtmlViewOptions クラスの次のプロパティで制御します。
ExcludeFontsは、すべての使用フォントのエクスポートを無効にするフラグです。trueに設定するとフォントは HTML に含まれません(既定はfalse)。FontsToExcludeは除外したいフォント名の文字列リストです。デフォルトは空リストで、除外は行われません。このオプションはExcludeFontsがfalseのときにのみ機能します。
以下の 2 つのコードスニペットは、それぞれの方法を示しています。最初は ExcludeFonts を使用し、2 番目は FontsToExclude を使用します。
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("sample.docx"))
{
// HTML ファイルを作成。
var viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewOptions.ExcludeFonts = true;
viewer.View(viewOptions);
}
using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...
using (Viewer viewer = new Viewer("presentation.pptx"))
{
// HTML ファイルを作成。
var viewOptions = HtmlViewOptions.ForEmbeddedResources();
viewOptions.FontsToExclude.Add("Times New Roman"); // Times New Roman を除外
viewOptions.FontsToExclude.Add("Arial"); // Arial を除外
viewer.View(viewOptions);
}
結論
GroupDocs.Viewer は、さまざまなフォーマットの文書を広く利用されている「閲覧可能」な形式(HTML、PDF、JPEG、PNG)へ変換することに主眼を置いています。最近はフォント処理に関する機能を強化し、使用フォントの取得・確認、エクスポート調整、フォント置換の設定といった操作が可能になりました。
関連項目
無料トライアルを入手する
GroupDocs.Viewer for .NET の無料体験版は、releases.groupdocs.com からダウンロードできます。また、こちら から一時ライセンスを取得すれば、機能制限なしで全機能を試すことができます。