添加和编辑书签到 PDF 文件

添加和编辑书签到 PDF 文件

通过从一些带有书签的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
    

    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
    
  3. 然后我尝试将编辑后的元数据放回到pdf文件中pdftk in.pdf update_info in.info output out.pdf

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

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

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

答案1

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

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

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

这意味着您现在可以通过运行最初尝试的相同命令来更新书签:

pdftk in.pdf update_info in.bookmarks output out.pdf

答案2

pdftk书签格式写起来有点乏味。相反,我使用bashsedpdftk和创建了自己的脚本python3。在此存储库中查看:https://github.com/SiddharthPant/booky

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

{
  Title1, 1
  Title2, 2
  {
    Subtitle1, 3
    Subtitle2, 4
    {
      SubSubtitle1, 5
      ...
    }
  }
}

然后使用我的脚本

./booky.sh pdf_file.pdf bkmrks.txt

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

答案3

如果你仍然坚持使用那些 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. 统一码处理
  2. 输出书签文件,以便人们也可以调整它

无论如何,它应该有效

答案4

jPDF调整(Java,因此在 Unix/Linux 上运行)可以更改书签,但我不知道是否可以用它编写任何脚本。

对于脚本编写,我猜你唯一的原生 Unix/Linux 选项是 pdflatex 和 pdfpages 包。但如果您还不是 LaTeX 用户,那么这就是一个学习曲线。

编辑:实际上,使用 Ghostscript 是可能的:看这里或者这里或者 这里

相关内容