包含的 pdf 中的 \hyperref

包含的 pdf 中的 \hyperref

在我目前正在撰写的论文中,我非常希望能够\hyperref从图形中看到论文的另一部分。图形输出格式是 eps,然后我使用 eps2pdf 将其转换为 pdf,然后将 pdf 包含在我的文档中。现在我“不知何故”希望能够在我的 eps 中指定一个引用,该引用从 eps2pdf 步骤中保留下来,然后我可以在我的图形中有一个可点击的链接,指向文档的不同部分。我不知道如何实现这一点。

使用不同的起始格式和结束格式的完全不同的方法对我来说也是可以的,但我更喜欢它仍然是矢量图形。

我使用 pdflatex 来呈现我的文档。

下面是一个可重现的例子。

在我的例子中,我有一个包含指向 url 和 的链接的 eps 文件\hyperref。为了展示这一点,我制作了一个快速点文件来说明我正在处理的 eps 类型,我将点文件转换为 eps:。dot -Teps test.dot -o test.eps请注意,我的文件实际上不是点文件,我在这里使用它是因为它可以作为一个更简单的示例。

digraph Test {
    g[href="https://www.google.com", fontcolor=blue, label="google"];
    test[href="\hyperref[sec:Introduction]{Links to intro}", fontcolor=blue, label="Introduction"];
}

然后我使用 epstopdf 将生成的 eps 转换为 pdf:epstopdf test.eps这样便可创建我的 pdf,其中有一个 \URL,并且 hyperref 完整无缺。然后我使用以下命令将图形包含在 latex 中\includegraphic

\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{hyperref}
\usepackage{hypcap}
\usepackage{graphicx}

\begin{document}

\section{Introduction}
\label{sec:Introduction}

\hyperref[sec:Introduction]{Links to intro}

\begin{figure}[htbp]
\centering
\capstart

\includegraphics{test.pdf}
\caption{test}
\end{figure}

\end{document}

所以现在有两个问题。真正的 google URL 不起作用,因为它根本无法点击,而且嵌入的 hyperref 也不起作用。如果我打开文件,真正的 url 就可以正常工作test.pdf

所以我不介意编写一些代码通过一些转换来解决这个问题,但我不知道该怎么做。

任何帮助都将受到赞赏。

答案1

graphicx在使用和pdfpages包中的常用命令嵌入 PDF 时,任何交互元素(例如链接、嵌入的多媒体、PDF 图层)都会被剥离。

CTAN 上有一个实验包,pax,尝试使用外部 Java 程序重新创建此类元素。但该项目似乎已停止。

目前,重新插入交互元素需要繁琐的手动过程,可以通过包来简化onimage,引入↗这里。可下载为onimage.dtx↗这里。 跑步pdflatex两次即可获得onimage.sty和文档onimage.pdf

onimage旨在方便注释嵌入的图像文件。它还可以显示辅助线网格,从而大大简化查找链接矩形坐标的过程。

为了方便起见,我们定义\linkRect(<lowerleft>)(<upper right>){...}可以在tikzonimage或环境中使用以在和tikzpicture之间创建链接矩形,例如(<lowerleft>)(<upper right>)

\linkRect(llx,lly)(urx,ury) {\href{URL}{~}};

用作~链接文本的占位符。

Perl 脚本extractURIs.pl下面列出的方法从给定的未压缩 PDF 中提取所有 URI(即外部)链接,并写入易于格式化的

\linkRect(llx,lly)(urx,ury) {\href{URL}{~}};

命令到终端。要解压缩,请使用pdftk命令行工具:

pdftk input.pdf output - uncompress | extractURIs.pl

enter image description here

\documentclass{article}

\usepackage{graphicx}
\usepackage{tikz}
\usepackage{hyperref}
\usepackage{onimage}

% use `~' as placeholder for the link text
% \linkRect(llx,lly)(urx,ury) {\href{URL}{~}};
\def\linkRect(#1)(#2){
  \coordinate (ll) at (#1); \coordinate (ur) at (#2);\def~{\tikz \useasboundingbox (ll) rectangle (ur);}
  \node [anchor=south west, inner sep=0] at (ll)
}

\begin{document}

  \begin{tikzonimage}[width=5cm]{example-image-a}[tsx/show help lines]
    \linkRect(0.35,0.25)(0.65,0.75) {\href{https://www.google.de/search?q=onimage.dtx&ie=utf-8&oe=utf-8&client=firefox-b&gfe_rd=cr&dcr=0&ei=6lW6Wq_yEt6CgAfZq5mgDA}{~}};
  \end{tikzonimage}

\end{document}

Perl 脚本extractURIs.pl

#!/usr/bin/perl -w

@linkRect=();
@linkUri=();
$isLink=0;
$isUri=0;

while(<>){
  if (/\/MediaBox\s+\[([\d\.\s]+\d)\]/) {
    @mediaBox=split /\s+/, $1;
  }
  elsif(/\/Subtype\s*\/Link/) {$isLink=1;}
  elsif(/\/Rect\s+\[([\d\.\s]+\d)\]/) {
    $rect=$1;
  }
  elsif(/\/URI\s+\((.*)\)\s*$/) {
    $uri=$1;
    $isUri=1;
  }
  elsif(/endobj/) {
    if($isUri && $isLink) {
      push @linkUri, $uri;
      push @linkRect, $rect;
    }
    $isUri=0;
    $isLink=0;
  }
}

$width=$mediaBox[2]-$mediaBox[0];
$height=$mediaBox[3]-$mediaBox[1];

for($i=0; $i<@linkUri; $i++) {
  ($llx,$lly,$urx,$ury) = split /\s+/, $linkRect[$i];
  $llx=($llx-$mediaBox[0])/$width;
  $urx=($urx-$mediaBox[0])/$width;
  $lly=($lly-$mediaBox[1])/$height;
  $ury=($ury-$mediaBox[1])/$height;

  print "\\linkRect($llx,$lly)($urx,$ury) {\\href{$linkUri[$i]}{~}};\n";
}

答案2

在最终文档中,您可以在所包含的图像/PDF 顶部添加超链接。下面是一个例子,我

  • 绘制一个透明矩形,其大小与超链接的大小一致,
  • 将此矩形变成超链接,
  • 在所包含的图像上绘制超链接。
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{hyperref}

\def\Put(#1,#2)#3{\leavevmode\makebox(0,0){\put(#1,#2){#3}}}

\begin{document}
    \href{www.google.de}{\includegraphics[width=5cm]{example-image-a}}
    \hspace{1cm}    
    \includegraphics[width=5cm]{example-image-a}\Put(-92,105){\href{www.google.de}{\tikz \fill [opacity=0] (0,0) rectangle (1.5,2) ;}}
\end{document}

enter image description here

这需要大量手动选择尺寸,因此如果您有大量此类图片,使用起来可能会很麻烦。不过,作为快速修复,它是有效的。

相关内容