使用 pdftk 合并多个 pdf 效果很好。但是,有什么简单的方法可以为每个合并的 pdf 添加书签吗?
我在 pdftk 文档上没有看到任何关于此的内容,所以我认为 pdftk 不可能。
我们所有合并的文件都将是 1 页,所以想知道之后是否有任何其他实用程序可以添加书签?
或者另一个基于 linux 的 pdf 实用程序,它允许在为每个单独的 pdf 指定书签的同时进行合并。
最佳答案
您还可以使用 Ghostscript 合并多个 PDF。这条路线的一大优势是解决方案易于编写脚本,并且不需要真正的编程工作:
gswin32c.exe ^
-dBATCH -dNOPAUSE ^
-sDEVICE=pdfwrite ^
-sOutputFile=merged.pdf ^
[...more Ghostscript options as needed...] ^
input1.pdf input2.pdf input3.pdf [....]
使用 Ghostscript,您将能够传递 pdfmark 语句,这些语句可以为进入结果 PDF 的每个附加源文件添加目录和书签。例如:
gswin32c.exe ^
-dBATCH -dNOPAUSE ^
-sDEVICE=pdfwrite ^
-sOutputFile=merged.pdf ^
[...more Ghostscript options as needed...] ^
file-with-pdfmarks-to-generate-a-ToC.ps ^
-f input1.pdf input2.pdf input3.pdf [....]
或
gswin32c.exe ^
-dBATCH -dNOPAUSE ^
-sDEVICE=pdfwrite ^
-sOutputFile=merged.pdf ^
[...more Ghostscript options as needed...] ^
file-with-pdfmarks-to-generate-a-ToC.ps ^
-f input1.pdf ^
input2.pdf ^
input3.pdf [....]
有关 pdfmark 主题的一些介绍,另请参阅 Thomas Merz 的 PDFmark Primer .
编辑:
我本来想给你一个 file-with-pdfmarks-to-generate-a-ToC.ps
的例子,但不知何故忘记了。这里是:
[/Page 1 /View [/XYZ null null null] /Title (File 1) /OUT pdfmark
[/Page 2 /View [/XYZ null null null] /Title (File 2) /OUT pdfmark
[/Page 3 /View [/XYZ null null null] /Title (File 3) /OUT pdfmark
[/Page 4 /View [/XYZ null null null] /Title (File 4) /OUT pdfmark
这将为前 4 个文件创建一个 ToC == 前 4 页(因为您保证您的成分文件对于合并的输出 PDF 各有 1 页)。
[/XYZ null null null]
部分可确保您的页面视口(viewport)和缩放级别在您点击链接时不会从当前更改。 (如果你想要一个任意的例子,你可以说[/XYZ 222 111 2]
来做到这一点。)/Title(你想要的一些字符串)
事物决定了 ToC 中的文本。
而且,您甚至可以直接将这些参数添加到 Ghostscript 命令行:
gswin32c.exe ^
-o merged.pdf ^
[...more Ghostscript options as needed...] ^
-c "[/Page 1 /View [/XYZ null null null] /Title (File 1) /OUT pdfmark" ^
-c "[/Page 2 /View [/XYZ null null null] /Title (File 2) /OUT pdfmark" ^
-c "[/Page 3 /View [/XYZ null null null] /Title (File 3) /OUT pdfmark" ^
-c "[/Page 4 /View [/XYZ null null null] /Title (File 4) /OUT pdfmark" ^
-f input1.pdf ^
input2.pdf ^
input3.pdf ^
input4.pdf [....]
'另一个编辑:
哦,顺便说一句:当您使用 Ghostscript 将两个 PDF 文件合并为一个时,Ghostscript 会保留书签 - pdftk.exe 不会。让我们使用我第一次编辑的命令生成的那个(有效地连接同一文件的 2 个副本):
gswin32c ^
-sDEVICE=pdfwrite ^
-o doublemerged.pdf ^
merged.pdf ^
merged.pdf
文件 doublemerged.pdf
现在将有 2*4 = 8 个书签。
- 符合预期:书签 1、2、3 和 4 链接到第 1、2、3 和 4 页。
- 问题是,书签 5、6、7 和 8 也会链接到第 1、2、3 和 4 页。
原因是,预先存在的书签确实通过绝对页码解决了它们的链接目标。为了解决这个问题(并且书签在合并的文件中工作),必须生成书签,这些书签确实通过命名目的地指向链接目标(并确保这些在合并的文档中是唯一的)。
(这种方法也适用于linux,只需使用gs而不是gswin32c。)
附录
上面的命令行使用 [...more Ghostscript options as needed...]
作为更多选项的占位符。
如果您不使用其他选项,Ghostscript 将对各种参数应用其内置默认值。但是,这可能会给您带来您不喜欢的结果。由于 Ghostscript 会根据输入生成一个全新的 PDF,这意味着可能会更改一些原始对象。这适用于色彩空间和图像压缩级别。
如何应用保持原始嵌入图像不变的参数可以在 SuperUser: "Use Ghostscript, but tell it to not reprocess images" 查看.
关于linux - 将 PDF 与 PDFTK 与书签合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2969479/