我想创建一个 LaTeX 文档,当它被渲染成 PDF 时,其中包含可以使用 Adobe Reader 或其他类似程序填写的表格。然后我希望能够提取数据。出于所有常见原因(非免费、不同平台需要不同版本等),我有意避免使用 Acrobat。
这能做到吗?
答案1
该hyperref
包提供了一种创建 PDF 表单的方法。我的理解是,表单要么被打印,要么像 HTML 表单一样传输到 Web 服务器。
这里有一个小例子:
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\begin{Form}[action={http://your-web-server.com/path/receiveform.cgi}]
\begin{tabular}{l}
\TextField{Name} \\\\
\CheckBox[width=1em]{Check} \\\\
\Submit{Submit}\\
\end{tabular}
\end{Form}
\end{document}
给出:
答案2
下面是我用来创建表格的代码,这些表格既可以打印出来,用笔填写,也可以在 PDF 查看器中以电子方式填写。打印时,表格会为每个表单字段提供一行。与 Martin Scharrer 的解决方案一样,我也使用该hyperref
包。棘手的部分是定义给定长度(此处减去 4 厘米)的输入字段textwidth
。它需要覆盖\LayoutTextField
钩子。
\documentclass[a4paper,11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[pdftex]{hyperref}
\newdimen\longline
\longline=\textwidth\advance\longline-4cm
\def\LayoutTextField#1#2{#2} % override default in hyperref
\def\lbl#1{\hbox to 4cm{#1\dotfill\strut}}%
\def\labelline#1#2{\lbl{#1}\vbox{\hbox{\TextField[name=#1,width=#2]{\null}}\kern2pt\hrule}}
\def\q#1{\hbox to \hsize{\labelline{#1}{\longline}}\vskip1.4ex}
\begin{document}
\begin{Form}
\q{First Name}
\q{Last Name}
\q{Email}
\end{Form}
\end{document}
在 PDF 查看器中,每一行都成为一个表单字段。
答案3
我用过eforms
包,由但丁他们的会员表格(当然我现在找不到它的.tex
格式!)。您可能必须eforms
自己从 CTAN 下载并解压,因为它不在 TeX Live 中(解压eforms
、insdljs
和taborder
,都在eforms
包中)。这是我做的注册表中的一个简短示例:
\documentclass{article}
\usepackage[pdftex]{eforms}
% From DANTE's registration form!
\newcounter{infoLineNum}
\setcounter{infoLineNum}{0}
\newcommand{\infoInput}[2][4in]{%
\stepcounter{infoLineNum}%
\makebox[0pt][l]{%
\kern 4 pt
\raisebox{.75ex}
{\textField[\W0\BC{}\BG{}\TU{#2}]{name\theinfoLineNum}{#1}{12bp}}%
}
\dotfill
}
\begin{document}
\begin{tabular}{lp{4in}}
Title & \infoInput{Title}\\[6pt]
First name & \infoInput{Firstname}\\[6pt]
Last name & \infoInput{Surname}\\[6pt]
E-mail address & \infoInput{Email}\\[6pt]
Dietary requirements & \infoInput{Dietary}\\[6pt]
\end{tabular}
\begin{tabular}{ll}
Student (\pounds60)
& \raisebox{.75ex}{\radioButton{RegType}{10bp}{10bp}{Student}}
\\[6pt]
Academic/post-doc (\pounds120)
& \raisebox{.75ex}{\radioButton{RegType}{10bp}{10bp}{Academic}}
\\[6pt]
Industrial (\pounds180)
& \raisebox{.75ex}{\radioButton{RegType}{10bp}{10bp}{Industrial}}
\\[6pt]
\end{tabular}
\end{document}
这为文本区域提供了“输入”框,为选择提供了“勾选”框。
我不确定保存表单数据会发生什么:根据 Adobe Reader 的说法,无法以这种形式保存。我从未真正见过可以保存数据的 PDF 表单,所以即使 Acrobat 是否可以做到这一点我也不知道。
答案4
我同意Christian Lindig 的回答。 看上去不错。
问题是字段周围有红色边框。这个社区的伙计们确实给出了一些关于如何去除它的建议。对我来说,最简单的方法是
\def\labelline#1#2{\lbl{#1}\vbox{\hbox{\TextField[name=#1,width=#2,bordercolor=white]{\null}}\kern2pt\hrule}}
只需更改边框的颜色。记得包含包xcolor
。
也许我应该在评论中写下这个,但我是新来的。