Trabalhar com estilos e temas

A classe StyleCollection é usada para gerenciar configurações internas e aplicar configurações definidas pelo usuário a estilos.

Como extrair conteúdo com base em estilos

Em um nível simples, recuperar o conteúdo com base em estilos de um documento do Word pode ser útil para identificar, listar e contar parágrafos e execuções de texto formatados com um estilo específico. Por exemplo, pode ser necessário identificar tipos específicos de conteúdo no documento, como exemplos, títulos, referências, palavras-chave, nomes de figuras e estudos de caso.

Para levar isso alguns passos adiante, isso também pode ser usado para alavancar a estrutura do documento, definida pelos estilos que ele usa, para reutilizar o documento para outra saída, como HTML. Na verdade, é assim que a documentação Aspose é construída, colocando Aspose.Words à prova. Uma ferramenta criada usando Aspose.Words pega os documentos do Word de origem e os divide em tópicos em determinados níveis de cabeçalho. Um arquivo XML é produzido usando Aspose.Words que é usado para construir a árvore de navegação que você pode ver à esquerda. E então Aspose.Words converte cada tópico em HTML. A solução para recuperar texto formatado com estilos específicos em um documento do Word é normalmente econômica e direta usando Aspose.Words.

Para ilustrar a facilidade com que Aspose.Words lida com a recuperação de conteúdo com base em estilos, vejamos um exemplo. Neste exemplo, vamos recuperar texto formatado com um estilo de parágrafo específico e um estilo de caractere de um documento do Word de amostra.

A um nível elevado, isso envolverá:

  1. Abrindo um documento do Word usando a classe Document.
  2. Obtendo coleções de todos os parágrafos e todas as execuções no documento.
  3. Seleccionar apenas os parágrafos e execuções necessários.

Especificamente, recuperaremos o texto formatado com o estilo de parágrafo' Heading 1 ‘e o estilo de caractere’ ênfase intensa ' deste exemplo de Documento do Word.

working-with-styles-aspose-words-java-1

Neste documento de exemplo, o texto formatado com o estilo de parágrafo ‘Heading 1’ é ‘inserir guia’, ‘Estilos Rápidos’ e ‘tema’, e o texto formatado com o estilo de caractere ‘ênfase intensa’ são as várias instâncias de texto azul, em itálico e em negrito, como ‘galerias’ e ‘aparência geral’.

A implementação de uma consulta baseada em estilo é bastante simples no modelo de objeto de documento Aspose.Words, pois simplesmente usa ferramentas que já estão em vigor. Dois métodos de classe são implementados para esta solução:

  1. ParagraphsByStyleName - este método recupera uma matriz dos parágrafos no documento que têm um nome de estilo específico.
  2. RunsByStyleName - este método recupera uma matriz dessas execuções no documento que têm um nome de estilo específico.

Ambos os métodos são muito semelhantes, sendo as únicas diferenças os tipos de nós e a representação das informações de estilo nos nós de parágrafo e de execução. Aqui está uma implementação de ParagraphsByStyleName mostrada no exemplo de código dado abaixo para encontrar todos os parágrafos formatados com o estilo especificado.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public static ArrayList<Paragraph> paragraphsByStyleName(Document doc, String styleName) throws Exception {
// Create an array to collect paragraphs of the specified style.
ArrayList<Paragraph> paragraphsWithStyle = new ArrayList();
// Get all paragraphs from the document.
NodeCollection paragraphs = doc.getChildNodes(NodeType.PARAGRAPH, true);
// Look through all paragraphs to find those with the specified style.
for (Paragraph paragraph : (Iterable<Paragraph>) paragraphs) {
if (paragraph.getParagraphFormat().getStyle().getName().equals(styleName))
paragraphsWithStyle.add(paragraph);
}
return paragraphsWithStyle;
}

Essa implementação também usa o método Document.getChildNodes() da classe Document, que retorna uma coleção de todos os nós filhos imediatos.

Também vale a pena salientar que a coleção de parágrafos não cria uma sobrecarga imediata porque os parágrafos são carregados nesta coleção apenas quando você acessa itens neles.Então, tudo o que você precisa fazer é percorrer a coleção, usando o operador foreach padrão e adicionar parágrafos que tenham o estilo especificado à matriz paragraphsWithStyle. O nome do estilo Paragraph pode ser encontrado na propriedade Style.getName() do objeto Paragraph.getParagraphFormat().

A implementação de RunsByStyleName é quase a mesma, embora estejamos obviamente usando NodeType.Run para recuperar nós executados. A propriedade Font.getStyle() de um objeto Run é usada para acessar informações de estilo nos nós Run.

