“一些 PostScript 编程”是指提取链接信息,因为答案说 PDF 解释器已经这样做是为了 pdfwrite 设备的利益。
您的问题是链接注释使用了命名目的地:
30 0 obj
<<
/Type /Annot
/Subtype /Link
/Border [ 0 0 1 ]
/H /I
/C [ 1 0 0 ]
/Rect [ 387.470001 700.413025 394.916992 713.314026 ]
/A <<
/S /GoTo
/D (figure.caption.1)
>>
>>
endobj
名称树包含:
52 0 obj
<<
/Names [ (Doc-Start) 34 0 R (figure.caption.1) 36 0 R (page.1)
33 0 R ]
/Limits [ (Doc-Start) (page.1) ]
>>
endobj
命名的目标 figure.caption.1 指向对象 36:
36 0 obj
<<
/D [ 29 0 R /XYZ 117.828003 696.228027 null ]
>>
endobj
现在可以通过将对象 36 的内容代替原始 Destination 中的 figure.caption.1 来更简单地编写,例如:
30 0 obj
<<
/Type /Annot
/Subtype /Link
/Border [ 0 0 1 ]
/H /I
/C [ 1 0 0 ]
/Rect [ 387.470001 700.413025 394.916992 713.314026 ]
/A <<
/S /GoTo
/D [ 29 0 R /XYZ 117.828003 696.228027 null ]
>>
>>
endobj
我认为后一种更简单的构造会起作用,但通过名称树的间接性不起作用。我认为这是因为 pdfwrite 设备不保留名称树,因此它无法保留任何依赖于名称树的链接。
事实上,我完全不相信当前的代码会保留 Link 注释,这是应该的,所以我现在正在研究它。当我知道更多时,我会编辑这个答案。
[编辑]
好吧,这是我忘记的皱纹......
PDF 解释器必须以两种不同的方式处理注释,具体取决于 PDF 是否正在打印。请参阅 PDF 1.7 参考,第 8.4.2 节注释标志,位位置 3。
如果文件正在“打印”,那么保留链接注释是没有意义的(您到底要如何单击打印输出上的链接?)。
因此,当 Printed 为 true(这是默认值)时,PDF 解释器不会保留某些类型的注释。您可以通过在命令行上设置 -dPrinted=false 来轻松更改此设置。
注意 一些注释设置了“打印”标志,这就是它的全部意义所在。如果将 Printed 设置为“false”,则不会保留设置了“Print”标志的注释。如果将 Printed 设置为 true,则将保留这些注释,但不会保留 Print 标志设置为 0 的注释。当前无法让 PDF 解释器同时保留 Print true 和 Print false 的注释。这可能会在未来的版本中进行更改,因为人们确实要求这样做。
如果您设置-dPrinted=false,您的链接注释将被保留。我应该注意,它不会与您的原始 PDF 文件中的结构相同。它将使用更简单的结构,其中目的地在链接注释本身中明确说明,而不是通过名称树间接。
效果是一样的,但它是documentation中描述的那种东西的一个例子。不过我想这对你来说不是问题。
鉴于原始文件的构造方式,pdfwrite 输出更小我并不感到惊讶!出于某种原因,该文件包含八个表格、八个阴影和两个颜色空间(其中一个是空的),其中一个似乎都没有实际使用....