【问题标题】:Is there a way to add links to merged pdfs with dompdf & ghostscript有没有办法使用 dompdf 和 ghostscript 添加指向合并 pdf 的链接
【发布时间】:2019-05-03 11:09:08
【问题描述】:

我正在尝试为几个 PDF 文档创建一个内容页面,其中将包含指向每个(与 GS 合并)pdf 开头的链接。

目前我有: 充当内容页面的 HTML 页面,将被转换为 domPDF(这部分有效) 多个节分隔页(使用 domPdf 转换的 PDF),其中包含 X 节锚点 其他 PDF 文档将被合并以创建 1 个带有内容页面的大型 PDF。

我在 shell 上运行 GS 来处理 PDF 文档的合并:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=save_path/final.pdf contents.pdf section1.pdf brochure1.pdf section2.pdf brochure2.pdf back.pdf

GS 成功地将 PDF 文档合并为 1 个大 PDF。

但是,链接不起作用。

PDF 似乎无法链接到目标位于其原始文件之外的文档。

如果我在内容文件中添加一个链接,并且目标是相同的内容文件。最终输出的 PDF 会呈现这些链接,并且它们可以按需要运行。

所以,我的问题是,是否可以在合并的 PDF 文档中包含一个链接,该链接将链接到其他合并的 PDF 文件。

任何指示或建议都会很有帮助。

谢谢

大卫

【问题讨论】:

    标签: php pdf ghostscript dompdf


    【解决方案1】:

    是的,这里的问题是 Ghostscript 在处理第一个文件时无法知道最终文件中会有多少页,更重要的是这些页的对象编号是多少。

    现在链接注释的 /Dest 可能类似于 [page /XYZ left top zoom] 在这种情况下,“页面”是一个页面对象,它是对 PDF 对象的间接引用,因此第 1 页上引用第 2 页的 /Link 可能类似于:

    [18 0 R /XYZ 0 792 1]

    如果我们假设第 2 页是输出 PDF 文件中的对象编号 18。

    在处理注释时,PDF 解释器将它们作为它对输入 PDF 文件执行的最后一件事来执行。这意味着所有页面都是完整的,因此 pdfwrite 设备知道第 2 页有(例如)对象编号 18。因此确定哪个页面与哪个对象编号相关联没有问题。

    但在您的情况下,您正在完全运行第一个文件,然后运行注释(在执行第二个文件之前)。那时,一个或多个链接指向一个尚不存在的页面。由于无法知道后续文件执行时该页面的对象编号是什么,因此pdfwrite设备无法处理链接注释。

    所以恐怕你不能用 Ghostscript 轻而易举地做你想做的事。事实上,我看不出你如何才能让你的内容文件合法地拥有这种链接。

    您可以通过某种方式做到这一点,但这比将文件串在一起要困难得多。您可以将所有链接注释留在第一页,将所有 PDF 文件一起处理,然后在处理完所有 PDF 文件后发送大量 pdfmark 指令,这些指令描述了您要创建的链接注释。

    当然,我可能会错过重点;你还没有提供任何示例文件来查看,所以我不知道你的文件目前使用的是哪种链接注释和目标。

    顺便提一下,pdfwrite 设备不会“合并”PDF 文件,这是一个复杂得多的过程。你可以找到记录在 here 的过程,我认为它值得一读,这样你就可以了解设备在这种情况下的能力和局限性。

    从根本上说,Ghostscript 和 pdfwrite 设备并非用作 PDF 编辑或操作工具。

    【讨论】:

    • 感谢您的回答,很好地解释了问题以及添加到未知大小文档的链接的困难。我会接受你的回答,因为我的研究也表明这是不可能的。
    猜你喜欢
    • 2013-10-07
    • 2023-03-16
    • 2010-11-20
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多