如何使用OpenXML从段落中查找页码?

时间:2013-02-18 12:46:39

标签: ms-word document openxml paragraph page-numbering

对于段落对象,如何使用适用于Microsoft Office的Open XML SDK 2.0确定它所在的页面?

3 个答案:

答案 0 :(得分:6)

使用OpanXml Sdk无法获取word文档的页码,因为这是由客户端(如MS Word)处理的。

但是,如果您正在使用的文档之前由单词客户端打开并保存回来,则客户端将添加LastRenderedPageBreak以识别分页符。有关LastRenderedPageBreak的更多信息,请参阅我的回答here。这使您可以计算段落前LastRenderedPageBreak个元素的数量,以获取当前页数。

如果不是这种情况,那么解决您的要求的noddy选项是添加页码的页脚(可能与您的文档颜色相同,以实际隐藏它!)。只有一个选项 - 如果您使用OpenXML sdk自动生成Word文档。

答案 1 :(得分:2)

@Flowerking:感谢您提供的信息。

因为我需要循环所有段落来搜索某个字符串,我可以使用以下代码来查找页码:

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

答案 2 :(得分:0)

这是我为此做出的扩展方法:

    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;
    }