动画幻灯片转换为静态PDF

20

对于那些制作带有动画的ppt幻灯片的人,比如:

  • 逐个显示要点
  • 逐个显示图片或缩放图表
  • 显示活动元素的边框
  • 内部导航/菜单/链接到另一个幻灯片
  • 幻灯片之间的转换

是否有一种工具可以将ppt转换为PDF并保留每个动画在单独的幻灯片中?

我知道你可以使用LaTeX Beamer创建动画幻灯片,并且可以很好地转换为PDF,我已经制作了一些这样的幻灯片,但我也有一些ppt文件想要转换为PDF。

我尝试过以下方法:

  • Slideshare,然而它不仅不支持动画,而且内部导航不起作用,字体也都错乱了。
  • PDFcreator,与之相比,质量相当优越,但它也不支持动画。与Slideshare类似,它只会将一个图像放在另一个图像上。此外,它不支持透明度(例如,半透明背景的文本框覆盖在图像上)
  • LaTeX Beamer,已经提到过,但我宁愿避免将这些ppt内容和动画键入LaTeX中,只是为了在PDF中正确显示动画。

我在Stack Overflow上进行了搜索,并没有找到令人满意的处理动画的答案。你用什么方法呢?

4个回答

19

我发现了一个小插件,可以在幻灯片中有动画效果时将它们分开。如果你的一张幻灯片上有3个动画效果,它会生成3张幻灯片,每张包含逐步呈现的动画效果。然后将其导出为PDF :-)

对我来说,它在PowerPoint 2010上可以使用。我建议您在拆分之前备份演示文稿文件,并记得取消选择“单击触发动画的拆分”选项。

http://www.dia.uniroma3.it/~rimondin/downloads.php

我还发现了这个(但第一个解决方案是免费且有效的),如下链接: http://www.verypdf.com/wordpress/201306/how-to-create-a-pdf-from-powerpoint-with-animations-36850.html


FYI,我还没有使用过它,但一篇博客文章表明rimondin的PPspliT可以与PowerPoint 2016一起使用。 - Peter L
我刚刚使用了PowerPoint 2016!效果非常好 :) PS:你必须先告诉它要拆分,然后再保存。如果不想丢失动画,请勿覆盖自己的ppt。 - Fawix
2
你知道除了下载为PPT并拆分之外,有没有其他方法可以在Google幻灯片上实现这个功能吗? - RoB
1
关于将带有动画的幻灯片分成多个幻灯片的任何转换,需要注意一点 - 这可能会更改每个幻灯片上的幻灯片计数器。如果从生成的PowerPoint文件创建PDF,则每个幻灯片上的数字将与原始演示文稿不同。 - Clare Macrae
1
@ClareMacrae 作者已经考虑到了这一点。默认情况下,ppspli将保留原始幻灯片编号。 - undefined

7
这篇博客文章提供了一个VBA宏脚本,可以将所有带动画的幻灯片(如逐个出现的图片或符号点)分成多张幻灯片,然后保存为PDF文件,即可实现目标!重要的是,由于这是一个VBA脚本,它应该可以在Windows和Mac系统上使用。我只在OSX(Yosemite)上使用过PowerPoint 2011测试过,效果很好。唯一的问题是,带有逐个出现的符号点的幻灯片会被分成多张幻灯片,但每张幻灯片仍包含所有的符号点,因此需要手动删除一些。不过,对于其他所有东西,它都运作得非常好,与全手动完成相比,这是一个小小的代价,尤其是对于图像动画。当然,您可能在Windows或其他版本的PP中遇到同样的问题或不同的问题。无论如何,在OSX上,这是我迄今为止找到的唯一可行的解决方案。

有关如何将VBA宏添加到PowerPoint的说明,请在此找到。

希望对您也有用!


这在Powerpoint Mac 2008中不起作用,因为该版本的PP不支持VBA。前一个版本和后一个版本支持,但2008版本不支持。 - garyp

4
这篇博客文章提供了一个VBA宏脚本,可以将具有动画效果的每个幻灯片分割成多个幻灯片,并且在扩展幻灯片前不保留原始幻灯片(就像此答案中所示)。
这个宏和其他宏存在的问题是,具有多个动画的文本块的内容总是作为整体显示(例如,如果同一个文本块的每个句子都有单独的动画,则所有句子将总是一起显示)。 VBA代码:
Private AnimVisibilityTag As String

Sub ExpandAnimations()
AnimVisibilityTag = "AnimationExpandVisibility"

Dim pres As Presentation
Dim Slidenum As Integer

Set pres = ActivePresentation
Slidenum = 1
Do While Slidenum <= pres.Slides.Count
Dim s As Slide
Dim animationCount As Integer
Set s = pres.Slides.Item(Slidenum)

If s.TimeLine.MainSequence.Count > 0 Then
    Set s = pres.Slides.Item(Slidenum)
    PrepareSlideForAnimationExpansion s
    animationCount = expandAnimationsForSlide(pres, s)
Else
    animationCount = 1
