隐藏 PDF 中的内部 bibkeys

隐藏 PDF 中的内部 bibkeys

当我在 Firefox 等浏览器中打开生成的 PDF 时pdflatex,将鼠标悬停在参考资料上的 URL 会显示内部 bibkey。我该如何防止这种情况发生?

考虑以下 MWE:

麦格

\documentclass{article}

\usepackage[backend=biber]{biblatex}
\addbibresource{bib.bib}

\usepackage{hyperref}

\begin{document} 

Test\cite{secretbibkey}

\printbibliography

\end{document}

书目目录

@article{secretbibkey,
    author = {Joe},
    title = {Just a title},
    number = {ABCD-E/2008/ab/1234},
    institution = {University},
    year = {2008}
}

现在看一下下面的截图: 屏幕截图显示您可以看到内部使用的 bibkey 它显示了我将鼠标悬停在引文上时使用的 bibkey(显然屏幕截图不包括我的光标,但它位于绿色“1”上方)。有没有办法随机化/匿名化这些 URL 密钥?

答案1

您可以尝试类似这样的方法。我不确定它是否能\int_to_alpha处理目的地中出现的所有字符和输入,以及它是否可以指向相同的目的地,但这是我目前发现的最好的可扩展函数。它将对所有目的地进行加密,包括部分和标签的目的地。要仅加密 bib-keys,需要对代码进行一些更改biblatex

\documentclass{article}

\usepackage[backend=biber]{biblatex}
\addbibresource{test.bib}

\usepackage{hyperref}
\ExplSyntaxOn
\cs_new:Npn \pix_scrample_dest:n #1 {\int_eval:n{\int_from_alph:n{#1} + 2}} %2= secret number 
\def\HyperDestNameFilter#1{\exp_args:Ne\tl_map_function:nN {#1}\pix_scrample_dest:n}
\ExplSyntaxOff

\begin{document}

Test\cite{secretbibkey}

\printbibliography

\end{document}

答案2

如果你想隐藏所有内部标签,Ulrike 的回答好多了,但是这里有一种方法可以仅混淆通过 MD5 哈希创建的链接biblatex(我相信 MD5 哈希不再推荐用于任何安全关键的东西,但它可能足以满足您的目的)。

\blx@mdfivesum此处使用的命令需要相对较新的biblatex版本。如果您仍使用旧版本biblatex,请\usepackage{pdftexcmds}自行加载并输入\let\blx@mdfivesum\pdf@mdfivesum

这个想法是将所有链接命令从使用输入密钥更改为使用输入密钥的散列版本。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}
\usepackage{hyperref}

