在Presentation OpenXml中从SmartArt中提取文本

时间:2014-09-23 06:05:58

标签: c# .net openxml diagram presentation

我需要从.net(VB.NET或C#)中的PowerPoint OpenXml格式(pptx)中提取所有文本 大家都知道,pptx是一个压缩文件,里面有一些文件夹。 我正在使用OpenXmlPowerTools。 我设法从幻灯片文件夹(slidespart)中提取文本,但我注意到我的powerpoint文档示例中有更多文本未被提取。此文本包含在smartart中,不包含在slidespart xml文件中。我知道文本位于文件“data1.xml”的pptx文件夹“/ diagrams”中,但我不知道如何调用此部分。 一个例子: 要调用文本在幻灯片中的文件,我参考OpenXmldocument.PresentationPart.SlideParts,然后我自己解析XML。 但我不知道文件夹“图”的部分名称。 你可以帮帮我吗? 提前谢谢。

smartart的XML示例

-<dgm:pt type="doc" modelId="{8B66E7B5-44C3-4667-8338-7D4A025BD5D4}">

<dgm:prSet phldr="1" csCatId="accent2" csTypeId="urn:microsoft.com/office/officeart/2005/8/colors/accent2_3" qsCatId="simple" qsTypeId="urn:microsoft.com/office/officeart/2005/8/quickstyle/simple5" loCatId="process" loTypeId="urn:microsoft.com/office/officeart/2005/8/layout/hProcess11"/>

<dgm:spPr/>


-<dgm:t>

<a:bodyPr/>

<a:lstStyle/>


-<a:p>

<a:endParaRPr lang="pt-PT"/>

</a:p>

</dgm:t>

</dgm:pt>


-<dgm:pt modelId="{2E9EC466-8028-4506-882E-42A5A1CC8163}">

<dgm:prSet custT="1" phldrT="[Texto]"/>

<dgm:spPr/>


-<dgm:t>

<a:bodyPr anchor="t"/>

<a:lstStyle/>


-<a:p>


-<a:r>


-<a:rPr lang="pt-PT" smtClean="0" dirty="0" sz="1200">

<a:latin typeface="+mn-lt"/>

<a:cs typeface="Arial" charset="0" pitchFamily="34"/>

</a:rPr>

<a:t>Apresentação Conceptual - Plano</a:t>

</a:r>


-<a:endParaRPr lang="pt-PT" dirty="0" sz="1200">

<a:latin typeface="+mn-lt"/>

<a:cs typeface="Arial" charset="0" pitchFamily="34"/>

</a:endParaRPr>

</a:p>

</dgm:t>

</dgm:pt>

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,发现了你的问题,我把它解决了:

static void Main(string[] args)
{
    using (var p = PresentationDocument.Open(@"SmartArt.pptx", true))
    {
        foreach (var slide in p.PresentationPart.GetPartsOfType<SlidePart>().Where(sp => IsVisible(sp)))
        {
            foreach(var diagramPart in slide.DiagramDataParts)
            {
                foreach(var text in diagramPart.RootElement.Descendants<Run>().Select(d => d.Text.Text))
                {
                    Console.WriteLine(text);
                }
            }
        }
    }

    Console.ReadLine();
}

private static bool IsVisible(SlidePart s)
{
    return (s.Slide != null) &&
      ((s.Slide.Show == null) || (s.Slide.Show.HasValue &&
      s.Slide.Show.Value));
}