Índice (TOC) em um documento do Word fornece uma visão geral do que um documento contém. Além disso, permite navegar para uma seção específica do documento. Neste artigo, você aprenderá a trabalhar com um índice em documentos do Word programaticamente. Particularmente, este artigo aborda como adicionar, extrair, atualizar ou remover um índice em documentos do Word em C#.

API C# para adicionar, editar ou excluir TOC em documentos do Word

Para trabalhar com índices em documentos do Word, usaremos Aspose.Words for .NET. A referida API foi projetada para executar recursos básicos e avançados de automação do Word a partir de aplicativos .NET. Além disso, dá-lhe um bom controle sobre a manipulação do índice em documentos do Word. Você pode baixar a API ou instalá-la usando NuGet.

PM> Install-Package Aspose.Words

Adicionar índice em um documento do Word em C#

A seguir estão as etapas para adicionar um índice ao documento do Word usando Aspose.Words para .NET.

O exemplo de código a seguir mostra como adicionar um sumário em um documento do Word em C#.

// Para exemplos completos e arquivos de dados, acesse https://github.com/aspose-words/Aspose.Words-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
// Inicialize o documento.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Insira um índice no início do documento.
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");

// O índice recém-inserido estará inicialmente vazio.
// Ele precisa ser preenchido atualizando os campos no documento.
doc.UpdateFields();
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc";
doc.Save(dataDir);

C# Extrair Índice de um Documento do Word

A seguir estão as etapas para extrair campos de um índice em um documento do Word.

  • Carregue o documento do Word usando a classe Document.
  • Faça um loop em cada Field no documento usando a coleção Document.Range.Fields.
  • Verifique se o tipo de campo é um hiperlink usando a propriedade Field.Type.
  • Verifique se o campo está abaixo da seção de índice.
  • Recupere as informações do campo e imprima.

O exemplo de código a seguir mostra como extrair um sumário de um documento do Word usando C#.

// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();

string fileName = "TOC.doc";
Aspose.Words.Document doc = new Aspose.Words.Document(dataDir + fileName);

foreach (Field field in doc.Range.Fields)
{
	if (field.Type.Equals(Aspose.Words.Fields.FieldType.FieldHyperlink))
	{
		FieldHyperlink hyperlink = (FieldHyperlink)field;
		if (hyperlink.SubAddress != null && hyperlink.SubAddress.StartsWith("_Toc"))
		{
			Paragraph tocItem = (Paragraph)field.Start.GetAncestor(NodeType.Paragraph);
			Console.WriteLine(tocItem.ToString(SaveFormat.Text).Trim());
			Console.WriteLine("------------------");
			if (tocItem != null)
			{
				Bookmark bm = doc.Range.Bookmarks[hyperlink.SubAddress];
				// Obtenha o local para o qual este item de sumário está apontando
				Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph);
				Console.WriteLine(pointer.ToString(SaveFormat.Text));
			}
		} // End If
	}// End If
}// End Foreach

Atualizar índice no documento do Word em C#

Sempre que você anexa algum conteúdo a um documento do Word, precisa atualizar o índice. Para fazer isso programaticamente, basta chamar o método Document.UpdateFields() antes de salvar o documento.

Remover índice no documento do Word em C#

Aspose.Words para .NET também permite que você remova o índice de um documento do Word. A seguir estão as etapas para realizar esta operação.

  • Primeiro, carregue o documento do Word usando a classe Document.
  • Obtenha e armazene os nós FieldStart de cada TOC em uma matriz.
  • Faça um loop pelos nós até obter o nó do tipo FieldEnd (final do TOC).
  • Remova os nós usando o método Node.Remove() e salve o documento atualizado.

O exemplo de código a seguir mostra como remover o índice de um documento do Word em C#.

// Para exemplos completos e arquivos de dados, acesse https://github.com/aspose-words/Aspose.Words-for-.NET
public static void Run()
{
    
    // O caminho para o diretório de documentos.
    string dataDir = RunExamples.GetDataDir_WorkingWithStyles();

    // Abra um documento que contém um sumário.
    Document doc = new Document(dataDir + "Document.TableOfContents.doc");

    // Remova o primeiro índice do documento.
    RemoveTableOfContents(doc, 0);

    dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc";
    // Salve a saída.
    doc.Save(dataDir);
    
    Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir);
}
///<summary>
/// Remove o campo de índice especificado do documento.
///</summary>
///<param name="doc"> O documento do qual remover o campo.</param>
///<param name="index"> O índice baseado em zero do TOC a ser removido.</param>
public static void RemoveTableOfContents(Document doc, int index)
{
    // Armazene os nós FieldStart dos campos TOC no documento para acesso rápido.
    ArrayList fieldStarts = new ArrayList();
    // Esta é uma lista para armazenar os nós encontrados dentro do TOC especificado. Eles serão removidos
    // No final deste método.
    ArrayList nodeList = new ArrayList();

    foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true))
    {
        if (start.FieldType == FieldType.FieldTOC)
        {
            // Adicione todos os FieldStarts que são do tipo FieldTOC.
            fieldStarts.Add(start);
        }
    }

    // Certifique-se de que o TOC especificado pelo índice passado exista.
    if (index > fieldStarts.Count - 1)
        throw new ArgumentOutOfRangeException("TOC index is out of range");

    bool isRemoving = true;
    // Obtenha o FieldStart do sumário especificado.
    Node currentNode = (Node)fieldStarts[index];

    while (isRemoving)
    {
        // É mais seguro armazenar esses nós e excluí-los todos de uma vez mais tarde.
        nodeList.Add(currentNode);
        currentNode = currentNode.NextPreOrder(doc);

        // Uma vez que encontramos um nó FieldEnd do tipo FieldTOC, sabemos que estamos no final
        // Do TOC atual e podemos parar por aqui.
        if (currentNode.NodeType == NodeType.FieldEnd)
        {
            FieldEnd fieldEnd = (FieldEnd)currentNode;
            if (fieldEnd.FieldType == FieldType.FieldTOC)
                isRemoving = false;
        }
    }

    // Remova todos os nós encontrados no sumário especificado.
    foreach (Node node in nodeList)
    {
        node.Remove();
    }
}

Obtenha uma licença de API gratuita

Caso queira experimentar a API sem limitações de avaliação, você pode obter uma licença temporária gratuita.

Conclusão

Neste artigo, você aprendeu como trabalhar com um índice em um documento do Word programaticamente. O guia passo a passo e os exemplos de código mostraram como adicionar, atualizar, extrair e remover o índice de documentos do Word em C#. Você pode explorar mais sobre a API de automação do Word C# usando documentação. Caso você tenha alguma dúvida ou preocupação, entre em contato conosco através do nosso fórum.

Veja também