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

时间:2011-11-09 19:50:28

标签: pdf pdf-generation ghostscript

我正在使用

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

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

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

2 个答案:

答案 0 :(得分:4)

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

unfolding disasters已经解决了a solution这个问题。他的python script pdf-merge.py首先使用pdftk开关调用dump_data来检索所有pdfmark信息。然后,它跟踪每个合并文档的总页数,并进行数学运算以将pdfmark指令中的新页码指针偏移当前PDF文档之前包含的所有PDF文档的页面总数。所以它接近但与KenS的2遍方法不同。它首先使用pdftk发现书签,然后创建一个具有正确页码的新书签文件。它还设法将原始pdfmark指令(通常由gs保留为noop)转换。我不会假装我理解最后一部分是如何工作的......

但是,该脚本可以满足我的所有需求,包括在最终编写之前调整书签文件的选项。特雷弗金非常整洁,帽子小费。

答案 1 :(得分:2)

一般情况下,pdfwrite不知道你要追加文件,所以它保留书签和其他'元数据'信息,假设你想要它在输出中。

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

所以你需要一个2遍方法,首先合并所有文件,丢弃书签,然后'转换'合并文件并添加pdfmarks来设置正确的书签。

目前没有选项(使用pdfwrite)来保留书签。您需要修改Ghostscript PDF解释器PostScript文件以实现此目的。您可以尝试设置-dDOPDFMARKS = false,但我怀疑它会起作用。