Trabalhando com controle de Conteúdo SDT
Em Microsoft Word, você pode criar um formulário começando com um modelo e adicionando controles de conteúdo, incluindo checkboxes, caixas de texto, selecionadores de data e listas suspensas. Em Aspose.Words, uma Tag de documento estruturado ou controle de conteúdo de qualquer documento carregado em Aspose.Words é importado como um nó StructuredDocumentTag. As etiquetas de documentos estruturados (SDT ou controlo de conteúdos) permitem incorporar a semântica definida pelo cliente, bem como o seu comportamento e aparência num documento.
StructuredDocumentTag pode ocorrer num documento nos seguintes locais:
- Nível de bloco - entre parágrafos e tabelas, como filho de um corpo, HeaderFooter, comentário, nota de rodapé ou um nó de forma.
- Nível de linha-entre linhas em uma tabela, como filho de um nó de tabela.
- Cell-level-entre células em uma linha de tabela, como filho de um nó de linha.
- Inline-level-entre o conteúdo inline dentro, como filho de um parágrafo.
- Aninhado dentro de outro StructuredDocumentTag.
Inserir controlos de conteúdo num documento
Nesta versão de Aspose.Words, os seguintes tipos de SDT ou controle de conteúdo podem ser criados:
- Checkbox
- DropDownList
- ComboBox
- Data
- BuildingBlockGallery
- Grupo
Picture
- RichText
- PlainText
O exemplo de código a seguir mostra como criar o controle de conteúdo do tipo checkbox:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
String dataDir = Utils.getDataDir(CheckBoxTypeContentControl.class); | |
// Open the document. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
StructuredDocumentTag stdCheckBox = new StructuredDocumentTag(doc, SdtType.CHECKBOX, MarkupLevel.INLINE); | |
builder.insertNode(stdCheckBox); | |
doc.save(dataDir + "output.doc"); |
O exemplo de código a seguir mostra como criar Controle de conteúdo do tipo rich text box:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
String dataDir = Utils.getDataDir(RichTextBoxContentControl.class); | |
// Open the document. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
StructuredDocumentTag sdtRichText = new StructuredDocumentTag(doc, SdtType.RICH_TEXT, MarkupLevel.BLOCK); | |
Paragraph para = new Paragraph(doc); | |
Run run = new Run(doc); | |
run.setText("Hello World"); | |
run.getFont().setColor(Color.MAGENTA); | |
para.getRuns().add(run); | |
sdtRichText.getChildNodes().add(para); | |
doc.getFirstSection().getBody().appendChild(sdtRichText); | |
doc.save(dataDir + "output.doc"); |
O exemplo de código a seguir mostra como criar o controle de conteúdo do tipo caixa de combinação:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
String dataDir = Utils.getDataDir(ComboBoxContentControl.class); | |
// Open the document. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
StructuredDocumentTag sdt = new StructuredDocumentTag(doc, SdtType.COMBO_BOX, MarkupLevel.BLOCK); | |
sdt.getListItems().add(new SdtListItem("Choose an item", "3")); | |
sdt.getListItems().add(new SdtListItem("Item 1", "1")); | |
sdt.getListItems().add(new SdtListItem("Item 2", "2")); | |
doc.getFirstSection().getBody().appendChild(sdt); | |
doc.save(dataDir + "output.doc"); |
Como atualizar os controlos de conteúdo
Esta seção explica como atualizar os valores de SDT ou controle de conteúdo programaticamente.
O exemplo de código a seguir mostra como definir o estado atual do checkbox:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
String dataDir = Utils.getDataDir(SetCurrentStateOfCheckBox.class); | |
// Open the document. | |
Document doc = new Document(dataDir + "CheckBoxTypeContentControl.docx"); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
StructuredDocumentTag SdtCheckBox = (StructuredDocumentTag) doc.getChild(NodeType.STRUCTURED_DOCUMENT_TAG, 0, true); | |
//StructuredDocumentTag.Checked property gets/sets current state of the Checkbox SDT | |
if (SdtCheckBox.getSdtType() == SdtType.CHECKBOX) | |
SdtCheckBox.setChecked(true); | |
doc.save(dataDir + "output.doc"); |
O exemplo de código a seguir mostra como modificar os controles de conteúdo do tipo caixa de texto simples, lista suspensa e imagem:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
String dataDir = Utils.getDataDir(ModifyContentControls.class); | |
// Open the document. | |
Document doc = new Document(dataDir + "CheckBoxTypeContentControl.docx"); | |
for (Object t : doc.getChildNodes(NodeType.STRUCTURED_DOCUMENT_TAG, true)) { | |
StructuredDocumentTag std = (StructuredDocumentTag) t; | |
if (std.getSdtType() == SdtType.PLAIN_TEXT) { | |
std.removeAllChildren(); | |
Paragraph para = (Paragraph) std.appendChild(new Paragraph(doc)); | |
Run run = new Run(doc, "new text goes here"); | |
para.appendChild(run); | |
} | |
if (std.getSdtType() == SdtType.DROP_DOWN_LIST) { | |
SdtListItem secondItem = std.getListItems().get(2); | |
std.getListItems().setSelectedValue(secondItem); | |
} | |
if (std.getSdtType() == SdtType.PICTURE) { | |
Shape shape = (Shape) std.getChild(NodeType.SHAPE, 0, true); | |
if (shape.hasImage()) { | |
shape.getImageData().setImage(dataDir + "Watermark.png"); | |
} | |
} | |
doc.save(dataDir + "output.doc"); |
Vinculando o Controle de conteúdo a partes personalizadas XML
Você pode vincular controles de conteúdo com dados XML (custom XML part) em documentos do Word.
O exemplo de código a seguir mostra como vincular o controle de conteúdo a partes personalizadas XML:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
String dataDir = Utils.getDataDir(BindingContentControlwithXML.class); | |
Document doc = new Document(); | |
CustomXmlPart xmlPart = doc.getCustomXmlParts().add(UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d").toString(), "<root><text>Hello, World!</text></root>"); | |
StructuredDocumentTag sdt = new StructuredDocumentTag(doc, SdtType.PLAIN_TEXT, MarkupLevel.BLOCK); | |
doc.getFirstSection().getBody().appendChild(sdt); | |
sdt.getXmlMapping().setMapping(xmlPart, "/root[1]/text[1]", ""); | |
dataDir = dataDir + "BindSDTtoCustomXmlPart_out.doc"; | |
// Save the document to disk. | |
doc.save(dataDir); |
Limpar conteúdo de um controlo de conteúdo
Você pode limpar o conteúdo de um controle de conteúdo exibindo um espaço reservado. StructuredDocumentTag.clear() método limpa o conteúdo desta etiqueta de documento estruturado e exibe um espaço reservado se estiver definido. No entanto, não é possível limpar o conteúdo de um controlo de conteúdo se este tiver revisões. Se um controlo de conteúdo não tiver espaço reservado, são inseridos cinco espaços como em MS Word (excepto secções repetidas, itens de secção repetidos, Grupos, Caixas de verificação, citações). Se um controle de conteúdo for mapeado para custom XML, o nó XML referenciado será limpo.
O exemplo de código a seguir mostra como limpar o conteúdo do controle de conteúdo:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
String dataDir = Utils.getDataDir(ClearContentsControl.class); | |
Document doc = new Document(dataDir + "input.docx"); | |
StructuredDocumentTag sdt = (StructuredDocumentTag) doc.getChild(NodeType.STRUCTURED_DOCUMENT_TAG, 0, true); | |
sdt.clear(); | |
dataDir = dataDir + "ClearContentsControl_out.doc"; | |
// Save the document to disk. | |
doc.save(dataDir); |
Alterar cores de fundo e borda do controle de conteúdo
A propriedade StructuredDocumentTag.Color
permite obter ou definir a cor do controlo de conteúdo. A cor afeta o controle de conteúdo em duas situações:
- MS o Word realça o fundo do controlo de conteúdo quando o rato se move sobre o controlo de conteúdo. Isso ajuda a identificar o controle de conteúdo. A cor do realce é um pouco" mais suave " do que o Color. Por exemplo, MS Word realça o fundo com a cor Rosa, quando Color é vermelho.
- Quando você interage (editando, escolhendo etc.) com o controle de conteúdo, a borda do controle de conteúdo é colorida com o Color.
O exemplo de código a seguir mostra como alterar a cor do controle de conteúdo:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
// The path to the documents directory. | |
Document doc = new Document(dataDir + "input.docx"); | |
StructuredDocumentTag sdt = (StructuredDocumentTag) doc.getChild(NodeType.STRUCTURED_DOCUMENT_TAG, 0, true); | |
sdt.setColor(Color.RED); | |
dataDir = dataDir + "SetContentControlColor_out.docx"; | |
// Save the document to disk. | |
doc.save(dataDir); |
Como definir o estilo para formatar o texto digitado no controle de conteúdo
Se pretender definir o estilo de controlo de conteúdo, pode utilizar as Propriedades StructuredDocumentTag.Style
ou StructuredDocumentTag.StyleName
. Quando você digita o texto no controle de conteúdo no documento de saída, o texto digitado terá o estilo “citação”.
O exemplo de código a seguir mostra como definir o estilo do controle de conteúdo:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(dataDir + "input.docx"); | |
StructuredDocumentTag sdt = (StructuredDocumentTag) doc.getChild(NodeType.STRUCTURED_DOCUMENT_TAG, 0, true); | |
Style style = doc.getStyles().getByStyleIdentifier(StyleIdentifier.QUOTE); | |
sdt.setStyle(style); | |
dataDir = dataDir + "SetContentControlStyle_out.docx"; | |
doc.save(dataDir); |
Trabalhando com controle de conteúdo de seção repetida
O controlo de conteúdo da secção de repetição permite repetir o conteúdo nele contido. Usando Aspose.Words, os nós de tag de documento estruturado da seção de repetição e os tipos de item de seção de repetição podem ser criados e, para esse fim, SdtType Tipo de enumeração fornece REPEATING_SECTION_ITEM membro.
O exemplo de código a seguir mostra como vincular um controle de conteúdo de seção repetida a uma tabela:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
CustomXmlPart xmlPart = doc.getCustomXmlParts().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.REPEATING_SECTION, MarkupLevel.ROW); | |
repeatingSectionSdt.getXmlMapping().setMapping(xmlPart, "/books[1]/book", ""); | |
table.appendChild(repeatingSectionSdt); | |
StructuredDocumentTag repeatingSectionItemSdt = | |
new StructuredDocumentTag(doc, SdtType.REPEATING_SECTION_ITEM, MarkupLevel.ROW); | |
repeatingSectionSdt.appendChild(repeatingSectionItemSdt); | |
Row row = new Row(doc); | |
repeatingSectionItemSdt.appendChild(row); | |
StructuredDocumentTag titleSdt = | |
new StructuredDocumentTag(doc, SdtType.PLAIN_TEXT, MarkupLevel.CELL); | |
titleSdt.getXmlMapping().setMapping(xmlPart, "/books[1]/book[1]/title[1]", ""); | |
row.appendChild(titleSdt); | |
StructuredDocumentTag authorSdt = | |
new StructuredDocumentTag(doc, SdtType.PLAIN_TEXT, MarkupLevel.CELL); | |
authorSdt.getXmlMapping().setMapping(xmlPart, "/books[1]/book[1]/author[1]", ""); | |
row.appendChild(authorSdt); | |
doc.save(dataDir + "Document.docx"); |