PostScript - 保留 PDF 中的内部超链接
PostScript - Preserve internal hyperlinks in PDF
感谢@KenS 回答了我最初的问题 ,我 运行 遇到了另一个问题,当使用 gswin64
。这是我的命令:
gswin64 -dPDFSETTINGS=/ebook -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -o output.pdf input.pdf
我上传了一个最小的 original PDF here (will be deleted after 2 weeks) and the converted version here. I found this answer 示例,也是来自@KenS,关于提取或保留链接的潜在可能性,但它只是说 "some PostScript programming"。是否有另一种或 "simple" 方法可以实现此目的?我找到了可以这样做的在线 PDF 转换器,所以一定有办法。
'some PostScript programming' 指的是提取 Link 信息,因为答案说 PDF 解释器已经为 pdfwrite 设备这样做了。
您的问题是 Link 注释使用了命名目标:
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 的内容替换原始目标中的 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 devcie 不保留名称树,所以它不能保留任何依赖名称树的 links。
事实上,我不相信当前的代码完全保留了 Link 注释,它应该保留,所以我现在正在研究它。当我知道更多时,我会编辑这个答案。
[编辑]
好的,这是我忘记的皱纹....
PDF 解释器必须以两种不同的方式处理注释,这取决于是否正在打印 PDF。请参阅 PDF 1.7 参考,第 8.4.2 节注释标志,位位置 3。
如果文件是 'Printed' 那么保留 Link 注释是没有意义的(你到底要如何在打印输出上点击 link?)。
因此,当 Printed 为 true(默认值)时,PDF 解释器不会保留某些类型的注释。您可以通过在命令行上设置 -dPrinted=false
来很容易地改变它。
NOTE 一些注释设置了 'Print' 标志,这就是全部内容。如果将 Printed 设置为 'false',则不会保留设置了 'Print' 标志的注释。如果将 Printed 设置为 true,则将保留这些注释,但不会保留将 Print 标志设置为 0 的注释。目前没有办法让 PDF 解释器同时保留 Print true 和 Print false 的注释。这可能会在未来的版本中更改,因为人们确实要求它。
如果您设置 -dPrinted=false
,您的 Link 注释将被保留。我应该注意,它不会 与原始 PDF 文件中的结构相同。它将使用更简单的构造,其中目的地在 Link 注释本身中明确说明,而不是通过名称树间接指定。
效果是一样的,但它是documentation中描述的那种东西的例子。不过,我想这对您来说不是问题。
考虑到原始文件的构造方式,pdfwrite 输出较小我并不感到惊讶!出于某种原因,此文件包含八个表单、八个阴影和两个颜色空间(其中一个是空的)none,其中似乎已实际使用....
感谢@KenS 回答了我最初的问题 gswin64
。这是我的命令:
gswin64 -dPDFSETTINGS=/ebook -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -o output.pdf input.pdf
我上传了一个最小的 original PDF here (will be deleted after 2 weeks) and the converted version here. I found this answer 示例,也是来自@KenS,关于提取或保留链接的潜在可能性,但它只是说 "some PostScript programming"。是否有另一种或 "simple" 方法可以实现此目的?我找到了可以这样做的在线 PDF 转换器,所以一定有办法。
'some PostScript programming' 指的是提取 Link 信息,因为答案说 PDF 解释器已经为 pdfwrite 设备这样做了。
您的问题是 Link 注释使用了命名目标:
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 的内容替换原始目标中的 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 devcie 不保留名称树,所以它不能保留任何依赖名称树的 links。
事实上,我不相信当前的代码完全保留了 Link 注释,它应该保留,所以我现在正在研究它。当我知道更多时,我会编辑这个答案。
[编辑]
好的,这是我忘记的皱纹....
PDF 解释器必须以两种不同的方式处理注释,这取决于是否正在打印 PDF。请参阅 PDF 1.7 参考,第 8.4.2 节注释标志,位位置 3。
如果文件是 'Printed' 那么保留 Link 注释是没有意义的(你到底要如何在打印输出上点击 link?)。
因此,当 Printed 为 true(默认值)时,PDF 解释器不会保留某些类型的注释。您可以通过在命令行上设置 -dPrinted=false
来很容易地改变它。
NOTE 一些注释设置了 'Print' 标志,这就是全部内容。如果将 Printed 设置为 'false',则不会保留设置了 'Print' 标志的注释。如果将 Printed 设置为 true,则将保留这些注释,但不会保留将 Print 标志设置为 0 的注释。目前没有办法让 PDF 解释器同时保留 Print true 和 Print false 的注释。这可能会在未来的版本中更改,因为人们确实要求它。
如果您设置 -dPrinted=false
,您的 Link 注释将被保留。我应该注意,它不会 与原始 PDF 文件中的结构相同。它将使用更简单的构造,其中目的地在 Link 注释本身中明确说明,而不是通过名称树间接指定。
效果是一样的,但它是documentation中描述的那种东西的例子。不过,我想这对您来说不是问题。
考虑到原始文件的构造方式,pdfwrite 输出较小我并不感到惊讶!出于某种原因,此文件包含八个表单、八个阴影和两个颜色空间(其中一个是空的)none,其中似乎已实际使用....