静态和动态 pdf 的动画设置

静态和动态 pdf 的动画设置

我正在尝试创建beamer带有嵌入式动画的幻灯片animate,它可以与静态 pdf 查看器和 Acrobat Reader 配合使用。

基本问题是动画的最后一帧是关键帧,前面的帧显示了该帧是如何发展的。因此,我希望静态观看者能够看到关键的最后一帧,但我不想在动态观看时泄露结局。

我的直觉是,我可以通过设置poster=last然后使用autoplay(也许在时间轴中暂停以将其保持在第 1 帧)从 Acrobat 中的第 1 帧开始来实现这一点。这适用于静态浏览器,但在 Acrobat 中发生的情况是,最后一帧显示出来,但需要通过鼠标单击激活动画才能返回到第一帧并设置动画。

一个可演示的工作示例(不使用beamer但显示相同的行为):

\documentclass{article}
\usepackage{animate}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
\begin{animateinline}[controls, autoplay, poster=last]{2}  
\multiframe{7}{n=0+30}{
  \begin{tikzpicture}
    \useasboundingbox (0,0) rectangle (4,8);
    \node [draw, circle] (A) at (2,2){A};
    \node [draw, circle] (B) [above=4cm of A] {B};
    \draw [->, thick] (A) to[out=\n, in=\n] (B);
  \end{tikzpicture}    
}
\end{animateinline}
\end{document}

我想要设置的是:

  1. 在静态查看器中打开时,最后一帧会用左侧的箭头显示,以便人们可以看到动画如何结束。
  2. 但是,当在 Reader 中打开时,动画将会运行时,箭头会出现在右侧(第 1 帧)。

有什么建议么?

答案1

这可以使用 OCG(可选内容组,又名 PDF 层)和一些 JavaScript 来实现。

我们重复最后一帧,但创建两个版本,每个版本都与一个 PDF 层相关联。一个层显示(实际)最后一帧,默认情况下处于开启状态,另一个层显示第一帧,默认情况下处于关闭状态。在 AR 中,在 Page-Open 事件期间使用 JavaScript 开启后者,关闭前者。

已经存在的 OCGacro可以other在文档中的其他动画中安全地重复使用(重新打开)。

\documentclass{article}
\usepackage{animate}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{ocgx}
%\usepackage{fixocgx}

\pdfpageattr{/AA << %additional actions for pageopen event
  /O << /S/JavaScript /JS (
    var ocgArray = this.getOCGs();
    for (var i=0; i < ocgArray.length; i++) {
       if (ocgArray[i].name == "other") ocgArray[i].state = false;
       if (ocgArray[i].name == "acro") ocgArray[i].state = true;
    }
  ) >>
>>}

\begin{document}

Bla, bla.

\newpage

\begin{animateinline}[
  controls,
  poster=last
]{2}  
\multiframe{7}{n=0+30}{
  \begin{tikzpicture}
    \useasboundingbox (0,0) rectangle (4,8);
    \node [draw, circle] (A) at (2,2){A};
    \node [draw, circle] (B) [above=4cm of A] {B};
    \draw [->, thick] (A) to[out=\n, in=\n] (B);
  \end{tikzpicture}
}
\newframe* % During playback, pause before this frame.
  \begin{tikzpicture}
    \useasboundingbox (0,0) rectangle (4,8);
    \node [draw, circle] (A) at (2,2){A};
    \node [draw, circle] (B) [above=4cm of A] {B};
    \begin{ocg}{acro}{acro}{0}% default = not visible
      \draw [->, thick] (A) to[out=0, in=0] (B);
    \end{ocg}
    \begin{ocg}{other}{other}{1}% default = visible
      \draw [->, thick] (A) to[out=180, in=180] (B);
    \end{ocg}
  \end{tikzpicture}
\end{animateinline}
\end{document}

相关内容