\makeatletter
\AtBeginDocument{%
  \protected\def\blx@anchor{%
    \xifinlist{\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}{\blx@anchors}
      {}
      {\listxadd\blx@anchors{\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}%
       \hypertarget{cite.\the\c@refsection @\blx@mdfivesum{\abx@field@entrykey}}{}}}%
  \ifundef\hyper@natanchorstart
    {\long\def\blx@bibhyperref[#1]#2{%
       \blx@sfsave\hyperlink{cite.\the\c@refsection @\blx@mdfivesum{#1}}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@sfsave\hyperlink{cite.\the\c@refsection:\blx@mdfivesum{#1}}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@sfsave\hypertarget{cite.\the\c@refsection:\blx@mdfivesum{#1}}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}}%
    {\long\def\blx@bibhyperref[#1]#2{%
       \blx@sfsave\hyper@natlinkstart{\the\c@refsection @\blx@mdfivesum{#1}}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@sfsave\hyper@natlinkstart{\the\c@refsection:\blx@mdfivesum{#1}}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@sfsave\hyper@natanchorstart{\the\c@refsection:\blx@mdfivesum{#1}}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natanchorend\blx@sfrest}}}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
\autocite{sigfridsson,worman,geer,nussbaum}
\printbibliography
\end{document}

带有混淆链接的 PDF 的屏幕截图。


如果你更喜欢数字指示符(与上面的哈希不同,它根本不是从输入键中派生出来的),请使用以下命令

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[style=authoryear, backend=biber]{biblatex}
\usepackage{hyperref}

\makeatletter
\newcounter{blx@refnocount}

\newcommand*{\blx@getrefnocount}[1]{%
  \xifinlistcs{#1}{blx@refcounts@\the\c@refsection}
    {}
    {\stepcounter{blx@refnocount}%
     \csnumgdef{blx@refcount@\the\c@refsection @#1}{\value{blx@refnocount}}%
     \listcsxadd{blx@refcounts@\the\c@refsection}{#1}}%
  \letcs\blx@thisrefcount{blx@refcount@\the\c@refsection @#1}}

\AtBeginDocument{%
  \ifundef\hyper@natanchorstart
    {\protected\def\blx@anchor{%
       \xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors}
         {}
         {\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}%
          \blx@getrefnocount{\abx@field@entrykey}%
          \hypertarget{cite.\the\c@refsection @blxlinkno\blx@thisrefcount}{}}}%
     \long\def\blx@bibhyperref[#1]#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyperlink{cite.\the\c@refsection @blxlinkno\blx@thisrefcount}
         {\blx@sfrest
          #2%
          \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyperlink{cite.\the\c@refsection:blxlinkno\blx@thisrefcount}
         {\blx@sfrest
          #2%
          \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hypertarget{cite.\the\c@refsection:blxlinkno\blx@thisrefcount}
         {\blx@sfrest
          #2%
         \blx@sfsave}\blx@sfrest}}%
    {\protected\def\blx@anchor{%
       \xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors}
         {}
         {\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}%
          \blx@getrefnocount{\abx@field@entrykey}%
          \hyper@natanchorstart{\the\c@refsection @blxlinkno\blx@thisrefcount}%
          \hyper@natanchorend}}%
     \long\def\blx@bibhyperref[#1]#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyper@natlinkstart{\the\c@refsection @blxlinkno\blx@thisrefcount}%
       \blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyper@natlinkstart{\the\c@refsection:blxlinkno\blx@thisrefcount}%
       \blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@getrefnocount{#1}%
       \blx@sfsave
       \hyper@natanchorstart{\the\c@refsection:blxlinkno\blx@thisrefcount}%
       \blx@sfrest
       #2%
       \blx@sfsave\hyper@natanchorend\blx@sfrest}}}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
\autocite{sigfridsson,worman,geer,nussbaum}
\printbibliography

\autocite{sigfridsson,worman,geer,nussbaum}
\end{document}

答案3

您可以使用一些命令行工具对创建的 pdf 进行后期处理,以搜索引用键并在 pdf 源中替换它们。

首先,您需要解压缩 pdf 以允许文本搜索和替换,例如pdftk

在未压缩的 pdf 中,链接如下所示:

3 0 obj 
<<
/Border [0 0 1]
/Subtype /Link
/H /I
/Type /Annot
/C [0 1 0]
/Rect [169.08 653.748 176.054 665.704]
/A 
<<
/D (cite.0@secretbibkey)
/S /GoTo
>>
>>
endobj 

以及下面的相应部分:

34 0 obj 
<<
/Names [(Doc-Start) 22 0 R (cite.0@secretbibkey) 21 0 R (page.1) 14 0 R (section*.1) 18 0 R]
/Limits [(Doc-Start) (section*.1)]
>>
endobj

现在您可以找到grep模式的来源/D (cite.0@[some key])并仅存储关键部分。

然后,循环遍历所有密钥,您可以生成一个替换密钥,例如校验和md5(可以合理地预期每个密钥都是唯一的)。

接下来,您可以使用 替换所有出现的键sed

在循环结束时您重新压缩 pdfpdftk就完成了。

完整脚本(使用 调用bash myscript.sh mypdf.pdf):

pdftk $1 output "raw$1" uncompress
grep -aoP "\/D \(\Kcite.0@[^\)]+(?=\))" "raw$1" | while read -r line ; do
   echo $line
   citehash=`echo $line|md5sum|awk '{ print $1 }'`
   sed -i "s/$line/$citehash/g" "raw$1"
done
pdftk "raw$1" output $1 compress

Firefox 中生成的链接工具提示:

在此处输入图片描述

附加奖励:链接仍然有效。

相关内容