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


Удалить скрытый текст из документа обработки текста

В этом разделе показано, как использовать классы в пакете 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 задает абсолютное состояние результирующего свойства.

Ниже приведены сведения из спецификации vanishISO/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 типа для получения IEnumerableVanish элемента элементов и приводит их к списку.

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();

Удаление запусков со скрытым текстом и дополнительными исчезаемыми элементами

Чтобы удалить скрытый текст, мы далее циклически переходим к элементу ListVanish элементов . Элемент 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>();
            }
        }
    }
}

См. также