コンテンツ コントロール SDT の使用

Microsoft Word では、テンプレートから始めて、チェックボックス、テキスト ボックス、日付ピッカー、ドロップダウン リストなどのコンテンツ コントロールを追加することでフォームを作成できます。 Aspose.Words では、Aspose.Words にロードされたドキュメントの構造化ドキュメント タグまたはコンテンツ コントロールが StructuredDocumentTag ノードとしてインポートされます。構造化ドキュメント タグ (SDT またはコンテンツ コントロール) を使用すると、顧客定義のセマンティクスとその動作および外観をドキュメントに埋め込むことができます。

StructuredDocumentTag は、ドキュメント内の次の場所に使用できます。

  • ブロックレベル – 段落と表の間で、Body、HeaderFooter、Comment、Footnote、または Shape ノードの子として
  • 行レベル – テーブル内の行の間で、テーブル ノードの子として
  • セルレベル – テーブル行内のセルのうち、行ノードの子として
  • インラインレベル – 内部のインラインコンテンツの中で、段落の子として
  • 別の StructuredDocumentTag 内にネストされています

ドキュメントへのコンテンツ コントロールの挿入

このバージョンの Aspose.Words では、次のタイプの SDT またはコンテンツ コントロールを作成できます。

  • Checkbox
  • DropDownList
  • ComboBox
  • Date
  • BuildingBlockGallery
  • Group
  • Picture
  • RichText
  • PlainText

次のコード例は、チェックボックス タイプのコンテンツ コントロールを作成する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
// Open the empty document
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
StructuredDocumentTag SdtCheckBox = new StructuredDocumentTag(doc, SdtType.Checkbox, MarkupLevel.Inline);
// Insert content control into the document
builder.InsertNode(SdtCheckBox);
dataDir = dataDir + "CheckBoxTypeContentControl_out.docx";
doc.Save(dataDir, SaveFormat.Docx);

次のコード例は、リッチ テキスト ボックス タイプのコンテンツ コントロールを作成する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
Document doc = new Document();
StructuredDocumentTag sdtRichText = new StructuredDocumentTag(doc, SdtType.RichText, MarkupLevel.Block);
Paragraph para = new Paragraph(doc);
Run run = new Run(doc);
run.Text = "Hello World";
run.Font.Color = Color.Green;
para.Runs.Add(run);
sdtRichText.ChildNodes.Add(para);
doc.FirstSection.Body.AppendChild(sdtRichText);
dataDir = dataDir + "RichTextBoxContentControl_out.docx";
doc.Save(dataDir);

次のコード例は、タイプ コンボ ボックスのコンテンツ コントロールを作成する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
Document doc = new Document();
StructuredDocumentTag sdt = new StructuredDocumentTag(doc, SdtType.ComboBox, MarkupLevel.Block);
sdt.ListItems.Add(new SdtListItem("Choose an item", "-1"));
sdt.ListItems.Add(new SdtListItem("Item 1", "1"));
sdt.ListItems.Add(new SdtListItem("Item 2", "2"));
doc.FirstSection.Body.AppendChild(sdt);
dataDir = dataDir + "ComboBoxContentControl_out.docx";
doc.Save(dataDir);

コンテンツ コントロールを更新する方法

このセクションでは、SDT またはコンテンツ コントロールの値をプログラムで更新する方法について説明します。

