Поделиться через


Заменить заголовок в текстовом редакторе

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программной замены заголовка в документе Word.

Структура элемента ссылки верхнего колонтитула

В этом примере рассматривается удаление части верхнего колонтитула из конечного файла и создание другой части верхнего колонтитула. Также рассматривается удаление ссылки на существующий верхний колонтитул и создание ссылки на новый верхний колонтитул. Поэтому полезно ознакомиться с заголовками и ссылочным элементом заголовка. Следующие сведения из спецификации ISO/IEC 29500 представляют элемент ссылки верхнего колонтитула.

headerReference (ссылка верхнего колонтитула)

Этот элемент определяет один верхний колонтитул, который будет связан с текущим разделом документа. Ссылка на этот верхний колонтитул создается посредством атрибута id, который определяет явную связь с соответствующей частью верхнего колонтитула в пакете WordprocessingML.

Если тип отношения, указанного этим элементом, отличается от https://schemas.openxmlformats.org/officeDocument/2006/header или не указан либо для его атрибута TargetMode не задано значение Internal, то документ считается несоответствующим.

Каждый раздел документа может содержать заголовки трех типов:

  • Верхний колонтитул первой страницы

  • Верхний колонтитул нечетной страницы

  • Верхний колонтитул четной страницы

Тип верхнего колонтитула, определяемый текущим элементов headerReference, определяется посредством атрибута type.

При отсутствии какого-либо типа верхнего колонтитула в данном разделе применяются следующие правила.

  • Если для верхнего колонтитула первой страницы не определен headerReference и задан элемент titlePg, в этом случае верхний колонтитул первой страницы наследуется от предыдущего раздела; если это первый раздел документа, создается новый пустой верхний колонтитул. Если элемент titlePg не задан, верхний колонтитул первой страницы не отображается и на его месте будет использоваться верхний колонтитул нечетной страницы.

  • Если для верхнего колонтитула четной страницы задан элемент headerReference и определен элемент evenAndOddHeaders, верхний колонтитул четной страницы наследуется от предыдущего раздела; если это первый раздел документа, создается новый пустой верхний колонтитул. Если элемент evenAndOddHeaders не задан, верхний колонтитул четной страницы не отображается и на его месте будет использоваться верхний колонтитул нечетной страницы.

  • Если для верхнего колонтитула нечетной страницы задан элемент headerReference, верхний колонтитул четной страницы наследуется от предыдущего раздела; если это первый раздел документа, создается новый пустой верхний колонтитул.

Пример. Рассмотрим трехстраничный документ, в котором различные верхние колонтитулы первой, четной и нечетной страницы определены следующим образом:

Трехстраничный документ с разными заголовками

В этом документе определены три верхних колонтитула, каждый из которых содержит связь из части документа с уникальным идентификатором связи, как показано в следующей разметке упаковки:

    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
      …
      <Relationship Id="rId2" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header1.xml" />
      <Relationship Id="rId3" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header2.xml" />
      <Relationship Id="rId5" Type="https://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header3.xml" />
      …
    </Relationships>

Затем в свойствах раздела добавляются ссылки на эти отношения с помощью следующего кода WordprocessingML:

    <w:sectPr>  
      …  
      <w:headerReference r:id="rId3" w:type="first" />  
      <w:headerReference r:id="rId5" w:type="default" />  
      <w:headerReference r:id="rId2" w:type="even" />  
      …  
    </w:sectPr>  

Полученный раздел использует часть верхнего колонтитула с идентификатором связи rId3 для первой страницы, часть верхнего колонтитула с идентификатором связи rId2 для всех последующих четных страниц, а также часть верхнего колонтитула с идентификатором связи rId5 для всех последующих нечетных страниц. конечный пример

© ISO/IEC 29500: 2016

Пример кода

В следующем примере кода показано, как заменить верхний колонтитул в текстовом документе на верхний колонтитул из другого текстового документа. Чтобы вызвать метод , AddHeaderFromToможно использовать следующий сегмент кода в качестве примера.

string fromFile = args[0];
string toFile = args[1];

AddHeaderFromTo(fromFile, toFile);

Ниже приведен полный пример кода на языках C# и Visual Basic.

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;


static void AddHeaderFromTo(string fromFile, string toFile)
{
    // Replace header in target document with header of source document.
    using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(toFile, true))
    using (WordprocessingDocument wdDocSource = WordprocessingDocument.Open(fromFile, true))
    {
        if (wdDocSource.MainDocumentPart is null || wdDocSource.MainDocumentPart.HeaderParts is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or HeaderParts is null.");
        }

        if (wdDoc.MainDocumentPart is null)
        {
            throw new ArgumentNullException("MainDocumentPart is null.");
        }

        MainDocumentPart mainPart = wdDoc.MainDocumentPart;

        // Delete the existing header part.
        mainPart.DeleteParts(mainPart.HeaderParts);

        // Create a new header part.
        DocumentFormat.OpenXml.Packaging.HeaderPart headerPart = mainPart.AddNewPart<HeaderPart>();

        // Get Id of the headerPart.
        string rId = mainPart.GetIdOfPart(headerPart);

        // Feed target headerPart with source headerPart.

        DocumentFormat.OpenXml.Packaging.HeaderPart? firstHeader = wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault();

        wdDocSource.MainDocumentPart.HeaderParts.FirstOrDefault();

        if (firstHeader is not null)
        {
            headerPart.FeedData(firstHeader.GetStream());
        }

        if (mainPart.Document.Body is null)
        {
            throw new ArgumentNullException("Body is null.");
        }

        // Get SectionProperties and Replace HeaderReference with new Id.
        IEnumerable<DocumentFormat.OpenXml.Wordprocessing.SectionProperties> sectPrs = mainPart.Document.Body.Elements<SectionProperties>();
        foreach (var sectPr in sectPrs)
        {
            // Delete existing references to headers.
            sectPr.RemoveAllChildren<HeaderReference>();

            // Create the new header reference node.
            sectPr.PrependChild<HeaderReference>(new HeaderReference() { Id = rId });
        }
    }
}