linux - 将 PDF 与 PDFTK 与书签合并?

标签 linux pdf pdf-generation pdftk ghostscriptsharp

使用 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 页)。

  1. [/XYZ null null null] 部分可确保您的页面视口(viewport)和缩放级别在您点击链接时不会从当前更改。 (如果你想要一个任意的例子,你可以说 [/XYZ 222 111 2] 来做到这一点。)
  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/

相关文章:

c - fgetc 读取值为 -1 的字符

linux - 调用 0x16 时出现段错误

java - 如何在动态报告的 pdf 导出中写入 UTF-8(波斯语)字符?

python - 如何在不重新缩放的情况下在 Reportlab 中设置图像的最大尺寸?

java - PDF clown 使 PDF 字段变得不可见

linux - 如何将 TFS 构建延迟到 checkin 完成之后

linux - 通过ssh从redhat linux客户端连接到windows server 2003

java - Swing组件添加到ScrollPane(JavaFX)

java - : "margin : auto and display block" and parsing from XHTML to PDF using FlyingSaucer (Itext5) 图像居中时出现问题

pdf - 日期字符串的正确格式是什么?