Lucrul cu controlul conținutului SDT

În Microsoft Word, puteți crea un formular începând cu un șablon și adăugând controale de conținut, inclusiv checkboxes, casete de text, Selectoare de date și liste derulante. În Aspose.Words, o etichetă de Document structurată sau un control de conținut din orice document încărcat în Aspose.Words este importat ca nod StructuredDocumentTag. Etichetele structurate ale documentelor (SDT sau controlul conținutului) permit încorporarea semanticii definite de client, precum și a comportamentului și aspectului acesteia într-un document. StructuredDocumentTag poate apărea într-un document în următoarele locuri:

  • Bloc-nivel - printre paragrafe și tabele, ca un copil al unui Body, HeaderFooter, Comment, Footnote sau un nod Shape
  • Nivel de rând-printre rândurile dintr-un tabel, ca un copil al unui nod Table
  • Nivel de celulă - printre celulele dintr-un rând de tabel, ca un copil al unui nod Row
  • Inline-level-printre conținutul inline din interior, ca un copil al unui Paragraph
  • Imbricate în interiorul unui alt StructuredDocumentTag

Inserarea controalelor de conținut într-un Document

În această versiune de Aspose.Words, pot fi create următoarele tipuri de SDT sau control de conținut:

  • Checkbox
  • DropDownList
  • ComboBox
  • Data
  • BuildingBlockGallery
  • Grupul
  • Picture
  • RichText
  • PlainText

Următorul exemplu de cod demonstrează cum se creează controlul conținutului de tip checkbox.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
sdtCheckBox = aw.markup.StructuredDocumentTag(doc, aw.markup.SdtType.CHECKBOX, aw.markup.MarkupLevel.INLINE)
builder.insert_node(sdtCheckBox)
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.check_box_type_content_control.docx", aw.SaveFormat.DOCX)

Următorul exemplu de cod demonstrează modul de creare a controlului de conținut al casetei de text îmbogățit tip.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
sdtRichText = aw.markup.StructuredDocumentTag(doc, aw.markup.SdtType.RICH_TEXT, aw.markup.MarkupLevel.BLOCK)
para = aw.Paragraph(doc)
run = aw.Run(doc)
run.text = "Hello World"
run.font.color = drawing.Color.green
para.runs.add(run)
sdtRichText.child_nodes.add(para)
doc.first_section.body.append_child(sdtRichText)
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.rich_text_box_content_control.docx")

Următorul exemplu de cod demonstrează cum se creează controlul conținutului casetei combo de tip.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
sdt = aw.markup.StructuredDocumentTag(doc, aw.markup.SdtType.COMBO_BOX, aw.markup.MarkupLevel.BLOCK)
sdt.list_items.add(aw.markup.SdtListItem("Choose an item", "-1"))
sdt.list_items.add(aw.markup.SdtListItem("Item 1", "1"))
sdt.list_items.add(aw.markup.SdtListItem("Item 2", "2"))
doc.first_section.body.append_child(sdt)
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.combo_box_content_control.docx")

Cum să actualizați controalele de conținut

Această secțiune explică modul de actualizare programatică a valorilor SDT sau controlul conținutului.

Următorul exemplu de cod arată cum să setați starea curentă a checkbox:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Structured document tags.docx")
# Get the first content control from the document.
sdtCheckBox = doc.get_child(aw.NodeType.STRUCTURED_DOCUMENT_TAG, 0, True).as_structured_document_tag()
if (sdtCheckBox.sdt_type == aw.markup.SdtType.CHECKBOX) :
sdtCheckBox.checked = True
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.current_state_of_check_box.docx")

