对于一个段落对象,我如何使用Microsoft Office的Open XML SDK 2.0确定它位于哪一页?
对于一个段落对象,我如何使用Microsoft Office的Open XML SDK 2.0确定它位于哪一页?
使用OpanXml Sdk
无法获取Word文档的页码,因为这是由客户端(如MS Word)处理的。
但是,如果您正在处理的文档先前已被Word客户端打开并保存,则客户端将添加 LastRenderedPageBreak
以标识分页符。有关LastRenderedPageBreak
s的更多信息,请参见我的回答此处。这使您可以计算在您的段落之前的LastRenderedPageBreak
元素的数量以获取当前页数。
如果不是这种情况,则围绕您的要求解决问题的简单方法是添加带有页码的页脚(可以使用与文档相同颜色来虚拟隐藏它!)。仅当您正在使用OpenXML sdk
自动化Word文档生成时才可选。
@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);
}
}
run.GetFirstChild<Break>();
会给你各种类型的换行符,可能包括除了页面分隔符以外的其他分隔符。因此,在使用上述代码时请牢记这些要点。 - Flowerking 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;
}