将选定的 PowerPoint 形状(或 DrawingML)转换为 XAML

Posted

技术标签:

【中文标题】将选定的 PowerPoint 形状(或 DrawingML)转换为 XAML【英文标题】:Convert Selected PowerPoint Shapes (or DrawingML) to XAML 【发布时间】:2015-11-12 17:04:07 【问题描述】:

我需要将选定的 PowerPoint 形状转换为 XAML,以便在我的 WPF 应用程序中有效地放置一个等效的基于矢量的形状(XAML 最终结果必须是可缩放 - 转换为图像会破坏我正在尝试做的事情的目的)。

我愿意采用多种方法来实现这一点,包括编写 PowerPoint 插件(如果这可以让我访问 PowerPoint 中所选形状的贝塞尔点坐标)。我对 PowerPoint 插件不够熟悉,不知道这是否可行。

我的第一种方法是将 PowerPoint 形状复制到剪贴板,然后将剪贴板内容转换为我可以理解的对象,然后从那里生成 XAML。如果我这样做,我可以获取 DrawingML 表示(通过 Art::GVML ClipFormat),但目前尚不清楚如何轻松地将 DrawingML 转换为 XAML(看起来需要数周的从头开始创建容易出错的工作)。

剪贴板上还有其他可用的格式(EMF、System.Drawing.Imaging.Metafile、PowerPoint 12.0 Internal Shapes),但它们似乎都是死胡同。

有什么建议吗?

【问题讨论】:

您需要使用什么版本的 PowerPoint 文档? pptx 或 ppt 或两者兼而有之 我没有使用任何保存的 PowerPoint 文档。我正在实时处理 PowerPoint 应用程序。 那么什么 PowerPoint 版本 2003、2007、2010、2013...? 【参考方案1】:

你可以试试这个:

WMF 的 Powerpoint 形状

Microsoft.Office.Interop.PowerPoint.Application app = new Microsoft.Office.Interop.PowerPoint.Application();
var pps = app.Presentations;
string d ="filepath.pptx";
Presentation ppt = pps.Open(d, MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
for (int j = 1; j < ppt.Slides.Count; j++)

    Slide sld = ppt.Slides[j];
    List<Microsoft.Office.Interop.PowerPoint.Shape> shapes = new List<Microsoft.Office.Interop.PowerPoint.Shape>();
    for (int k = 1; k < sld.Shapes.Count; k++)
    
        Microsoft.Office.Interop.PowerPoint.Shape shape = sld.Shapes[k]; 
        shape.Export("outputFilePath.wmf", PpShapeFormat.ppShapeFormatWMF);
    

然后 WMF 到 XAML:Microsoft Forum:

1) 查看http://www.wpf-graphics.com/ReaderWmf.aspx 及其相关项目http://www.wpf-graphics.com/Paste2Xaml.aspx。这些是 WPF 的 EMF/WMF 阅读器。您将编写一个简单的实用程序来读取图像并再次将它们写回。我和他们一起玩了一点,和他们相处得很好。如果他们会为你工作,这将是我的第一选择。当然,您需要测试它们。由于各种格式之间的设计差异,这样的转换永远不会完美,因此请确保您没有使用转换器不支持的东西。

2) 我遇到的另一个项目是http://lab.aspitalia.com/15/EmfToXaml-Beta.aspx。我没玩过,你可以看看。

3) 如果直接路由不起作用,您可以考虑将 WMF 文件转换为不同的矢量格式,例如 SVG,然后将该 SVG 文件转换为 XAML。有很多用于 EMF/WMF 到 SVG 转换的工具。对于 SVG 到 XAML 的转换,您可以查看 http://www.codeplex.com/XamlTune 和 http://www.wpf-graphics.com/ReaderSvg.aspx。我怀疑这会像直接转换一样有效,但你永远不知道。

关于 PowerPoint 加载项和运行上述示例您需要 Microsoft Office 互操作库。

【讨论】:

以上是关于将选定的 PowerPoint 形状(或 DrawingML)转换为 XAML的主要内容,如果未能解决你的问题,请参考以下文章

使用空占位符将图像插入幻灯片(PowerPoint)

PowerPoint 互操作:如果完成速度过快,复制粘贴形状会崩溃

Powerpoint VBA 选择幻灯片特定区域内的所有形状

将插入的 EMF 文件解组到 Powerpoint 时出现失真

PowerPoint VBA:如何将动画开始事件设置为“ With Previous”

如何在draw io中添加自定义数字到形状