O exemplo de código a seguir encontra todas as execuções formatadas com o estilo especificado.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public static ArrayList<Run> runsByStyleName(Document doc, String styleName) throws Exception {
// Create an array to collect runs of the specified style.
ArrayList<Run> runsWithStyle = new ArrayList();
// Get all runs from the document.
NodeCollection runs = doc.getChildNodes(NodeType.RUN, true);
// Look through all runs to find those with the specified style.
for (Run run : (Iterable<Run>) runs) {
if (run.getFont().getStyle().getName().equals(styleName))
runsWithStyle.add(run);
}
return runsWithStyle;
}

O exemplo de código a seguir executa consultas e exibe resultados.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// Open the document.
Document doc = new Document(dataDir + "TestFile.doc");
// Define style names as they are specified in the Word document.
final String PARA_STYLE = "Heading 1";
final String RUN_STYLE = "Intense Emphasis";
// Collect paragraphs with defined styles.
// Show the number of collected paragraphs and display the text of this paragraphs.
ArrayList<Paragraph> paragraphs = paragraphsByStyleName(doc, PARA_STYLE);
System.out.println(java.text.MessageFormat.format("Paragraphs with \"{0}\" styles ({1}):", PARA_STYLE, paragraphs.size()));
for (Paragraph paragraph : paragraphs)
System.out.print(paragraph.toString(SaveFormat.TEXT));
// Collect runs with defined styles.
// Show the number of collected runs and display the text of this runs.
ArrayList<Run> runs = runsByStyleName(doc, RUN_STYLE);
System.out.println(java.text.MessageFormat.format("\nRuns with \"{0}\" styles ({1}):", RUN_STYLE, runs.size()));
for (Run run : runs)
System.out.println(run.getRange().getText());

Quando tudo estiver pronto, a execução da amostra exibirá a seguinte saída:

working-with-styles-aspose-words-java-2

Como você pode ver, este é um exemplo muito simples, mostrando o número e o texto dos parágrafos coletados e é executado no documento do Word de amostra.

Inserir Separador de estilo para colocar diferentes estilos de parágrafo

O separador de estilos pode ser adicionado ao final de um parágrafo utilizando o atalho de teclado Ctrl + Alt + Enter na palavra MS. Este recurso permite dois estilos de parágrafo diferentes usados em um parágrafo impresso lógico. Se pretender que algum texto do início de um título específico apareça num Sumário, mas não pretender que o título inteiro no sumário, pode utilizar esta funcionalidade.

O exemplo de código a seguir mostra como inserir um separador de estilo para colocar estilos de parágrafo diferentes.

// 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);
Style paraStyle = builder.getDocument().getStyles().add(StyleType.PARAGRAPH, "MyParaStyle");
paraStyle.getFont().setBold(false);
paraStyle.getFont().setSize(8);
paraStyle.getFont().setName("Arial");
// Append text with "Heading 1" style.
builder.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
builder.write("Heading 1");
builder.insertStyleSeparator();
// Append text with another style.
builder.getParagraphFormat().setStyleName(paraStyle.getName());
builder.write("This is text with some other formatting ");
dataDir = dataDir + "InsertStyleSeparator_out.doc";
doc.save(dataDir);

Copiar todos os estilos do modelo

Há casos em que você deseja copiar todos os estilos de um documento para outro. Você pode usar o método Document.CopyStylesFromTemplate para copiar estilos do modelo especificado para um documento. Quando os estilos são copiados de um modelo para um documento, os estilos com nomes semelhantes no documento são redefinidos para corresponder às descrições de estilo no modelo. Os estilos únicos do modelo são copiados para o documento. Os estilos únicos no documento permanecem intactos.

O exemplo de código a seguir mostra como copiar estilos de um documento para outro.

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document(dataDir + "template.docx");
Document target = new Document(dataDir + "TestFile.doc");
target.copyStylesFromTemplate(doc);
dataDir = dataDir + "CopyStyles_out.docx";
doc.save(dataDir);

Como manipular as propriedades do tema

Adicionamos API básico em Aspose.Words para acessar as propriedades do tema do documento. Por enquanto, isso API inclui os seguintes objetos públicos:

  • Tema
  • ThemeFonts
  • ThemeColors

Veja como você pode obter propriedades do tema:

// 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(GetThemeProperties.class);
Document doc = new Document(dataDir + "Document.doc");
Theme theme = doc.getTheme();
// Major (Headings) font for Latin characters.
System.out.println(theme.getMajorFonts().getLatin());
// Minor (Body) font for EastAsian characters.
System.out.println(theme.getMinorFonts().getEastAsian());
// Color for theme color Accent 1.
System.out.println(theme.getColors().getAccent1());

E aqui está como você pode definir as propriedades do tema:

// 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(SetThemeProperties.class);
Document doc = new Document(dataDir + "Document.doc");
Theme theme = doc.getTheme();
// Set Times New Roman font as Body theme font for Latin Character.
theme.getMinorFonts().setLatin("Algerian");
// Set Color.Gold for theme color Hyperlink.
theme.getColors().setHyperlink(java.awt.Color.DARK_GRAY);
doc.save(dataDir + "output.doc");