就像这个问题,
假设您的 LaTeX 文档的某些部分包含一些文本,您只希望有密码的人可以看到。例如,原因可能是带有指导性答案的案例。您希望将案例公开,但答案仅供教师查看。
我希望 PDF 中有一个链接操作,单击该操作时,将在要求输入密码后解密内容,使用Adobe Acrobat Javascript API(受此问题和答案的启发:如何添加特定页面的打印链接动作?)
您可以选择任何加密材料源作为测试 ASCII 内容,但下面的代码中有一个最小示例。在问题的答案中加密和解密 LaTeX 源文件中的部分文本,表明加密 ASCII 文件部分的问题实际上是主要任务中比较容易的一部分,可以通过 Emacs 等优秀的编辑器来完成。
下面的代码基于这个答案,该行\password"this.getField("myinput").value;
尝试将用户输入转换为整数。这不起作用。我该如何让它工作?
\documentclass{article}
\usepackage{fontspec}
% https://tex.stackexchange.com/a/275434/13173
\newcount\password
\newcount\crycount
\newcount\crycounta
\newcount\crycountb
\def\private#1{%
\ifx#1\end
\expandafter\end
\else
\crycount`#1
% ↓↓↓ some math involving \crycount and \password
\advance\crycount-\password
\crycounta\crycount\crycountb\crycount\divide\crycounta16\multiply\crycounta16\advance\crycountb-\crycounta\divide\crycounta16
\xdef\crychara{\ifcase\crycounta0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or a\or b\or c\or d\or e\else f\fi}
\xdef\crycharb{\ifcase\crycountb0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or a\or b\or c\or d\or e\else f\fi}
% ↑↑↑ some math involving \crycount and \password
\xdef\crystring{\crystring\string^\string^\crychara\crycharb}
\expandafter\private
\fi
}
% https://tex.stackexchange.com/a/387474/13173
\usepackage{xparse,calc}
\usepackage{eforms
\begin{document}
\medskip
\textField[
\Ff\FfMultiline
\Ff\FfDoNotSpellCheck
]
{myinput}{\dimexpr\linewidth-10ex}{5\baselineskip}
If key is set to be 2600, you can see the hint below:
\password"2600
\def\crystring{}
\begin{private}
♕♳♥☠♭♡♴♨♥♭♡♴♩♣♡♬☠♩♮♤♵♣♴♩♯♮☠♯♮☠☤♜♬♡♭♢♤♡☤☮
\end{private}
\newwrite\cryfile
\immediate\openout\cryfile=\jobname.cry
\immediate\write\cryfile{\crystring}
\immediate\closeout\cryfile
\input{\jobname.cry}
If key is not 2600, you see random characters:
\password"0
\def\crystring{}
\begin{private}
♕♳♥☠♭♡♴♨♥♭♡♴♩♣♡♬☠♩♮♤♵♣♴♩♯♮☠♯♮☠☤♜♬♡♭♢♤♡☤☮
\end{private}
\newwrite\cryfile
\immediate\openout\cryfile=\jobname.cry
\immediate\write\cryfile{\crystring}
\immediate\closeout\cryfile
\input{\jobname.cry}
% TODO how to pass the value as integer there?
\AACalculate{event.value=getField("myinput").value;}
If user input is set to be 7777, you can see the hint below:
\password"this.getField("myinput").value;
\def\crystring{}
\begin{private}
♕♳♥☠♭♡♴♨♥♭♡♴♩♣♡♬☠♩♮♤♵♣♴♩♯♮☠♯♮☠☤♜♬♡♭♢♤♡☤☮
\end{private}
\newwrite\cryfile
\immediate\openout\cryfile=\jobname.cry
\immediate\write\cryfile{\crystring}
\immediate\closeout\cryfile
\input{\jobname.cry}
\end{document}
图 1 输出
TeXLive:2017
操作系统:Debian 9.1
PDF 查看器:Adobe Acrobat 9.x(acroread
)按说明安装这里
Acrotex 安装:这里