次のコード例は、チェックボックスの現在の状態を設定する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// Open an existing document
Document doc = new Document(dataDir + "CheckBoxTypeContentControl.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
// Get the first content control from the document
StructuredDocumentTag SdtCheckBox = (StructuredDocumentTag)doc.GetChild(NodeType.StructuredDocumentTag, 0, true);
// StructuredDocumentTag.Checked property gets/sets current state of the Checkbox SDT
if (SdtCheckBox.SdtType == SdtType.Checkbox)
SdtCheckBox.Checked = true;
dataDir = dataDir + "SetCurrentStateOfCheckBox_out.docx";
doc.Save(dataDir);

次のコード例は、プレーン テキスト ボックス、ドロップダウン リスト、および画像タイプのコンテンツ コントロールを変更する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
// Open an existing document
Document doc = new Document(dataDir + "CheckBoxTypeContentControl.docx");
foreach (StructuredDocumentTag sdt in doc.GetChildNodes(NodeType.StructuredDocumentTag, true))
{
if (sdt.SdtType == SdtType.PlainText)
{
sdt.RemoveAllChildren();
Paragraph para = sdt.AppendChild(new Paragraph(doc)) as Paragraph;
Run run = new Run(doc, "new text goes here");
para.AppendChild(run);
}
else if (sdt.SdtType == SdtType.DropDownList)
{
SdtListItem secondItem = sdt.ListItems[2];
sdt.ListItems.SelectedValue = secondItem;
}
else if (sdt.SdtType == SdtType.Picture)
{
Shape shape = (Shape)sdt.GetChild(NodeType.Shape, 0, true);
if (shape.HasImage)
{
shape.ImageData.SetImage(dataDir + "Watermark.png");
}
}
}
dataDir = dataDir + "ModifyContentControls_out.docx";
doc.Save(dataDir);

コンテンツ コントロールをカスタム XML パーツにバインドする

Word 文書内の XML データ (カスタム XML 部分) にコンテンツ コントロールをバインドできます。

次のコード例は、コンテンツ コントロールをカスタム XML 部分にバインドする方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
CustomXmlPart xmlPart = doc.CustomXmlParts.Add(Guid.NewGuid().ToString("B"), "<root><text>Hello, World!</text></root>");
StructuredDocumentTag sdt = new StructuredDocumentTag(doc, SdtType.PlainText, MarkupLevel.Block);
doc.FirstSection.Body.AppendChild(sdt);
sdt.XmlMapping.SetMapping(xmlPart, "/root[1]/text[1]", "");
dataDir = dataDir + "BindSDTtoCustomXmlPart_out.doc";
// Save the document to disk.
doc.Save(dataDir);

構造化文書タグ範囲の XML マッピング

StructuredDocumentTagRangeStart.XmlMapping プロパティ を使用すると、この構造化ドキュメントのタグ範囲と現在のドキュメントのカスタム XML 部分の XML データとのマッピングを取得できます。ただし、SetMapping メソッドを使用して、構造化文書のタグ範囲を XML データにマップすることはできます。

次のコード例は、XML マッピングを設定する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "input.docx");
StructuredDocumentTagRangeStart sdtRangeStart = (StructuredDocumentTagRangeStart)doc.GetChild(NodeType.StructuredDocumentTagRangeStart, 0, true);
sdtRangeStart.XmlMapping.SetMapping(doc.CustomXmlParts[0], "/Root/Element", null);
doc.Save(dataDir + "output.docx");

コンテンツ コントロールのコンテンツをクリアする

プレースホルダーを表示すると、コンテンツ コントロールのコンテンツをクリアできます。 StructuredDocumentTag.Clear メソッドは、この構造化文書タグの内容をクリアし、プレースホルダーが定義されている場合はそれを表示します。ただし、コンテンツ コントロールにリビジョンがある場合、コンテンツ コントロールの内容をクリアすることはできません。コンテンツ コントロールにプレースホルダーがない場合は、Microsoft Word と同様に 5 つのスペースが挿入されます (繰り返しセクション、繰り返しセクション項目、グループ、チェックボックス、引用を除く)。コンテンツ コントロールがカスタム XML にマップされている場合、参照された XML ノードはクリアされます。

次のコード例は、コンテンツ コントロールのコンテンツをクリアする方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "input.docx");
StructuredDocumentTag sdt = (StructuredDocumentTag)doc.GetChild(NodeType.StructuredDocumentTag, 0, true);
sdt.Clear();
dataDir = dataDir + "ClearContentsControl_out.doc";
// Save the document to disk.
doc.Save(dataDir);

コンテンツ コントロールの背景と境界線の色の変更

