Как я могу заменить разрывы строк ничем/пустой строкой с помощью библиотеки DocX?

Мне нужно сохранить разрывы абзацев в файле .docx, но избавиться от разрывов строк, которые часто оказываются не в том месте при копировании из одного файла в другой (из-за разных размеров страниц и при изменении шрифта).

Используя библиотеку DocX, я пытаюсь сделать следующее:

private void ReplaceLineBreaksWithBoo(string filename)
{
    List<string> lineBreaks;
    using (DocX document = DocX.Load(filename))
    {
        lineBreaks = document.FindUniqueByPattern("\n", System.Text.RegularExpressions.RegexOptions.None);
        if (lineBreaks.Count > 0)
        {
            foreach (string s in lineBreaks)
            {
                document.ReplaceText(s, string.empty); // <-- or a space?
            }
        }
        document.Save();
    }
}

... но это не работает - я считаю, что "\n" не подходит; Я не знаю, что мне нужно для этого первого аргумента метода FindUniqueByPattern(). Документации нет, а дискуссионный форум напоминает Боди, Калифорния:

введите здесь описание изображения


person B. Clay Shannon    schedule 03.01.2014    source источник
comment
вы пробовали \r ? вы должны иметь возможность перейти в режим отладки и посмотреть, что это за символы.   -  person T McKeown    schedule 04.01.2014
comment
Вы пытались использовать «Environment.NewLine» вместо «\ n»?   -  person Nikola Mitev    schedule 04.01.2014
comment
Используя как Environment.NewLine, так и \r (и \n), linebreakCount == 0.   -  person B. Clay Shannon    schedule 04.01.2014


Ответы (1)


Я думаю, вы не можете сделать это, используя FindUniqueByPattern или FindAll. Новая строка не представлена ​​никаким символом, а сохраняется как абзац с пустым текстом. Вы можете просмотреть представление документа в формате xml из свойства document.Xml, там вы увидите пустую строку, хранящуюся как один элемент <w:p>.

Поэтому вы можете искать абзацы с пустым текстом вместо поиска символа новой строки:

using (DocX document = DocX.Load(filename))
{
    var emptyLines = document.Paragraphs.Where(o => string.IsNullOrEmpty(o.Text));
    foreach (var paragraph in emptyLines)
    {
        paragraph.Remove(false);
    }
    document.Save();
}
person har07    schedule 04.01.2014