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

Ms word 如何使用OpenXML从段落中查找页码?,ms-word,document,openxml,paragraph,page-numbering,Ms Word,Document,Openxml,Paragraph,Page Numbering,对于段落对象,如何使用Open XML SDK 2.0 For Microsoft Office确定该对象位于哪个页面?使用OpanXml SDK无法获取word文档的页码,因为这是由客户端处理的(如MS word) 但是,如果您正在使用的文档先前已由word客户端打开并保存回,则客户端将添加lastrendedpagebreak,以识别分页符。有关lastrenderdpagebreaks的更多信息,请参阅我的答案。这使您能够计算段落之前的lastrendedpagebreak元素数,以获得当

对于段落对象,如何使用Open XML SDK 2.0 For Microsoft Office确定该对象位于哪个页面?

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

但是,如果您正在使用的文档先前已由word客户端打开并保存回,则客户端将添加
lastrendedpagebreak
,以识别分页符。有关
lastrenderdpagebreak
s的更多信息,请参阅我的答案。这使您能够计算段落之前的
lastrendedpagebreak
元素数,以获得当前页数


如果不是这样的话,那么解决您的需求的noddy选项是添加带有页码的页脚(可能与您的文档颜色相同,以实际上隐藏页脚!)。只有一个选项-如果您正在使用
openxmlsdk

@Flowerking自动生成word文档:谢谢您提供的信息

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

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);
    }
}
使用(var document=WordprocessingDocument.Open(@“c:\test.docx”,false))
{
var paragraphInfos=新列表();
var段落=document.MainDocumentPart.document.subjects();
int pageIdx=1;
foreach(段落中的var段落)
{
var run=段落.GetFirstChild();
如果(运行!=null)
{
var lastrenderdpagebreak=run.GetFirstChild();
var pageBreak=run.GetFirstChild();
如果(lastRenderedPageBreak!=null | | pageBreak!=null)
{
pageIdx++;
}
}
var info=新段落信息
{
段落=段落,
PageNumber=pageIdx
};
段落信息。添加(信息);
}
foreach(段落信息中的var信息)
{
WriteLine(“Page{0}/{1}:'{2}',info.PageNumber,pageIdx,info.paragration.InnerText);
}
}

以下是我为之设计的扩展方法:

    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;
    }
public static int GetPageNumber(此OpenXmlElement元素,OpenXmlElement根)
{
int pageNbr=1;
var Tmplem=元素;
while(tmpElem!=根)
{
var sibling=tmpElem.PreviousSibling();
while(同级!=null)
{
pageNbr+=同级.subjects().Count();
sibling=sibling.PreviousSibling();
}
tmpElem=tmpElem.Parent;
}
返回pageNbr;
}

不错。如果您在Q中包含了一些代码,我应该在我的答案中提供类似的代码。One catch=>
var pageBreak=run.GetFirstChild()在开放Xml中-并非所有的
Break
s都是分页符!对所有未来的访客。。op认为这回答了他的问题。但它在很多情况下都失败了。当您使用多列布局时,它会失败。还
run.GetFirstChild()
将为您提供各种各样的分页符,其中可能包括除分页符以外的分页符。因此,在使用上面的code.doc时,如果您使用了LastRenderedPageBreak,那么请记住这些要点,因为它也会有Break,所以只需使用Break检查就可以了。但是,在某些情况下,不会出现任何分页符,而是将内容扩展到多个页面。如何按页面识别和分隔内容?LastRenderedPageBreak并不总是可用。这将仅统计现有文档中插入的分页符数,例如,在Word中打开后,将插入分页符。如果您自己使用SDK生成文档,文档中唯一的分页符将是您自己插入的分页符,您不需要计算这些分页符。