将PDF与PDFTK合并为书签?

Jas*_*son 33 linux pdf pdf-generation pdftk ghostscriptsharp

使用pdftk合并多个pdf正在运行良好.但是,为每个pdf合并制作书签的简单方法是什么?

我没有在pdftk文档中看到任何关于此的内容,因此我认为pdftk不可能.

我们合并的所有文件都是1页,所以想知道之后是否还有其他可以添加书签的实用程序?

或者另一个基于linux的pdf实用程序,允许在为每个单独的pdf指定书签时进行合并.

Kur*_*fle 41

您还可以将多个PDF与Ghostscript合并.这条路线的一大优势是解决方案易于编写脚本,并且不需要真正的编程工作:

gswin32c.exe ^
          -dBATCH -dNOPAUSE ^
          -sDEVICE=pdfwrite ^
          -sOutputFile=merged.pdf ^
          [...more Ghostscript options as needed...] ^
          input1.pdf input2.pdf input3.pdf [....]
Run Code Online (Sandbox Code Playgroud)

使用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 [....]
Run Code Online (Sandbox Code Playgroud)

要么

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 [....]
Run Code Online (Sandbox Code Playgroud)

有关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 
Run Code Online (Sandbox Code Playgroud)

这将为前4个文件创建一个ToC ==前4个页面(因为您保证您的合成文件每个合并输出PDF为1页).

  1. [/XYZ null null null]当您按照链接时,该部件可确保您的页面视口和缩放级别不会从当前视口和缩放级别更改.([/XYZ 222 111 2]如果你想要一个任意的例子,你可以说这样做.)
  2. /Title (some string you want)的thingie决定是在什么样的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 [....]
Run Code Online (Sandbox Code Playgroud)



'编辑:

哦,顺便说一下:当你使用它将两个PDF文件合并为一个时,Ghostscript 保留书签 - pdftk.exe没有.让我们使用第一次编辑命令生成的那个(有效地连接同一个文件的2个副本):

 gswin32c ^
    -sDEVICE=pdfwrite ^
    -o doublemerged.pdf ^
     merged.pdf ^
     merged.pdf
Run Code Online (Sandbox Code Playgroud)

该文件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上看到:"使用Ghostscript,但告诉它不要重新处理图像".


ste*_*ger 10

我知道还有其他方法可以做到这一点,但是使用pdftk,您可以使用pdftk函数dump_data来合并pdf并为其添加书签,以创建pdf中现有信息的.info文件.然后,您可以通过为每个书签添加以下四行来将书签信息添加到.info文件中

BookmarkBegin
BookmarkTitle: name
BookmarkLevel: level
BookmarkPageNumber: page number
Run Code Online (Sandbox Code Playgroud)

然后使用update_info调用将合并的pdf书签更新为您写入.info文件的书签.我已经写了一些简单的函数,如果有兴趣的话,可以在autohotkey中为我做这个.请参阅http://www.autohotkey.com/board/topic/98985-scripts-to-merge-pdfs-and-add-bookmarks-with-pdftk/


cas*_*way 5

也可以使用JdfBookmarks添加或编辑 pdf 书签。这是一款出色的多操作系统自由软件工具,我已经使用了一段时间,效果非常好。它只处理书签,所以你需要另一个工具来合并或重新排序页面。除了 pdftk 之外,我建议尝试PDF Split and Merge(好的应用程序,但奇怪的用户界面,根据我的经验搞乱了书签)、PDF-Shuffler(似乎工作正常,但有时在处理某些文件时会冻结)或PdfMod(最好的可能是因为它涉及重新排列、合并和处理书签,尽管我还没有弄清楚如何将 pdf 添加到特定页面中)。

抱歉没有提供一些链接,作为新手系统只允许我添加 2 个超链接。


Fis*_*tor 5

请访问/sf/answers/1244679691/查看此答案.我使用了一种名为Sejda的东西.有用.它完美地结合了书签.谢谢@blablatros.