有没有办法检索"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\*.*"
,可以轻松修改代码以提取任何媒体文件,但是从文件夹树向下移动文件的清理变得有点乏味。
背景:
我是 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.
问题:
我想我可以使用“将图片另存为 .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\*.*"
,可以轻松修改代码以提取任何媒体文件,但是从文件夹树向下移动文件的清理变得有点乏味。