StructuredDocumentTag.Color プロパティを使用すると、コンテンツ コントロールの色を取得または設定できます。色は、次の 2 つの状況でコンテンツ コントロールに影響します。

  1. MS Word は、マウスをコンテンツ コントロール上に移動すると、コンテンツ コントロールの背景を強調表示します。これは、コンテンツ コントロールを識別するのに役立ちます。ハイライトの色はColorよりも少し「柔らかい」です。たとえば、Color が赤の場合、MS Word は背景をピンク色で強調表示します。
  2. コンテンツ コントロールを操作 (編集、選択など) すると、コンテンツ コントロールの境界線が Color で色付けされます。

次のコード例は、コンテンツ コントロールの色を変更する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "input.docx");
StructuredDocumentTag sdt = (StructuredDocumentTag)doc.GetChild(NodeType.StructuredDocumentTag, 0, true);
sdt.Color = Color.Red;
dataDir = dataDir + "SetContentControlColor_out.docx";
// Save the document to disk.
doc.Save(dataDir);

スタイルを設定してコンテンツ コントロールに入力されたテキストの書式を設定する方法

コンテンツ コントロールのスタイルを設定する場合は、StructuredDocumentTag.Style または StructuredDocumentTag.StyleName プロパティを使用できます。出力ドキュメントのコンテンツ コントロールにテキストを入力すると、入力されたテキストのスタイルは「引用」になります。

次のコード例は、コンテンツ コントロールのスタイルを設定する方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "input.docx");
StructuredDocumentTag sdt = (StructuredDocumentTag)doc.GetChild(NodeType.StructuredDocumentTag, 0, true);
Style style = doc.Styles[StyleIdentifier.Quote];
sdt.Style = style;
dataDir = dataDir + "SetContentControlStyle_out.docx";
// Save the document to disk.
doc.Save(dataDir);

繰り返しセクションのコンテンツ コントロールの操作

繰り返しセクションのコンテンツ コントロールを使用すると、その中に含まれるコンテンツを繰り返すことができます。 Aspose.Words を使用すると、繰り返しセクションと繰り返しセクション項目タイプの構造化文書タグ ノードを作成できます。この目的のために、SdtType 列挙型RepeatingSectionItem プロパティを提供します。

次のコード例は、繰り返しセクションのコンテンツ コントロールをテーブルにバインドする方法を示しています。

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
CustomXmlPart xmlPart = doc.CustomXmlParts.Add("Books",
"<books><book><title>Everyday Italian</title><author>Giada De Laurentiis</author></book>" +
"<book><title>Harry Potter</title><author>J K. Rowling</author></book>" +
"<book><title>Learning XML</title><author>Erik T. Ray</author></book></books>");
Table table = builder.StartTable();
builder.InsertCell();
builder.Write("Title");
builder.InsertCell();
builder.Write("Author");
builder.EndRow();
builder.EndTable();
StructuredDocumentTag repeatingSectionSdt =
new StructuredDocumentTag(doc, SdtType.RepeatingSection, MarkupLevel.Row);
repeatingSectionSdt.XmlMapping.SetMapping(xmlPart, "/books[1]/book", "");
table.AppendChild(repeatingSectionSdt);
StructuredDocumentTag repeatingSectionItemSdt =
new StructuredDocumentTag(doc, SdtType.RepeatingSectionItem, MarkupLevel.Row);
repeatingSectionSdt.AppendChild(repeatingSectionItemSdt);
Row row = new Row(doc);
repeatingSectionItemSdt.AppendChild(row);
StructuredDocumentTag titleSdt =
new StructuredDocumentTag(doc, SdtType.PlainText, MarkupLevel.Cell);
titleSdt.XmlMapping.SetMapping(xmlPart, "/books[1]/book[1]/title[1]", "");
row.AppendChild(titleSdt);
StructuredDocumentTag authorSdt =
new StructuredDocumentTag(doc, SdtType.PlainText, MarkupLevel.Cell);
authorSdt.XmlMapping.SetMapping(xmlPart, "/books[1]/book[1]/author[1]", "");
row.AppendChild(authorSdt);
doc.Save(dataDir + "Document.docx");