End If
Slidenum = Slidenum + animationCount
Loop
End Sub

Private Sub PrepareSlideForAnimationExpansion(s As Slide)
' Set visibility tags on all shapes
For Each oShape In s.Shapes
oShape.Tags.Add AnimVisibilityTag, "true"
Next oShape

' Find initial visibility of each shape
For animIdx = s.TimeLine.MainSequence.Count To 1 Step -1
Dim seq As Effect
Set seq = s.TimeLine.MainSequence.Item(animIdx)
On Error GoTo UnknownEffect
For behaviourIdx = seq.Behaviors.Count To 1 Step -1
    Dim behavior As AnimationBehavior
    Set behavior = seq.Behaviors.Item(behaviourIdx)
    If behavior.Type = msoAnimTypeSet Then
        If behavior.SetEffect.Property = msoAnimVisibility Then
            If behavior.SetEffect.To <> 0 Then
                seq.Shape.Tags.Delete AnimVisibilityTag
                seq.Shape.Tags.Add AnimVisibilityTag, "false"
            Else
                seq.Shape.Tags.Delete AnimVisibilityTag
                seq.Shape.Tags.Add AnimVisibilityTag, "true"
            End If
        End If
    End If
Next behaviourIdx
NextSequence:
On Error GoTo 0
Next animIdx
Exit Sub

UnknownEffect:
MsgBox ("Encountered an error while calculating object visibility: " + Err.Description)
Resume NextSequence
End Sub

Private Function expandAnimationsForSlide(pres As Presentation, s As Slide) As Integer
Dim numSlides As Integer
numSlides = 1

' Play the animation back to determine visibility
Do While True
' Stop when animation is over or we hit a click trigger
If s.TimeLine.MainSequence.Count <= 0 Then Exit Do
Dim fx As Effect
Set fx = s.TimeLine.MainSequence.Item(1)
If fx.Timing.TriggerType = msoAnimTriggerOnPageClick Then Exit Do

' Play the animation
PlayAnimationEffect fx
fx.Delete
Loop

' Make a copy of the slide and recurse
If s.TimeLine.MainSequence.Count > 0 Then
s.TimeLine.MainSequence.Item(1).Timing.TriggerType = msoAnimTriggerWithPrevious
Dim nextSlide As Slide
Set nextSlide = s.Duplicate.Item(1)
numSlides = 1 + expandAnimationsForSlide(pres, nextSlide)
End If

' Apply visibility
rescan = True
While rescan
rescan = False
For n = 1 To s.Shapes.Count
    If s.Shapes.Item(n).Tags.Item(AnimVisibilityTag) = "false" Then
        s.Shapes.Item(n).Delete
        rescan = True
        Exit For
    End If
Next n
Wend

' Clear all tags
For Each oShape In s.Shapes
oShape.Tags.Delete AnimVisibilityTag
Next oShape

' Remove animation (since they've been expanded now)
While s.TimeLine.MainSequence.Count > 0
s.TimeLine.MainSequence.Item(1).Delete
Wend

expandAnimationsForSlide = numSlides
End Function


Private Sub assignColor(ByRef varColor As ColorFormat, valueColor As ColorFormat)
If valueColor.Type = msoColorTypeScheme Then
varColor.SchemeColor = valueColor.SchemeColor
Else
varColor.RGB = valueColor.RGB
End If
End Sub


Private Sub PlayAnimationEffect(fx As Effect)
On Error GoTo UnknownEffect
For n = 1 To fx.Behaviors.Count
Dim behavior As AnimationBehavior
Set behavior = fx.Behaviors.Item(n)
Select Case behavior.Type
    Case msoAnimTypeSet
        ' Appear or disappear
        If behavior.SetEffect.Property = msoAnimVisibility Then
            If behavior.SetEffect.To <> 0 Then
                fx.Shape.Tags.Delete AnimVisibilityTag
                fx.Shape.Tags.Add AnimVisibilityTag, "true"
            Else
                fx.Shape.Tags.Delete AnimVisibilityTag
                fx.Shape.Tags.Add AnimVisibilityTag, "false"
            End If
        Else
            ' Log the problem
        End If
    Case msoAnimTypeColor
        ' Change color
        If fx.Shape.HasTextFrame Then
            Dim range As TextRange
            Set range = fx.Shape.TextFrame.TextRange
            assignColor range.Paragraphs(fx.Paragraph).Font.Color, behavior.ColorEffect.To
        End If


    Case Else
        ' Log the problem
End Select
Next n
Exit Sub
UnknownEffect:
MsgBox ("Encountered an error expanding animations: " + Err.Description)
Exit Sub
End Sub

1
如果您使用LibreOffice或OpenOffice,GitHub上有一个插件可以很好地完成这项工作: ExpandAnimations 根据我的经验,所有标准的出现/消失动画都被很好地拆分了。对象移动动画也有效(您会得到带有对象起始位置和终止位置的幻灯片)。我还没有机会测试其他动画类型,但这应该涵盖所有标准需求 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接