Utilisation de SDT de contrôle de contenu

Dans Microsoft Word, vous pouvez créer un formulaire en commençant par un modèle et en ajoutant des contrôles de contenu, notamment des cases à cocher, des zones de texte, des sélecteurs de date et des listes déroulantes. Dans Aspose.Words, une balise de document structuré ou un contrôle de contenu de tout document chargé dans Aspose.Words est importé en tant que nœud StructuredDocumentTag. Les balises de document structurées (SDT ou contrôle de contenu) permettent d’intégrer la sémantique définie par le client ainsi que son comportement et son apparence dans un document.

StructuredDocumentTag peut apparaître dans un document aux endroits suivants:

  • Au niveau du bloc – Parmi les paragraphes et les tableaux, en tant qu’enfant d’un nœud Body, HeaderFooter, Comment, Footnote ou Shape
  • Au niveau des lignes – Parmi les lignes d’une table, en tant qu’enfant d’un nœud Table
  • Au niveau des cellules – Parmi les cellules d’une ligne de tableau, en tant qu’enfant d’un nœud Row
  • Niveau en ligne – Parmi le contenu en ligne à l’intérieur, en tant qu’enfant d’un paragraphe
  • Imbriqué dans un autre StructuredDocumentTag

Insertion de contrôles de contenu dans un document

Dans cette version de Aspose.Words, les types suivants de SDT ou de contrôle de contenu peuvent être créés:

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

L’exemple de code suivant montre comment créer un contrôle de contenu de type case à cocher:

// 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);

L’exemple de code suivant montre comment créer un contrôle de contenu de type zone de texte enrichi:

// 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);

L’exemple de code suivant montre comment créer un contrôle de contenu du type zone de liste déroulante:

// 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);

Comment mettre à jour les contrôles de contenu

Cette section explique comment mettre à jour les valeurs de SDT ou de contrôle de contenu par programmation.

L’exemple de code suivant montre comment définir l’état actuel de la case à cocher:

// 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);

L’exemple de code suivant montre comment modifier les contrôles de contenu de type zone de texte brut, liste déroulante et image:

// 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);

Liaison du contrôle de contenu à des parties XML personnalisées

Vous pouvez lier des contrôles de contenu avec des données XML (partie XML personnalisée) dans des documents Word.

L’exemple de code suivant montre comment lier le contrôle de contenu à des parties XML personnalisées:

// 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);

XMLMapping de la plage de balises de documents structurés

Vous pouvez obtenir le mappage de cette plage de balises de document structuré avec des données XML dans une partie XML personnalisée du document actuel à l’aide du Propriété StructuredDocumentTagRangeStart.XmlMapping. Cependant, la méthode SetMapping peut être utilisée pour mapper une plage de balises de document structuré à des données XML.

L’exemple de code suivant montre comment définir le mappage 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");

Effacer le contenu d’un contrôle de contenu

Vous pouvez effacer le contenu d’un contrôle de contenu en affichant un espace réservé. La méthode StructuredDocumentTag.Clear efface le contenu de cette balise de document structuré et affiche un espace réservé s’il est défini. Cependant, il n’est pas possible d’effacer le contenu d’un contrôle de contenu s’il comporte des révisions. Si un contrôle de contenu n’a pas d’espace réservé, cinq espaces sont insérés comme dans Microsoft Word (sauf sections répétitives, éléments de section répétitifs, groupes, cases à cocher, citations). Si un contrôle de contenu est mappé à du XML personnalisé, le nœud XML référencé est effacé.

L’exemple de code suivant montre comment effacer le contenu du contrôle de contenu:

// 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);

Modifier les couleurs d’arrière-plan et de bordure du contrôle de contenu

La propriété StructuredDocumentTag.Color vous permet d’obtenir ou de définir la couleur du contrôle de contenu. La couleur affecte le contrôle du contenu dans deux situations:

  1. MS Word met en évidence l’arrière-plan du contrôle de contenu lorsque la souris se déplace sur le contrôle de contenu. Cela permet d’identifier le contrôle de contenu. La couleur de surbrillance est un peu plus “douce” que celle du Color. Par exemple, MS Word met en évidence l’arrière-plan avec la couleur rose, lorsque Color est rouge.
  2. Lorsque vous interagissez (édition, sélection, etc.) avec le contrôle de contenu, la bordure du contrôle de contenu est colorée avec le Color.

L’exemple de code suivant montre comment modifier la couleur du contrôle de contenu:

// 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);

Comment définir le style pour formater le texte saisi dans le contrôle de contenu

Si vous souhaitez définir le style de contrôle de contenu, vous pouvez utiliser les propriétés StructuredDocumentTag.Style ou StructuredDocumentTag.StyleName. Lorsque vous tapez le texte dans le contrôle de contenu dans le document de sortie, le texte saisi aura le style “Citation”.

L’exemple de code suivant montre comment définir le style du contrôle de contenu:

// 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);

Utilisation du contrôle de contenu de section répétitive

Le contrôle du contenu de la section répétitive permet de répéter le contenu qu’elle contient. À l’aide de Aspose.Words, les nœuds de balises de document structurés des types d’éléments de section répétitive et de section répétitive peuvent être créés et à cet effet, Type d’énumération SdtType fournit une propriété RepeatingSectionItem.

L’exemple de code suivant montre comment lier un contrôle de contenu de section répétitive à une table.

// 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");