在 PDF 文件中添加和编辑书签

Tim*_*Tim 29 pdf pdftk

通过从一些带有书签的 pdf 文件中获取元数据pdftk,我观察了 pdf 元数据中书签的格式。所以我猜用pdftk,可以添加和编辑 pdf 文件的书签。

以下是我遵循的三个步骤:

  1. 我首先通过 .pdf 文件将元数据(包括书签,如果有的话)转换为文本文件pdftk in.pdf dump_data > in.info
  2. 接下来,我将一些书签添加到元数据文本文件中in.info,将其从

    InfoKey: Creator
    InfoValue: PScript5.dll Version 5.2
    InfoKey: Title
    InfoValue: SSReader Print.
    InfoKey: Producer
    InfoValue: Acrobat Distiller 7.0 (Windows)
    InfoKey: Author
    InfoValue: Administrator
    InfoKey: ModDate
    InfoValue: D:20050605073244+08'00'
    InfoKey: CreationDate
    InfoValue: D:20050605073244+08'00'
    PdfID0: 591a87c91dc76881fdf2ccf3811e72a5
    PdfID1: 6b6ab11de8824e438e4f5eb1d85ec72
    NumberOfPages: 400
    PageLabelNewIndex: 1
    PageLabelStart: 1
    PageLabelNumStyle: DecimalArabicNumerals
    
    Run Code Online (Sandbox Code Playgroud)

    InfoKey: Creator
    InfoValue: PScript5.dll Version 5.2
    InfoKey: Title
    InfoValue: SSReader Print.
    InfoKey: Producer
    InfoValue: Acrobat Distiller 7.0 (Windows)
    InfoKey: Author
    InfoValue: Administrator
    InfoKey: ModDate
    InfoValue: D:20050605073244+08'00'
    InfoKey: CreationDate
    InfoValue: D:20050605073244+08'00'
    PdfID0: 591a87c91dc76881fdf2ccf3811e72a5
    PdfID1: 6b6ab11de8824e438e4f5eb1d85ec72
    NumberOfPages: 400
    BookmarkBegin
    BookmarkTitle: Front cover
    BookmarkLevel: 1
    BookmarkPageNumber: 1
    BookmarkBegin
    BookmarkTitle: About the Author
    BookmarkLevel: 1
    BookmarkPageNumber: 5
    BookmarkBegin
    BookmarkTitle: Title page
    BookmarkLevel: 1
    BookmarkPageNumber: 6
    BookmarkBegin
    BookmarkTitle: Copyright page
    BookmarkLevel: 1
    BookmarkPageNumber: 7
    BookmarkBegin
    BookmarkTitle: Foreword
    BookmarkLevel: 1
    PageLabelNewIndex: 1
    PageLabelStart: 1
    PageLabelNumStyle: DecimalArabicNumerals
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后我尝试将编辑过的元数据通过pdftk in.pdf update_info in.info output out.pdf.

但是当我打开新的 pdf 文件时 out.pdf在 evince 或 adobe reader 中中没有书签。

如果我得到了新的PDF文件的元数据out.pdf通过pdftk out.pdf dump_data > out.info,将有中没有书签out.info。看起来书签没有成功添加。

我想知道是否有一些错误?我应该如何添加和编辑 pdf 文件的书签,不一定是通过 pdftk?

小智 13

在我看来,从 1.45 版(2012-12-06)开始,pdftk 确实允许通过 update_info 命令修改书签:

您现在可以使用 update_info 添加或更改 PDF 的书签。

通过:http : //www.pdflabs.com/docs/pdftk-version-history/

  • 这对我很有用。在每个书签条目丢失之前,应该在 `BookmarkBegin` 标签上方的输入文件中添加它。 (3认同)

小智 7

pdftk书签格式写起来有点乏味。相反,我用我创建自己的脚本bashsedpdftkpython3。在此 repo 中查看:https : //github.com/SiddharthPant/booky

所以现在我可以创建一个这样的文本文件(bkmrks.txt),即使是 1000 页的 pdf 也只需 5 分钟即可完成。

{
  Title1, 1
  Title2, 2
  {
    Subtitle1, 3
    Subtitle2, 4
    {
      SubSubtitle1, 5
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用我的脚本

./booky.sh pdf_file.pdf bkmrks.txt
Run Code Online (Sandbox Code Playgroud)

这会自动创建一个pdf_file_new.pdf包含我的书签的 pdf( )。


lar*_*cai 5

如果你仍然坚持使用那些 unix 脚本,那么

  1. 提取转储的书签数据 pdftk
  2. 编写一个额外的脚本将转储的书签数据转换为 pdfmarks 格式,该格式gs接受ghostscript 命令。
  3. 使用gs脚本将它们与 pdfmarks 合并在一起

看看http://blog.tremily.us/posts/PDF_bookmarks_with_Ghostscript/脚本pdf-merge.py完全按照你(或我)想要的去做。

pdf-merge.py --output=merged.pdf input1.pdf input2.pdf

可以在他的脚本中进行一些小的改进

  1. Unicode 处理
  2. 输出书签文件,以便人们也可以对其进行调整

无论如何,它应该工作


小智 5

pdftk 绝对是正确的工具(具有正确的语法):

BookmarkBegin
BookmarkTitle: Chapter 1
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Paragraph 1.1
BookmarkLevel: 2
BookmarkPageNumber: 1
Run Code Online (Sandbox Code Playgroud)