我有一个docx
文件,想要生成图片文件名/唯一ID组合的列表。
以下是docx
文件的相关部分:
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="2C4CE07B" wp14:editId="12367BBF">
...
...
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="2" name="ProfileGraph.png" />
<pic:cNvPicPr />
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId9">
<a:extLst>
所以我需要在一个目录条目中rId9
和ProfileGraph.png
。
我可以找到rId9
:
var blipElements = from drawing in drawingElements
where drawing.Descendants<A.Blip>().Count() > 0
select drawing.Descendants<A.Blip>().First();
但我不知道如何让cNvPr-elements
属于Blips
中的每个blipElements
。
我正在思考
var names = from blip in blipElements
where blip.Ancestors<Picture>().First<Picture>().Descendants<....>()
任何帮助都将不胜感激。
答案 0 :(得分:2)
像
这样的东西var body = doc.MainDocumentPart.Document.Body;
var pics = body.Descendants<DocumentFormat.OpenXml.Drawing.Pictures.Picture>();
var result = pics.Select(p => new
{
Id = p.BlipFill.Blip.Embed.Value,
Name = p.NonVisualPictureProperties.NonVisualDrawingProperties.Name.Value
});
假设doc是已打开的WordProcessingDocument对象。
结果变量将是包含Id和Name属性的匿名类型的IEnumerable。
我对处理OpenXML的文字并不是特别了解,但理论上,Embed和Name属性可能为null,所以我想你可能必须在访问'.Value'属性之前测试null。