将 PDF 与 GhostScript 相结合:使用带有更正页码的原始书签

问题描述 投票:0回答:3

我正在使用

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=book.pdf  -f front-matter.pdf fulltext-0.pdf fulltext-1.pdf back-matter.pdf

从一系列 pdf 文档创建单个 PDF 文档。我打算包含一个新的虚构内容表,并使用 pdfmark 机制 包含它。然后我注意到原始文件中已经有书签 - 然而它们引用的是原始页码,而不是组合文档中的页码。

我正在寻找两种可能的解决方案。删除原始书签或使用原始书签但以某种方式更新其页面引用...

pdf pdf-generation ghostscript
3个回答
4
投票

通常情况下,有人在你之前走过同样的路......

正在发生的灾难已经为这个问题找到了解决方案。他的 python 脚本 pdf-merge.py 首先使用

pdftk
开关调用
dump_data
来检索所有 pdfmark 信息。然后,它跟踪每个合并文档的总页数,并进行数学计算,将 pdfmark 指令中的新页码指针偏移当前 PDF 文档之前包含的所有 PDF 文档的页数总和。所以它与 KenS 的 2-pass 方法很接近,但不一样。它首先使用 pdftk 发现书签,然后创建一个具有正确页码的新书签文件。它还设法将原始 pdfmark 指令(通常由 gs 保留为 noop)。我不会假装我理解最后一部分是如何工作的......

但是,该脚本满足了我所需的一切,包括在最终编写之前调整书签文件的选项。非常整洁,向 Trevor King 致敬。


2
投票

一般来说,pdfwrite不知道您正在附加文件,因此它保留书签和其他“元数据”信息,假设您希望在输出中使用它。

但是,当您合并 PDF 文件时,保留信息将不起作用,因为第二个及后续文件的页码将不正确。

因此,您需要一种 2 遍方法,首先合并所有文件,丢弃书签,然后“转换”合并的文件并添加 pdfmarks 以设置正确的书签。

目前没有选项(使用 pdfwrite)不保留书签。我认为您需要修改 Ghostscript PDF 解释器 PostScript 文件才能实现此目的。您可以尝试设置 -dDOPDFMARKS=false,但我怀疑这是否有效。


0
投票

要从文件中删除 pdfmarks,最好的方法是将 pdf 转换为 ps,然后再次将 ps 结果转换为 pdf。

删除pdfmark

gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=结果.ps pdffilewithpdfmark.pdf

之后您可以再次转换

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=pdffilewithoutpdfmark.pdf result.ps

这两个步骤从文件中完全删除 pdfmarks。

© www.soinside.com 2019 - 2024. All rights reserved.