Скрыть внутренние библиотечные ключи в pdf

Скрыть внутренние библиотечные ключи в pdf

Когда я открываю pdf, сгенерированный pdflatexв eg firefox, URL при наведении на ссылку показывает внутренний bibkey. Как мне предотвратить это?

Рассмотрим следующий MWE:

mwe.tex

\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}
}

Теперь посмотрите на следующий скриншот: Скриншот, на котором вы можете увидеть внутренний используемый ключ Он показывает биб-ключ, который я использовал при наведении курсора на цитату (судя по всему, на скриншоте нет моего курсора, но он был над зеленой «1»). Есть ли способ рандомизировать/анонимизировать эти URL-ключи?

решение1

Вы можете попробовать что-то вроде этого. Я не уверен, \int_to_alphaобрабатывает ли он все символы и ввод, которые могут появиться в пункте назначения, и может ли он привести к идентичным пунктам назначения, но это была лучшая расширяемая функция, которую я нашел на данный момент. Она перемешает все пункты назначения, включая разделы и метки. Для перемешания только ключей bib потребуется внести ряд изменений в код 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

Если вы хотите скрыть всю внутреннюю маркировку, Ульрикеотвечатьгораздо лучше, но вот способ скрыть только ссылки, созданные с помощью biblatexхэшей MD5 (я считаю, что хэши 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.

В конце цикла вы повторно сжимаете PDF-файл с помощью, pdftkи все готово.

Полный сценарий (вызов с помощью 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:

введите описание изображения здесь

Дополнительный бонус: ссылка все еще работает.

Связанный контент