Вопрос по document, page-numbering, openxml, ms-word, paragraph – Как найти номер страницы из абзаца с помощью OpenXML?

5

ДляПараграф объект, как я могу определить, на какой странице это находится, используя Open XML SDK 2.0 для Microsoft Office?

Ваш Ответ

3   ответа
0

s метод расширения, который я сделал для этого:

    public static int GetPageNumber(this OpenXmlElement elem, OpenXmlElement root)
    {
        int pageNbr = 1;
        var tmpElem = elem;
        while (tmpElem != root)
        {
            var sibling = tmpElem.PreviousSibling();
            while (sibling != null)
            {
                pageNbr += sibling.Descendants<lastrenderedpagebreak>().Count();
                sibling = sibling.PreviousSibling();
            }
            tmpElem = tmpElem.Parent;
        }
        return pageNbr;
    }
</lastrenderedpagebreak>
При этом будет учитываться только количество вставленных разрывов страниц в существующем документе, например как только он был открыт в Word, который вставит разрывы. Если вы генерируете документ самостоятельно, используя SDK, единственные разрывы страниц в документе будут теми, которые вы вставили сами, и вам не нужно будет их считать. IanGSY
LastRenderedPageBreak не всегда доступен HaBo
6

OpanXml Sdk как это обрабатывается клиентом (например, MS Word).

Однако если документ, с которым вы работаете, ранее был открыт с помощью текстового клиента и сохранен обратно, клиент добавитLastRenderedPageBreak определить разрывы страниц. Обратитесь к моему ответуВот для получения дополнительной информации оLastRenderedPageBreaks. Это позволяет рассчитывать на количествоLastRenderedPageBreak элементы перед вашим абзацем, чтобы получить текущее количество страниц.

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

2

Так как мне все равно нужно зациклить все абзацы для поиска определенной строки, я могу использовать следующий код, чтобы найти номер страницы:

using (var document = WordprocessingDocument.Open(@"c:\test.docx", false))
{
    var paragraphInfos = new List<paragraphinfo>();

    var paragraphs = document.MainDocumentPart.Document.Descendants<paragraph>();

    int pageIdx = 1;
    foreach (var paragraph in paragraphs)
    {
        var run = paragraph.GetFirstChild<run>();

        if (run != null)
        {
            var lastRenderedPageBreak = run.GetFirstChild<lastrenderedpagebreak>();
            var pageBreak = run.GetFirstChild<break>();
            if (lastRenderedPageBreak != null || pageBreak != null)
            {
                pageIdx++;
            }
        }

        var info = new ParagraphInfo
        {
            Paragraph = paragraph,
            PageNumber = pageIdx
        };

        paragraphInfos.Add(info);
    }

    foreach (var info in paragraphInfos)
    {
        Console.WriteLine("Page {0}/{1} : '{2}'", info.PageNumber, pageIdx, info.Paragraph.InnerText);
    }
}
</break></lastrenderedpagebreak></run></paragraph></paragraphinfo>
Документ, в котором у вас есть LastRenderedPageBreak, также будет иметь Break, поэтому будет достаточно просто использовать проверку Break. Но есть сценарии, в которых не будет разрывов, кроме содержания, распространяемого на несколько страниц. Как вы идентифицируете и разделяете содержимое по страницам? HaBo
Всем будущим посетителям .. ОП считает, что это отвечает на его вопрос. Но это терпит неудачу во многих случаях. Сбой, когда вы используете многостолбцовый макет. Такжеrun.GetFirstChild(); собирается дать вам все виды разрывов, которые могут включать в себя разрывы, кроме просто разрывы страниц. Так что имейте в виду эти моменты при использовании приведенного выше кода. Flowerking
Ницца. Я должен предоставить аналогичный код в своем ответе, если вы включили какой-то код в свой Q. Один улов =>  var pageBreak = run.GetFirstChild(); в Open Xml - не всеBreaks это разрывы страниц! Flowerking

Похожие вопросы