【问题标题】:PostScript - Preserve internal hyperlinks in PDFPostScript - 在 PDF 中保留内部超链接
【发布时间】:2019-12-18 20:06:56
【问题描述】:

感谢@KenS 回答了我最初的问题ps2pdf - Unable to open initial device,我遇到了另一个问题,在使用gswin64 转换我的PDF 时,我的内部超链接(例如“参见图1”)丢失了。这是我的命令:

gswin64 -dPDFSETTINGS=/ebook -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -o output.pdf input.pdf

我上传了original PDF here(将在 2 周后删除)和converted version here 的最小示例。我发现this answer,同样来自@KenS,关于提取或保留链接的潜在可能性,但它只是说“一些 PostScript 编程”。是否有另一种或“简单”的方式来实现这一目标?我找到了可以这样做的在线PDF转换器,所以一定有办法。

【问题讨论】:

    标签: pdf hyperlink ghostscript


    【解决方案1】:

    “一些 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 输出更小我并不感到惊讶!出于某种原因,该文件包含八个表格、八个阴影和两个颜色空间(其中一个是空的),其中一个似乎都没有实际使用....

    【讨论】:

    • dPrinted=false 是神奇的命令!最后,我现在正在使用它:gswin64 -dPDFSETTINGS=/ebook -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPrinted=false -o output.pdf input.pdf。非常感谢!
    • 没问题,很高兴它现在为您工作。看着这个,我意识到我不久前更改了 PDF 解释器,看起来我可能有一个解决方案来保留这两种链接。如果是这样,它将在下一个版本中。
    猜你喜欢
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2011-10-17
    • 2015-04-12
    • 2015-07-10
    • 2012-10-04
    • 2021-09-12
    相关资源
    最近更新 更多