Următorul exemplu de cod arată modul de modificare a controalelor de conținut de tip casetă text simplu, listă derulantă și imagine:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Structured document tags.docx")
for sdt in doc.get_child_nodes(aw.NodeType.STRUCTURED_DOCUMENT_TAG, True) :
sdt = sdt.as_structured_document_tag()
if (sdt.sdt_type == aw.markup.SdtType.PLAIN_TEXT) :
sdt.remove_all_children()
para = sdt.append_child(aw.Paragraph(doc)).as_paragraph()
run = aw.Run(doc, "new text goes here")
para.append_child(run)
elif (sdt.sdt_type == aw.markup.SdtType.DROP_DOWN_LIST) :
secondItem = sdt.list_items[2]
sdt.list_items.selected_value = secondItem
elif (sdt.sdt_type == aw.markup.SdtType.PICTURE) :
shape = sdt.get_child(NodeType.shape, 0, True).as_shape()
if (shape.has_image) :
shape.image_data.set_image(docs_base.images_dir + "Watermark.png")
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.modify_content_controls.docx")

Controlul conținutului obligatoriu la piese personalizate XML

Puteți lega controalele de conținut cu XML date (custom XML part) în documentele Word.

Următorul exemplu de cod arată cum să legați controlul conținutului la părțile personalizate XML:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
xmlPart = doc.custom_xml_parts.add(str(uuid.uuid4()), "<root><text>Hello, World!</text></root>")
sdt = aw.markup.StructuredDocumentTag(doc, aw.markup.SdtType.PLAIN_TEXT, aw.markup.MarkupLevel.BLOCK)
doc.first_section.body.append_child(sdt)
sdt.xml_mapping.set_mapping(xmlPart, "/root[1]/text[1]", "")
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.bind_sd_tto_custom_xml_part.doc")

XMLMapping din intervalul de etichete pentru documente structurate

Puteți obține maparea acestui interval de etichete de document structurat la XML date într-o parte personalizată XML a documentului curent folosind proprietatea StructuredDocumentTagRangeStart.xml_mapping. Cu toate acestea, metoda set_mapping poate fi utilizată pentru a mapa un interval de etichete de document structurat la datele XML.

Următorul exemplu de cod arată cum să setați XML mapping:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Multi-section structured document tags.docx")
# Construct an XML part that contains data and add it to the document's CustomXmlPart collection.
xmlPartId = str(uuid.uuid4())
xmlPartContent = "<root><text>Text element #1</text><text>Text element #2</text></root>"
xmlPart = doc.custom_xml_parts.add(xmlPartId, xmlPartContent)
print(xmlPart.data.decode("utf-8"))
# Create a StructuredDocumentTag that will display the contents of our CustomXmlPart in the document.
sdtRangeStart = doc.get_child(aw.NodeType.STRUCTURED_DOCUMENT_TAG_RANGE_START, 0, True).as_structured_document_tag_range_start()
# If we set a mapping for our StructuredDocumentTag,
# it will only display a part of the CustomXmlPart that the XPath points to.
# This XPath will point to the contents second "<text>" element of the first "<root>" element of our CustomXmlPart.
sdtRangeStart.xml_mapping.set_mapping(xmlPart, "/root[1]/text[2]", None)
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.structured_document_tag_range_start_xml_mapping.docx")

Ștergeți conținutul unui Control de conținut

Puteți șterge conținutul unui control de conținut cu afișarea unui substituent. StructuredDocumentTag.clear metoda șterge conținutul acestei etichete de document structurat și afișează un substituent dacă este definit. Cu toate acestea, nu este posibil să ștergeți conținutul unui control de conținut dacă are revizuiri. Dacă un control de conținut nu are un substituent, se introduc cinci spații ca în MS Word (cu excepția secțiunilor repetate, a elementelor de secțiune repetate, a grupurilor, a casetelor de selectare, a citărilor). Dacă un control de conținut este mapat la personalizat XML, nodul XML la care se face referire este șters.

Următorul exemplu de cod arată cum să ștergeți conținutul controlului conținutului:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Structured document tags.docx")
sdt = doc.get_child(aw.NodeType.STRUCTURED_DOCUMENT_TAG, 0, True).as_structured_document_tag()
sdt.clear()
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.clear_contents_control.doc")

