Удалить скрытый текст из документа обработки текста
В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного удаления скрытого текста из текстового документа.
Структура документа WordProcessingML
Базовая структура WordProcessingML
документа состоит из document
элементов и body
, за которыми следует один или несколько элементов уровня блока, таких как p
, который представляет абзац. Абзац содержит один или несколько r
элементов. Представляет r
собой область текста с общим набором свойств, таких как форматирование. Выполнение содержит один или несколько t
элементов. Элемент t
содержит диапазон текста. В следующем примере кода показана разметка WordprocessingML
для документа, содержащего текст "Пример текста".
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:r>
<w:t>Example text.</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
С помощью пакета SDK Open XML можно создавать структуру документа и содержимое с помощью строго типизированных классов, соответствующих WordprocessingML
элементам. Эти классы находятся в пространстве имен. В следующей таблице перечислены имена классов, которые соответствуют document
элементам , body
, p
, r
и t
.
Элемент WordprocessingML | Класс пакета SDK Open XML | Описание |
---|---|---|
<document/> |
Document | Корневой элемент основной части документа. |
<body/> |
Body | Контейнер для структур уровня блокировки, таких как абзацы, таблицы, примечания и других элементов, описанных в спецификации ISO/IEC 29500. |
<p/> |
Paragraph | Абзац. |
<r/> |
Run | Прогон. |
<t/> |
Text | Диапазон текста. |
Дополнительные сведения об общей структуре частей и элементов документа WordprocessingML см. в разделе Структура документа WordprocessingML.
Структура элемента Vanish
Элемент vanish
играет важную роль в скрытии текста в файле Word. Свойство Hidden
форматирования является переключиванием, что означает, что его поведение отличается между его использованием в определении стиля и его использованием в качестве прямого форматирования. При использовании в качестве части определения стиля задание этого свойства переключает его текущее состояние.
Установка значения false
(или эквивалента) приведет к тому, что текущий параметр останется неизменным. Однако при использовании в качестве прямого форматирования присвойте ему true
значение или false
задает абсолютное состояние результирующего свойства.
Ниже приведены сведения из спецификации vanish
ISO/IEC 29500.
vanish (Hidden Text)
Этот элемент указывает, должно ли содержимое этого выполнения скрываться от отображения во время отображения в документе. [Примечание. Параметр должен влиять на обычное отображение текста, но приложение может иметь параметры принудительного отображения скрытого текста. конечная заметка]
Это свойство — переключаемое (§17.7.3).
Если этот элемент отсутствует, значение по умолчанию — оставить форматирование на предыдущем уровне иерархии стилей. Если этот элемент никогда не применяется в иерархии стилей, этот текст не должен быть скрыт при отображении в документе.
[Пример: рассмотрим пробег текста с включенным свойством скрытого текста. Это ограничение указано с помощью следующего свойства WordprocessingML:
<w:rPr>
<w:vanish />
</w:rPr>
В этом пробеге объявляется свойство vanish, поэтому его содержимое будет скрыто при отображении документа. конец примера]
© ISO/IEC 29500: 2016
Следующий сегмент схемы XML определяет содержимое этого элемента.
<complexType name="CT_OnOff">
<attribute name="val" type="ST_OnOff"/>
</complexType>
Свойство val
в приведенном выше коде является двоичным значением, которое можно включить или отключить. Если задано on
значение , 1
или true
свойство включено. Если задано значение off
, 0
или false
свойство отключено.
Принципы работы кода
Метод WDDeleteHiddenText
работает с указанным документом и удаляет все скрытые run
элементы и удаляет дополнительные vanish
элементы. Код начинается с открытия документа с помощью Open метода и указания, что документ должен быть открыт для чтения и записи (последний параметр true). Учитывая открытый документ, код использует MainDocumentPart свойство для перехода к документу main, сохраняя ссылку в переменной.
using (WordprocessingDocument doc = WordprocessingDocument.Open(docName, true))
{
Получение списка исчезнувая элементов
Код сначала проверяет, что doc.MainDocumentPart
и doc.MainDocumentPart.Document.Body
не имеют значения NULL, и создает исключение, если оно отсутствует. Затем использует метод передачи Descendants()Vanish типа для получения IEnumerable
Vanish
элемента элементов и приводит их к списку.
if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Get a list of all the Vanish elements
List<Vanish> vanishes = doc.MainDocumentPart.Document.Body.Descendants<Vanish>().ToList();
Удаление запусков со скрытым текстом и дополнительными исчезаемыми элементами
Чтобы удалить скрытый текст, мы далее циклически переходим к элементу List
Vanish
элементов . Элемент Vanish
является дочерним элементом RunProperties объекта , но RunProperties
может быть дочерним элементом Run или xref:DocumentFormat.OpenXml.Wordprocessing.ParagraphProperties>, поэтому мы получаем родителей и дедушек каждого Vanish
и проверка его тип. Затем, если бабушка и дедушка является , Run
мы удаляем этот запуск, а если нет, мы удаляем дочерние Vanish
элементы из родительского элемента.
// Loop over the list of Vanish elements
foreach (Vanish vanish in vanishes)
{
var parent = vanish?.Parent;
var grandparent = parent?.Parent;
// If the grandparent is a Run remove it
if (grandparent is Run)
{
grandparent.Remove();
}
// If it's not a run remove the Vanish
else if (parent is not null)
{
parent.RemoveAllChildren<Vanish>();
}
}
Пример кода
Примечание.
В этом примере предполагается, что открываемый файл содержит скрытый текст. Чтобы скрыть часть текста файла, выберите его и нажмите сочетание клавиш CTRL+В, чтобы открыть диалоговое окно Шрифт. Выберите поле Скрытый и нажмите кнопку ОК.
Ниже приведен полный пример кода на языках C# и Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;
static void WDDeleteHiddenText(string docName)
{
// Given a document name, delete all the hidden text.
using (WordprocessingDocument doc = WordprocessingDocument.Open(docName, true))
{
if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
// Get a list of all the Vanish elements
List<Vanish> vanishes = doc.MainDocumentPart.Document.Body.Descendants<Vanish>().ToList();
// Loop over the list of Vanish elements
foreach (Vanish vanish in vanishes)
{
var parent = vanish?.Parent;
var grandparent = parent?.Parent;
// If the grandparent is a Run remove it
if (grandparent is Run)
{
grandparent.Remove();
}
// If it's not a run remove the Vanish
else if (parent is not null)
{
parent.RemoveAllChildren<Vanish>();
}
}
}
}