有没有办法检索"as is"内部存储的与PowerPoint演示文稿中的图片对应的EMF文件?

Is there a way to retrieve "as is" the internally stored EMF file corresponding to a picture in a PowerPoint presentation?

背景:
我是 IguanaTex 的开发者,这是一个 PowerPoint 插件,用于在 Windows 和 Mac.
上将 LaTeX displays/equations 插入到 PowerPoint 中 许多 Mac 用户使用另一个软件 LatexIt 将 LaTeX 生成的 PDF 插入到 PowerPoint(和其他应用程序)中; PDF 以相当复杂的方式将 LaTeX 源存储为元数据,并且此元数据仍然可以在 PowerPoint 内部用于存储 PDF 的 EMF 文件中访问(可以通过解压缩 .pptx 文件获得)。它也保存在使用 Mac.
上的“将图片另存为 PDF”创建的 PDF 中 我想允许 Windows 上的 IguanaTex 用户检索 LaTeX 信息,以便他们可以修改 Mac.

上的 LatexIt 用户创建的幻灯片

问题:
我想我可以使用“将图片另存为 .emf”来提取与插入的 PDF 对应的内部 EMF,并对其进行解析。 LatexIt 的开发人员准备了一个 Windows 可执行文件,可以从 EMF 文件(例如 PowerPoint 内部存储的文件)中检索该信息。
不幸的是,我意识到在 Windows 上使用“将图片另存为 .emf”从通过在 Mac 上插入 PDF 获得的图片获取 EMF 文件并没有生成 PowerPoint 内部使用的相同 EMF 文件,并且 LatexIt 元数据在此过程中丢失。

我很悲观,但有人能找到解决办法吗?以某种方式访问​​内部 EMF 文件,或者使用其他一些程序将其另存为 EMF?

澄清一下情况:我在 Windows 上有一个 open .pptx 文件,里面可能有几十个 pictures/shapes/etc,其中一个选定的形状我知道内部是 EMF 图片的文件;如何使用 VBA 提取 EMF 文件?

这里是提取演示文稿内部存储中与所选图片形状对应的文件的代码(msoPicture,这里是 EMF 类型,但它可以是任何支持的类型:JPG、PNG、GIF、. ..):

Option Explicit

Sub ExtractShapeImageFromZip() 
    ' This can be easily modified to take input arguments:
    ' ExtractShapeImageFromZip(vSh As Shape, Optional ImageType As String = "EMF")
    
    Dim Sel As Selection
    Set Sel = Application.ActiveWindow.Selection
    Dim vSh As Shape
    Set vSh = Sel.ShapeRange(1)
    
    Dim ImageType As String
    ImageType = "EMF" ' <- change the type here
    Dim ImageExt As String
    ImageExt = "." & LCase$(ImageType)
    Dim ImageFilter As String
    ImageFilter = "ppt\media\image1" & ImageExt
    
    Dim StartFolder As String
    StartFolder = ActivePresentation.Path

    Dim FilePrefix As String
    FilePrefix = StartFolder & "\ExtractFromZip_tmp"
        
    ' Variables for the Shell execution call
    Dim TimeOutTimeString As String
    TimeOutTimeString = "20" ' Wait N seconds for the processes to complete
    Dim TimeOutTime As Long
    TimeOutTime = Val(TimeOutTimeString) * 1000
    Dim debugMode As Boolean
    debugMode = False
    Dim RetVal As Long
    
    Dim fs As Object
    Set fs = CreateObject("Scripting.FileSystemObject")
    
    If vSh.Type = msoPicture Then
        ' Copy/Paste shape to new presentation
        Dim NewPres As Presentation
        Set NewPres = Presentations.Add(msoFalse)
        Dim NewSlide As Slide
        Set NewSlide = NewPres.Slides.Add(Index:=1, Layout:=ppLayoutBlank)
        Dim NewShape As Shape
        vSh.Copy
        NewPres.Slides(1).Shapes.Paste
        NewPres.SaveAs (FilePrefix & ".pptx")
        NewPres.Close
        Set NewPres = Nothing
        fs.CopyFile FilePrefix & ".pptx", FilePrefix & ".zip", True
        fs.DeleteFile FilePrefix & ".pptx"
        RetVal& = Execute("unzip -o " & FilePrefix & ".zip" & " " & ImageFilter _
                            & " -d " & FilePrefix, StartFolder, debugMode, TimeOutTime)
        If fs.FileExists(FilePrefix & ".zip") Then
            fs.DeleteFile FilePrefix & ".zip"
        End If
        If fs.FileExists(FilePrefix & "\" & ImageFilter) Then
            fs.CopyFile FilePrefix & "\" & ImageFilter, FilePrefix & ImageExt
            Dim picPath As String
            picPath = FilePrefix & ImageExt
            MsgBox "File of type " & ImageType & " successfully extracted to " & picPath
        End If
        If fs.FolderExists(FilePrefix) Then
            fs.DeleteFolder FilePrefix
        End If
    End If
    
End Sub

至运行unzip,以上代码使用Shell执行代码为implemented in IguanaTex (remove the ClipBoard call, which is unnecessary here and comes from another module), largely borrowed from Terry Kreft's "Shell and Wait" .

通过将 unzip 命令中使用的过滤器更改为 "ppt\media\*.*",可以轻松修改代码以提取任何媒体文件,但是从文件夹树向下移动文件的清理变得有点乏味。