メインコンテンツまでスキップ

ドキュメント出力内容のカスタマイズ

プレビュー公開

本機能および本機能で利用する API は先行公開しているものです。 現時点で品質保証しておりませんので、ご利用される場合はユーザー様の責任でご利用ください。 また、これらの仕様は予告なく変更する場合がありますのでご了承ください。

概要

Next Design に標準搭載されている ドキュメント出力機能について下記のようなカスタマイズができます。

  • ドキュメント出力しない対象を指定できる。
  • ドキュメント中に任意の見出しやキャプションなどを追加できる。
  • ビューの出力順序を任意に変更できる。
  • モデルナビゲータのモデルの並び順と異なる順序で出力できる。

ドキュメント出力のカスタマイズ

IApplication.DocumentGeneratorCustomization.RegisterConfig()で設定オブジェクトであるDocumentGenerationConfigsを登録することにより挙動をカスタマイズできます。

ドキュメント出力をカスタマイズするには、下記2つの方法があります。

  • オプション設定
    • DocumentGenerationConfigsのオプション設定を変更することで、組み込みのドキュメント生成の挙動をカスタマイズできます。
  • コールバック処理
    • DocumentGenerationConfigsにコールバック処理を登録します。ドキュメント生成における様々なタイミングにコールバック処理を登録できるため、任意に出力結果をカスタマイズできます。
      • コンテンツ生成後のタイミングで、出力するコンテンツを追加、削除、変更できます。
      • コンテンツ書き込み前後のタイミングで、Word、Htmlの出力内容を制御できます。

オプション設定

DocumentGenerationConfigsの下記オプション設定を変更することで、ドキュメント生成の挙動をカスタマイズできます。

API名説明設定できる値対応対象
TemplateFilePath出力に利用するテンプレートのファイルパスを指定できます。任意のファイルのパスWordのみ
OrderByViewDefinitionビューの出力順をビュー定義順にするかを取得または設定します。true : ビュー定義の順に出力します。
false : ビュー定義の順とはせず、ダイアグラム・シーケンス図を先に出力します。
Wordのみ
AutoFitTablesテーブルの列幅を自動調整する方法を取得または設定します。nullの場合は、自動調整しません。AutoFitBehavior.AutoFitToContents : 列幅を文字列の幅に合わせます。
AutoFitBehavior.AutoFitToWindow : 列幅をウィンドウサイズに合わせます。
Wordのみ

実装例

// 例:オプション設定で出力挙動をカスタマイズします
public class DocumentExprotSample : IExtension
{
// エクステンション活性化時の処理です
public void Activate(IContext context)
{
// ドキュメント出力をカスタマイズします
var app = context.App;
app.DocumentGeneratorCustomization.RegisterConfig(this, context =>
{
// 設定オブジェクトを生成します
var config = new DocumentGenerationConfigs();

if (context.DocumentFormat == "word")
{
// Word出力の場合、`GetWordOptions()`でオプションを取得します
var option = config.GetWordOptions();

// 例:出力するWordのテンプレートファイルを指定します
var templateFilePath = Path.Combine("任意のパス", "CustomizeTemplate.dotx");
option.TemplateFilePath = templateFilePath;

// 例:出力されるビューの順を変更します
option.OrderByViewDefinition = false;

// 例:テーブルの列幅の自動調整を変更します
option.AutoFitTables = AutoFitBehavior.AutoFitToWindow;

}

return config;
});
}
}

コールバック処理

DocumentGenerationConfigsに下記で示すタイミングで実行されるコールバック処理を登録できます。

API名説明
RegisterGenerationStartドキュメント生成開始時に呼び出されます。
RegisterGenerationFinishドキュメント生成完了後に呼び出されます。
RegisterDocumentWriteStartドキュメントの書き込み開始時に呼び出されます。
RegisterDocumentWriteFinishドキュメントの書き込み終了時に呼び出されます。
RegisterBeforeContentWriteドキュメントのコンテンツの書き込み開始時に呼び出されます。
RegisterAfterContentWriteドキュメントのコンテンツの書き込み終了時に呼び出されます。
RegisterAfterContentsGenerationドキュメントの全コンテンツ生成後に呼び出されます。

実装例

IDocumentContentIPageContentをコールバックの引数として受け取りカスタマイズすることができます。

ドキュメント出力しない対象を指定

ビューやモデル、フィールドで出力したくない対象がある場合、出力対象から削除することができます。

