我们滥用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