您能使用 JavaScript 影响任何 PDF 元素吗?

您能使用 JavaScript 影响任何 PDF 元素吗?

使用该包insDLJS,可以添加JavaScriptPDF 文档由 LaTeX 生成。要引用特定元素,可以使用this.getField("myElementName")。我可以给 LaTeX 中的任何元素指定字段名称吗?如果可以,如何操作?

例如,假设我有一个使用包的彩色文本框tcolorbox,我想使用来影响它的边框颜色(colframeJavaScript

\begin{tcolorbox}[width=25mm,colback={green},colframe={orange}] 
Hello World!
\end{tcolorbox}

如果文本框有引用名称,代码可能类似于this.getField("myTextBox").borderColor = color.red;。但我该如何给这个文本框命名myTextBox?其次,我如何确定框的哪些方面可以受到影响(.borderColor部分)?

答案1

PDF 文档页面上描边和填充操作产生的文本和图形无法使用 JavaScript 访问或修改。

在有限的程度上,PDF 图层(正式名称为可选内容组,OCG)可用于在 PDF 中相互替换、隐藏或显示页面内容。但这不一定需要 JavaScript(见下面的示例)。

JavaScript 用于访问和定义交互元素(官方称为 PDF 注释)的行为,例如按钮字段、表单、嵌入式多媒体、链接等,或获取全局文档属性。

许多触发事件(页面打开、关闭、鼠标悬停、向下、向上等)可以与使用 JavaScript 定义或未定义的动作相关联。

PDF 规范JavaScript 文档定义什么是可能的。但请注意,文档标准的实现在不同的 PDF 查看器之间有很大不同。参考 PDF 查看器是 A-Reader 和 A-Acrobat。

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{ocgx2}

\begin{document}
\begin{ocg}{Orange Colframe}{orange}{true}
  \makebox[0pt][l]{%
    \begin{tcolorbox}[width=25mm,colback={green},colframe={orange}]
    Hello World!
    \end{tcolorbox}%
  }%  
\end{ocg}%
\begin{ocg}{Red Colframe}{red}{false}%
  \makebox[0pt][l]{%
    \begin{tcolorbox}[width=25mm,colback={green},colframe={red}]
    Hello World!
    \end{tcolorbox}%
  }%
\end{ocg}

\switchocg{orange red}{\fbox{Toggle}} Colframe colour.
\end{document}

答案2

根据 AlexG 的建议使用PDF 图层,我制作了以下示例,结合了图层切换和JavaScript功能:

\documentclass[a4paper]{article}
\usepackage{animate}
\usepackage{tcolorbox}
\usepackage[pdftex]{insdljs}

\begin{insDLJS}[test]{test}{JavaScript}
var myToggle = 0;
function mySelect() {
    if  (myToggle) {
        myToggle = 0;
        anim["myAnimation1"].frameNum = 0;
    } else {
        myToggle = 1;
        anim["myAnimation1"].frameNum = 1;
    }
    this.getField("myTextBox").value += 1;
}
\end{insDLJS}

\begin{document}

\begin{Form}
\PushButton[name=myButton1,borderwidth=0px,bordercolor={1 1 1},onclick={mySelect(1);}]{
\begin{animateinline}[nomouse,step,label=myAnimation1]{0}
\begin{tcolorbox}[width=20mm,colback={green},colframe={orange}]  
On
\end{tcolorbox}
\newframe
\begin{tcolorbox}[width=20mm,colback={yellow},colframe={red}]  
Off
\end{tcolorbox}
\end{animateinline}}
\hspace{4mm}
\TextField[name=myTextBox,borderwidth=1px,bordercolor={0 0 0},readonly=true]{}
\end{Form}

\end{document}

这不是包ocg,而是使用animate

相关内容