我正在用该hyperref
包创建一个交互式 pdf 表单。该表单非常全面,因此当前的目标是仅显示与特定用户相关的部分。例如,用户表明他是男性 --> 仅显示与男性有关的项目。
通常,仅显示文档的某些部分并不困难,例如使用包 ifthen
:
\documentclass{article}
\usepackage{ifthen}
\begin{document}
\newboolean{boolvar}
\setboolean{boolvar}{false}
\ifthenelse{\boolean{boolvar}}{show if true}{show if false}
\end{document}
但是,当涉及到将这样的变量与表单字段中的用户输入相结合时,我却不知所措。使用 JavaScript 和包insdljs
,我已成功隐藏表单字段,但无法隐藏这些表单字段之外的文本:(注意:insdljs
不是 TeX Live 的一部分,但可用这里)
\documentclass{article}
\usepackage[pdftex]{hyperref}
\usepackage[pdftex]{insdljs}
\begin{insDLJS}{mydljs}{some comment}
function hide(){
if(this.getField("somefield").display == display.visible){
this.getField("somefield").display = display.hidden;
} else{
this.getField("somefield").display = display.visible;
}
}
\end{insDLJS}
\begin{document}
\begin{Form}
\PushButton[onclick={hide();}]{Hide/Show}\\
\TextField[name=somefield, width=4em]{Any way to hide e.g. this text?}
\end{Form}
\end{document}
隐藏这样的表单字段非常方便,但我想将其应用于整个表格或部分。有什么想法吗?谢谢!
答案1
我其实不知道,但我做了一些小研究,认为你无法隐藏它,你根本无法对它做任何事情(当然,没有一点技巧)
首先,我创建了一个简单的示例,并在 Adobe Acrobat 中打开它。我看到,一个字段和一个标签是独立的。并且没有任何可以更改标签的 TextField 属性。Textfield 是字段,标签是文本。
如果你真的想隐藏标签,你可以这样做:
你隐藏了字段“test”,而“tf1”可见
字段“test”可见,“tf1”隐藏
它有效,但我不确定您是否需要它。
为了验证我们无法更改文本,我尝试了按钮。使用Acrobat 的 javascript API 参考我找到了buttonGetCaption
一些buttonSetCaption
方法来改变标签(看起来像标题),但它并不像我预期的那样有效:
\PushButton[name=testButton1,onclick={
console.show();
console.println('-------------');
console.println('value is: ' +event.target.value);
console.println('caption is: ' +event.target.buttonGetCaption());
console.println('-------------');
event.target.buttonGetCaption()==''?event.target.buttonSetCaption('boom'):event.target.buttonSetCaption('');
}]{\ test\ }
\PushButton[name=testButton2,onclick={
event.target.buttonGetCaption()==''?event.target.buttonSetCaption('boom'):event.target.buttonSetCaption('');
}]{\ \ \ \ \ \ \ }\\[0.2cm] %I didn't find as to change width. Parameter 'width' work only for fields.
点击前: 点击 后:
所以,我认为隐藏文本是个坏主意,但是您可以轻松隐藏文本字段,让我们这样做吧!
\usepackage{hyperref}
\usepackage{calc}
\usepackage[pdftex]{insdljs}
\newlength{\mylen}
\settowidth{\mylen}{Enter name: }
\begin{insDLJS}{mydljs}{ }
this.getField('testLabel').borderColor=color.transparent;
function hide(){
if(this.getField("test").display == display.visible){
this.getField("test").display = display.hidden;
this.getField("testLabel").display = display.hidden;
} else{
this.getField("test").display = display.visible;
this.getField("testLabel").display = display.visible;
}
}
\end{insDLJS}
\begin{document}
\begin{Form}
\TextField[name=testLabel,value=Enter name:,width=\mylen,readonly]{} % I don't know why but width=\whidthof and width=\the\whidthof don't work :(
\TextField[name=test]{} \\
\PushButton[onclick={hide();},
]{hide}\\[0.2cm]
\end{Form}
\end{document}
前:
后:
解决该问题的另一种方法是用默认值替换标签,例如:
\TextField[name=test2,default=Enter something,
onfocus={
if(event.target.value==event.target.defaultValue)event.target.value='';
},
onblur={
if(event.target.value=='')event.target.value=event.target.defaultValue;
}
]{}
点击之前:
后:
您可以像以前一样将其隐藏。