Оглавление (TOC) в документе Word дает вам общее представление о содержании документа. Кроме того, он позволяет перейти к определенному разделу документа. В этой статье вы узнаете, как программно работать с оглавлением в документах Word с помощью C#. В частности, в этой статье рассказывается, как добавлять, извлекать, обновлять или удалять оглавление в документах Word.

C# API для работы с оглавлением в документе Word

Для работы с оглавлениями в документах Word мы будем использовать Aspose.Words for .NET. Упомянутый API предназначен для выполнения основных, а также расширенных функций автоматизации Word из приложений .NET. Кроме того, это дает вам надежный контроль над манипулированием оглавлением в документах Word. Вы можете либо скачать API, либо установить его с помощью NuGet.

PM> Install-Package Aspose.Words

Добавить оглавление в документ Word с помощью С#

Ниже приведены шаги по добавлению оглавления в документ Word с помощью Aspose.Words для .NET.

  • Создайте экземпляр класса Document (в случае загрузки существующего документа Word укажите путь к файлу в конструкторе).
  • Создайте экземпляр класса DocumentBuilder и инициализируйте его ранее созданным объектом Document.
  • Вставьте оглавление, используя метод DocumentBuilder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u").
  • Обновите поля с помощью метода Document.UpdateFields().
  • Сохраните документ Word с помощью метода Document.Save(String).

В следующем примере кода показано, как добавить оглавление в документ Word на C#.

// Полные примеры и файлы данных см. на странице https://github.com/aspose-words/Aspose.Words-for-.NET.
// Путь к каталогу документов.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
// Инициализировать документ.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Вставьте оглавление в начале документа.
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");

// Вновь вставленное оглавление изначально будет пустым.
// Его необходимо заполнить, обновив поля в документе.
doc.UpdateFields();
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc";
doc.Save(dataDir);

Извлечь оглавление из документа Word с помощью C#

Ниже приведены шаги для извлечения полей из оглавления в документе Word.

  • Загрузите документ Word, используя класс Document.
  • Прокрутите каждое Field в документе, используя коллекцию Document.Range.Fields.
  • Проверьте, является ли тип поля гиперссылкой, используя свойство Field.Type.
  • Проверьте, попадает ли поле под таблицу содержания раздела.
  • Получите информацию о поле и распечатайте ее.

В следующем примере кода показано, как извлечь оглавление из документа Word с помощью C#.

// Путь к каталогу документов.
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];
				// Получить местоположение, на которое указывает этот элемент TOC
				Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph);
				Console.WriteLine(pointer.ToString(SaveFormat.Text));
			}
		} // End If
	}// End If
}// End Foreach

Обновить оглавление в документе Word с помощью С#

Всякий раз, когда вы добавляете какой-либо контент в документ Word, вам необходимо обновить оглавление. Чтобы сделать это программно, вам просто нужно вызвать метод Document.UpdateFields() перед сохранением документа.

Удалить оглавление в документе Word с помощью С#

Aspose.Words для .NET также позволяет удалить оглавление из документа Word. Ниже приведены шаги для выполнения этой операции.

  • Сначала загрузите документ Word, используя класс Document.
  • Получите и сохраните узлы FieldStart каждого TOC в массиве.
  • Перебирайте узлы, пока не получите узел типа FieldEnd (конец оглавления).
  • Удалите узлы с помощью метода Node.Remove() и сохраните обновленный документ.

В следующем примере кода показано, как удалить оглавление из документа Word на C#.

// Полные примеры и файлы данных см. на странице https://github.com/aspose-words/Aspose.Words-for-.NET.
public static void Run()
{
    
    // Путь к каталогу документов.
    string dataDir = RunExamples.GetDataDir_WorkingWithStyles();

    // Откройте документ, содержащий оглавление.
    Document doc = new Document(dataDir + "Document.TableOfContents.doc");

    // Удалите первое оглавление из документа.
    RemoveTableOfContents(doc, 0);

    dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc";
    // Сохраните вывод.
    doc.Save(dataDir);
    
    Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir);
}
///<summary>
/// Удаляет указанное поле оглавления из документа.
///</summary>
///<param name="doc"> Документ, из которого нужно удалить поле.</param>
///<param name="index"> Отсчитываемый от нуля индекс оглавления для удаления.</param>
public static void RemoveTableOfContents(Document doc, int index)
{
    // Сохраните узлы FieldStart полей TOC в документе для быстрого доступа.
    ArrayList fieldStarts = new ArrayList();
    // Это список для хранения узлов, найденных внутри указанного TOC. они будут удалены
    // В конце этого метода.
    ArrayList nodeList = new ArrayList();

    foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true))
    {
        if (start.FieldType == FieldType.FieldTOC)
        {
            // Добавьте все FieldStarts типа FieldTOC.
            fieldStarts.Add(start);
        }
    }

    // Убедитесь, что оглавление, указанное переданным индексом, существует.
    if (index > fieldStarts.Count - 1)
        throw new ArgumentOutOfRangeException("TOC index is out of range");

    bool isRemoving = true;
    // Получите FieldStart указанного TOC.
    Node currentNode = (Node)fieldStarts[index];

    while (isRemoving)
    {
        // Безопаснее хранить эти узлы и потом удалить их все сразу.
        nodeList.Add(currentNode);
        currentNode = currentNode.NextPreOrder(doc);

        // Как только мы встречаем узел FieldEnd типа FieldTOC, мы знаем, что находимся в конце.
        // Из текущего TOC, и мы можем остановиться здесь.
        if (currentNode.NodeType == NodeType.FieldEnd)
        {
            FieldEnd fieldEnd = (FieldEnd)currentNode;
            if (fieldEnd.FieldType == FieldType.FieldTOC)
                isRemoving = false;
        }
    }

    // Удалить все узлы, найденные в указанном TOC.
    foreach (Node node in nodeList)
    {
        node.Remove();
    }
}

Получите бесплатную лицензию API

Если вы хотите попробовать API без ознакомительных ограничений, вы можете получить бесплатную временную лицензию.

Вывод

В этой статье вы узнали, как работать с оглавлением в документе Word с помощью C#. В пошаговом руководстве и примерах кода показано, как добавлять, обновлять, извлекать и удалять оглавление из документов Word. Вы можете узнать больше об API автоматизации C# Word, используя документацию. Если у вас возникнут какие-либо вопросы или проблемы, свяжитесь с нами через наш форум.

Смотрите также