当 PDF 由 `gs` 处理时,使用 `\hyperdef` 定义的锚点会丢失

当 PDF 由 `gs` 处理时,使用 `\hyperdef` 定义的锚点会丢失

我们滥用gs“压缩”PDF,在此过程中PDF中的锚点丢失了。

举例来说example.tex

\documentclass{article}
\usepackage[pdfa]{hyperref}

\begin{document}
\section{Source a}
\hyperdef{cat1}{link1}{target1}
Foo \hyperref{example.pdf}{cat2}{link2}{to section 2} bar

\section{Source b}
\hyperdef{cat2}{link2}{target2}
Foo \hyperref{example.pdf}{cat1}{link1}{to section 1} bar
\end{document}

生成的锚点example.pdf工作正常,人们可以单击两个链接,然后 PDF 查看器就会从一个链接转到另一个链接:

$ pdflatex example.tex

当使用 处理 PDF 时gs,链接仍然存在,但锚点消失了,单击这两个链接没有任何反应:

$ gs -sDEVICE=pdfwrite -dPrinted=false -dCompatibilityLevel=1.4 -dPDFSETTIGNS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=/tmp/example.pdf example.pdf

有什么方法可以保存锚点吗?

我在这里找到的问题是关于链接消失的。为此,建议使用选项pdfa-dPrinted=false标志。这些会影响“注释”(类型为“链接”),这些注释会获得“打印”标志,因此gs不会再过滤掉它们。(我还尝试让链接消失了通过删除选项和标志,但我只能用 来做到这一点-dNoView。但我离题了..)

在 hyperref 仓库中搜索hyperdef返回测试文件和文档文件。https://github.com/search?q=repo%3Alatex3%2Fhyperref%20hyperdef&type=code

我尝试通过浏览 PDF 的结构来查找 PDF 中的锚元素https://flathub.org/apps/net.sourceforge.Pdfedit,但却什么也没找到。

答案1

qpdf --qdf --object-streams=disable example.pdf example.txt查看结果文件时,发现有一个对象/Names似乎与之相关,因为它在处理后的 PDF 中缺失。见下文。

在 ghostscript 问题跟踪器中搜索“名称”会显示https://bugs.ghostscript.com/show_bug.cgi?id=695760大约九年前创建的“更加努力地保存输入 PDF 中的名称树”,这似乎正是问题所在。

作为一种解决方法,可以轻松使用提取pdfmark, 例如:

$ extractpdfmark example.pdf > pdfmark.ps
$ gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFDontUseFontObjectNum -sOutputFile=Final.pdf example.pdf pdfmark.ps
%% Original object ID: 32 0
7 0 obj
<<
  /Limits [
    (Doc-Start)
    (section.2)
  ]
  /Names [
    (Doc-Start)
    11 0 R
    (cat1.link1)
    12 0 R
    (cat2.link2)
    13 0 R
    (page.1)
    14 0 R
    (section.1)
    15 0 R
    (section.2)
    16 0 R
  ]
>>
endobj


%% Original object ID: 12 0
17 0 obj
<<
  /A <<
    /D (cat2.link2)
    /F (example.pdf)
    /S /GoToR
  >>
  /Border [
    0
    0
    1
  ]
  /C [
    0
    .5
    .5
  ]
  /F 4
  /H /I
  /Rect [
    186.349
    632.481
    238.764
    643.329
  ]
  /Subtype /Link
  /Type /Annot
>>
endobj

%% Original object ID: 13 0
18 0 obj
<<
  /A <<
    /D (cat1.link1)
    /F (example.pdf)
    /S /GoToR
  >>
  /Border [
    0
    0
    1
  ]
  /C [
    0
    .5
    .5
  ]
  /F 4
  /H /I
  /Rect [
    186.349
    577.714
    238.764
    588.562
  ]
  /Subtype /Link
  /Type /Annot
>>
endobj

相关内容