// 例:任意のデータを表示するテーブル自体を削除します
private void RemoveTableContent(IPageContent content)
{
var targetPageContent = content.Pages.FirstOrDefault(_ => _.Title == "グリッドを持つページ");
var targetViewContent = targetPageContent.Views.FirstOrDefault(_ => _.Title == "詳細");
var targetTableContent = targetViewContent.Items.FirstOrDefault(_ => _.Control.Title == "ユースケース一覧");

// 例:"ユースケース一覧"テーブルを削除します
targetViewContent.Items.Remove(targetTableContent);
}

// 例:任意のフィールド値を表示するテーブルの列を削除します
private void RemoveTableColumnContent(IPageContent content)
{
var targetPageContent = content.Pages.FirstOrDefault(_ => _.Title == "グリッドを持つページ");
var targetViewContent = targetPageContent.Views.FirstOrDefault(_ => _.Title == "詳細");
var targetTableViewContent = targetViewContent.Items.FirstOrDefault(_ => _.Control.Title == "ユースケース一覧");
var targetTableContent = targetTableViewContent?.GetControl<ITableContent>();

// 任意のテーブルの列ヘッダを削除します(例では先頭の列を削除します)
targetTableContent.Headers.RemoveAt(0);

// 任意のテーブルのセルを削除します(例では先頭の列に対応するテーブルのセルを削除します)
foreach (var tableRow in targetTableViewContent.GetAllContents().OfType<ITableRowContent>())
{
tableRow.Cells.RemoveAt(0);
}
}

// 例:任意の要素に対応するテーブルの行を削除します
private void RemoveTableRowContent(IPageContent content)
{
var targetPageContent = content.Pages.FirstOrDefault(_ => _.Title == "グリッドを持つページ");
var targetViewContent = targetPageContent.Views.FirstOrDefault(_ => _.Title == "詳細");
var targetTableContent = targetViewContent.Items.FirstOrDefault(_ => _.Control.Title == "ユースケース一覧");

// テーブルの行を削除します(例では先頭の行を削除します)
targetTableContent.Items.RemoveAt(0);
}

ドキュメント中に任意の見出しやキャプションなどを追加

ページの任意に位置にテキストを挿入できるため、見出しや図番号・キャプションを追加することができます。

// 例:出力対象が図であれば、図の番号とキャプションを記載します
config.RegisterAfterContentWrite(p =>
{
if (p.DocumentContent.ContentType == DocumentContentTypes.Image)
{
var imageContent = (IImageContent)p.DocumentContent;

// Word出力の場合の処理です
// Word専用の書き込みオブジェクトを取得します
var imageNumber = 1;
var wordWriter = p.GetWriter<IWordWriter>();
if (wordWriter != null)
{
// Wordのテキストを中央揃えにし、図のキャプションを追加します
wordWriter.SetAlignment(ParagraphAlignment.Center);
wordWriter.WriteLine($"図{imageNumber}: {imageContent.Title}");
wordWriter.RestoreAlignment();
}

// HTML出力の場合の処理です
// HTML専用の書き込みオブジェクトを取得します
var htmlWriter = p.GetWriter<IHtmlWriter>();
if (htmlWriter != null)
{
// HTMLで中央揃えの図のキャプションを追加します
htmlWriter.WriteLine($"<p style=\"text-align: center;\">図{imageNumber}: {imageContent.Title}</p>");
htmlWriter.WriteLine("</div>");
}

imageNumber++;
}
});
// 例:ページのヘッダ・フッタ、任意の位置に文字列を追加します
config.RegisterBeforeContentWrite(p =>
{
// Word出力の場合の処理です
// Word専用の書き込みオブジェクトを取得します
var writer = p.GetWriter<IWordWriter>();
if (writer != null && p.DocumentContent.ContentType == DocumentContentTypes.Document)
{
// 任意の文字列を追加します
writer.WriteText("ページの説明");

// ヘッダに文字列を追加します
writer.MoveToHeader();
writer.WriteText("ヘッダに追記");

// ヘッダにページ数を追加します
writer.InsertField("PAGE");
writer.WriteText("/");
writer.InsertField("SECTIONPAGES");

// フッタに文字列を追加します
writer.MoveToFooter();
writer.WriteText("フッタに追記");

writer.MoveToDocumentEnd();
}

// HTML出力の場合の処理です
// HTML専用の書き込みオブジェクトを取得します
var htmlWriter = p.GetWriter<IHtmlWriter>();
if (htmlWriter != null && p.DocumentContent.ContentType == DocumentContentTypes.Image)
{
htmlWriter.WriteLine("<div style=\"display: inline-block;\">");
}
});