Schimbați fundalul de Control al conținutului și culorile de margine

Proprietatea StructuredDocumentTag.color vă permite să obțineți sau să setați culoarea controlului conținutului. Culoarea afectează controlul conținutului în două situații:

  1. MS Word evidențiază fundalul controlului de conținut atunci când mouse-ul se deplasează peste controlul de conținut. Acest lucru ajută la identificarea controlului conținutului. Culoarea evidențierii este puțin “mai moale” decât color. De exemplu, MS Word evidențiază fundalul cu culoarea roz, când color este roșu.
  2. Când interacționați (editare, cules etc.) cu controlul conținutului, marginea controlului conținutului este colorată cu color.

Următorul exemplu de cod arată cum să schimbați culoarea controlului conținutului:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Structured document tags.docx")
sdt = doc.get_child(aw.NodeType.STRUCTURED_DOCUMENT_TAG, 0, True).as_structured_document_tag()
sdt.color = drawing.Color.red
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.set_content_control_color.docx")

Cum să setați stilul la formatarea textului introdus în controlul conținutului

Dacă doriți să setați stilul de control al conținutului, puteți utiliza StructuredDocumentTag.style sau StructuredDocumentTag.style_name proprietăți. Când introduceți textul în controlul conținutului în documentul de ieșire, textul tastat va avea stilul “Citat”.

Următorul exemplu de cod arată cum să setați stilul de control al conținutului:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Structured document tags.docx")
sdt = doc.get_child(aw.NodeType.STRUCTURED_DOCUMENT_TAG, 0, True).as_structured_document_tag()
style = doc.styles.get_by_style_identifier(aw.StyleIdentifier.QUOTE)
sdt.style = style
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.set_content_control_style.docx")

Lucrul cu controlul conținutului secțiunii repetate

Controlul conținutului secțiunii repetitive permite repetarea conținutului conținut în acesta. Folosind Aspose.Words, nodurile de etichete de document structurate ale secțiunii repetitive și tipurile de elemente ale secțiunii repetitive pot fi create și în acest scop, SdtType Tipul de enumerare oferă REPEATING_SECTION_ITEM proprietate.

Următorul exemplu de cod arată cum să legați un control de conținut al secțiunii repetate la un tabel:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
xmlPart = doc.custom_xml_parts.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 = builder.start_table()
builder.insert_cell()
builder.write("Title")
builder.insert_cell()
builder.write("Author")
builder.end_row()
builder.end_table()
repeatingSectionSdt =aw.markup.StructuredDocumentTag(doc, aw.markup.SdtType.REPEATING_SECTION, aw.markup.MarkupLevel.ROW)
repeatingSectionSdt.xml_mapping.set_mapping(xmlPart, "/books[1]/book", "")
table.append_child(repeatingSectionSdt)
repeatingSectionItemSdt = aw.markup.StructuredDocumentTag(doc, aw.markup.SdtType.REPEATING_SECTION_ITEM, aw.markup.MarkupLevel.ROW)
repeatingSectionSdt.append_child(repeatingSectionItemSdt)
row = aw.tables.Row(doc)
repeatingSectionItemSdt.append_child(row)
titleSdt = aw.markup.StructuredDocumentTag(doc, aw.markup.SdtType.PLAIN_TEXT, aw.markup.MarkupLevel.CELL)
titleSdt.xml_mapping.set_mapping(xmlPart, "/books[1]/book[1]/title[1]", "")
row.append_child(titleSdt)
authorSdt = aw.markup.StructuredDocumentTag(doc, aw.markup.SdtType.PLAIN_TEXT, aw.markup.MarkupLevel.CELL)
authorSdt.xml_mapping.set_mapping(xmlPart, "/books[1]/book[1]/author[1]", "")
row.append_child(authorSdt)
doc.save(docs_base.artifacts_dir + "WorkingWithSdt.creating_table_repeating_section_mapped_to_custom_xml_part.docx")