Заменить заголовок в текстовом редакторе
В этом разделе показано, как использовать классы в пакете 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 });
}
}
}