ビューの出力順序を任意に変更

ビューを任意の位置に変更し出力することができます。

// 例:ビューを任意の位置に移動します
private void MoveView(IPageContent content)
{
// 順序移動するビューを取得します
var targetContent = content.Pages.FirstOrDefault();
var moveContent = targetContent.Views.First();

// ビューを任意の位置に移動します(例では先頭に移動します)
targetContent.Views.Remove(moveContent);
targetContent.Views.Insert(0, moveContent);
}

モデルナビゲータのモデルの並び順と異なる順序で出力

モデルに対応するページを移動することで、出力順序を変更することができます。

// 例:ページを任意の位置に移動します
private void MovePage(IPageContent content)
{
// 移動する対象を取得します
var targetContent = content.Pages.FirstOrDefault();
var moveContent = targetContent.Pages.First();

// ページを任意の位置に移動します
targetContent.Pages.Remove(moveContent);
targetContent.Pages.Insert(4, moveContent);
}

サンプル

public class DocumentExprotSample : IExtension
{
// エクステンション活性化時の処理です
public void Activate(IContext context)
{
var app = context.App;
app.DocumentGeneratorCustomization.RegisterConfig(this, context =>
{
var config = new DocumentGenerationConfigs();

if (context.DocumentFormat == "word")
{
var option = config.GetWordOptions();

// 出力されるビューの順を変更します
option.OrderByViewDefinition = false;

// テーブルの列幅の自動調整を変更します
option.AutoFitTables = AutoFitBehavior.AutoFitToWindow;
}

config.RegisterDocumentWriteFinish(p =>
{
// Word用の書き込みオブジェクトを取得します
var writer = p.GetWriter<IWordWriter>();
if (writer != null)
{
// 改ページします
writer.InsertSectionBreakNewPage();

// ページの向きを指定します
writer.SetPageDirection(DocumentPageOrientation.Landscape);

// 箇条書きを追加します
writer.ListFormat.ApplyBulletDefault();
writer.WriteLine("箇条書き1");
writer.WriteLine("箇条書き2");
writer.ListFormat.RemoveNumbers();

// パラグラフを改行します
writer.InsertParagraphBreak();

// 表および行と列を生成します
writer.CreateTable();
writer.WriteCell("列1");
writer.WriteCell("列2", Color.AliceBlue, Color.Black, cellWidth: 50d);
writer.WriteCell("列3", Color.LightGreen, Color.Black, cellWidth: 100d);
writer.EndRow();
writer.RowFormat.Height = 50;
writer.WriteCell("<b>セル結合 高さ50</b>", Color.Transparent, Color.Red, 20d, true);
writer.Paragraph.LineSpacing = 20d;
writer.CellFormat.HorizontalMerge = CellMerge.First;
writer.WriteCell(string.Empty);
writer.CellFormat.HorizontalMerge = CellMerge.Previous;
writer.WriteCell(string.Empty);
writer.CellFormat.HorizontalMerge = CellMerge.Previous;
writer.EndRow();
writer.EndTable();

// 中央揃えの太字の文字列を挿入します
writer.Paragraph.Alignment = ParagraphAlignment.Center;
writer.Font.Bold = true;
writer.WriteLine("表");
writer.Paragraph.RestoreAlignment();
}
});

config.RegisterAfterContentWrite(p =>
{
// コンテンツが画像の場合、キャプションを追加します
if (p.DocumentContent.ContentType == DocumentContentTypes.Image)
{
var imageContent = (IImageContent)p.DocumentContent;
var imageNo = 1;
var wordWriter = p.GetWriter<IWordWriter>();
if (wordWriter != null)
{
// 黒文字で図のキャプションを挿入します
wordWriter.SetColor(Color.Black);
wordWriter.SetAlignment(ParagraphAlignment.Center);
wordWriter.WriteLine($"図{imageNo}: {imageContent.Title}");
wordWriter.RestoreAlignment();
wordWriter.RestoreColor();
}

imageNo++;
}
});

return config;
});
}

// エクステンション非活性化時の処理です
public void Deactivate(IContext context)
{
// ドキュメント出力のカスタマイズ設定の登録を解除します
var app = context.App;
app.DocumentGeneratorCustomization.UnregisterConfig(this);
}
}