---
author: Seth Kenlon
category: 技术
comments_data: []
count:
  commentnum: 0
  favtimes: 0
  likes: 0
  sharetimes: 0
  viewnum: 1635
date: '2023-07-06 18:51:00'
editorchoice: false
excerpt: 充分利用现有的技术，提供书签以帮助用户。
fromurl: https://opensource.com/article/22/1/pdf-metadata-pdftk
id: 15973
islctt: true
largepic: /images/p/202307/06/185044ioz6nw1jqkqnhx66.jpg
permalink: /article-15973-1.html
pic: /images/p/202307/06/185044ioz6nw1jqkqnhx66.jpg.thumb.jpg
related: []
reviewer: wxy
selector: lujun9972
summary: 充分利用现有的技术，提供书签以帮助用户。
tags:
- PDF
thumb: false
title: 使用 pdftk 为 PDF 文档创建书签
titlepic: true
translator: toknow-gh
updated: '2023-07-06 18:51:00'
---

![](/images/p/202307/06/185044ioz6nw1jqkqnhx66.jpg)



> 
> 充分利用现有的技术，提供书签以帮助用户。
> 
> 
> 


在 [介绍 pdftk-java](https://opensource.com/article/21/12/edit-pdf-linux-pdftk) 中, 我展示了如何在脚本中使用 `pdftk-java` 来快速修改 PDF 文件。


但是，`pdftk-java` 最有用的场景是处理那种动辄几百页的没有目录的大 PDF 文件。这里所谓的目录不是指文档前面供打印的目录，而是指显示在 PDF 阅读器侧边栏里的目录，它在 PDF 格式中的正式叫法是“<ruby> 书签 <rt>  bookmarks </rt></ruby>”。


![Screenshot of a sidebar table of contents next to a PDF](/images/p/202307/06/185111hcfai44dhqmtojdk.jpg "table of contents")


如果没有书签，就只能通过上下滚动或全局搜索文本来定位想要的章节，这非常麻烦。


PDF 文件的另一个恼人的小问题是缺乏元数据，比如标题和作者。如果你打开过一个标题栏上显示类似 “Microsoft Word - 04\_Classics\_Revisited.docx” 的 PDF 文件，你就能体会那种感觉了。


`pdftk-java` 让我能够创建自己的书签，我再也不面对这些问题了。


### 在 Linux 上安装 pdftk-java


正如 `pdftk-java` 的名称所示的，它是用 Java 编写的。它能够在所有主流操作系统上运行，只要你安装了 Java。


Linux 和 macOS 用户可以从 [AdoptOpenJDK.net](https://adoptopenjdk.net/releases.html) 安装 Java（LCTT 译注：原文为 Linux，应为笔误）。


Windows 用户可以安装 [Red Hat's Windows build of OpenJDK](https://developers.redhat.com/products/openjdk/download)。


在 Linux 上安装 pdftk-java：


1. 从 Gitlab 仓库下载 [pdftk-all.jar release](https://gitlab.com/pdftk-java/pdftk/-/jobs/1527259628/artifacts/raw/build/libs/pdftk-all.jar)，保存至 `~/.local/bin/` 或 [其它路径](https://opensource.com/article/17/6/set-path-linux) 下.
2. 用文本编辑器打开 `~/.bashrc`，添加 `alias pdftk='java -jar $HOME/.local/bin/pdftk-all.jar'`
3. 运行 `source ~/.bashrc` 使新的 Bash 设置生效。


### 数据转储


修改元数据的第一步是抽取 PDF 当前的数据文件。


现在的数据文件可能并没包含多少内容，但这也是一个不错的开端。



```
$ pdftk mybigfile.pdf \
  data_dump \
  output bookmarks.txt

```

生成的 `bookmarks.txt` 文件中包含了输入 PDF 文件 `mybigfile.pdf` 的所有元数据和一大堆无用数据。


### 编辑元数据


用文本编辑器（比如 [Atom](https://opensource.com/article/20/12/atom) 或 [Gedit](https://opensource.com/article/20/12/gedit)）打开 `bookmarks.txt` 以编辑 PDF 元数据。


元数据的格式和数据项直观易懂：



```
InfoBegin
InfoKey: Creator
InfoValue: Word
InfoBegin
InfoKey: ModDate
InfoValue: D:20151221203353Z00&amp;apos;00&amp;apos;
InfoBegin
InfoKey: CreationDate
InfoValue: D:20151221203353Z00&amp;apos;00&amp;apos;
InfoBegin
InfoKey: Producer
InfoValue: Mac OS X 10.10.4 Quartz PDFContext
InfoBegin
InfoKey: Title
InfoValue: Microsoft Word - 04_UA_Classics_Revisited.docx
PdfID0: f049e63eaf3b4061ddad16b455ca780f
PdfID1: f049e63eaf3b4061ddad16b455ca780f
NumberOfPages: 42
PageMediaBegin
PageMediaNumber: 1
PageMediaRotation: 0
PageMediaRect: 0 0 612 792
PageMediaDimensions: 612 792
[...]

```

你可以将 `InfoValue` 的值修改为对当前 PDF 有意义的内容。比如可以将 `Creator` 字段从 `Word` 修改为实际的作者或出版社名称。比起使用导出程序自动生成的标题，使用书籍的实际标题会更好。


你也可以做一些清理工作。在 `NumberOfPages` 之后的行都不是必需的，可以删除这些行的内容。


### 添加书签


PDF 书签的格式如下：



```
BookmarkBegin
BookmarkTitle: My first bookmark
BookmarkLevel: 1
BookmarkPageNumber: 2

```

* `BookmarkBegin` 表示这是一个书签。
* `BookmarkTitle` 书签在 PDF 阅读器中显示的文本。
* `BookmarkLevel` 书签层级。如果书签层级为 2，它将出现在上一个书签的小三角下。如果设置为 3，它会显示在上一个 2 级书签的小三角下。这让你能为章以及其中的节设置书签。
* `BookmarkPageNumber` 点击书签时转到的页码。


为你需要的章节创建书签，然后保存文件。


### 更新书签信息


现在已经准备好了元数据和书签，你可以将它们导入到 PDF 文件中。实际上是将这些信息导入到一个新的 PDF 文件中，它的内容与原 PDF 文件相同：



```
$ pdftk mybigfile.pdf \
  update_info bookmarks.txt \
  output mynewfile.pdf

```

生成的 `mynewfile.pdf` 包含了你设置的全部元数据和书签。


### 体现专业性


PDF 文件中是否包含定制化的元数据和书签可能并不会影响销售。


但是，关注元数据可以向用户表明你重视质量保证。增加书签可以为用户提供便利，同时亦是充分利用现有技术。


使用 `pdftk-java` 来简化这个过程，用户会感激不尽。


*（题图：MJ/f8869a66-562d-4ee4-9f2d-1949944d6a9c）*




---


via: <https://opensource.com/article/22/1/pdf-metadata-pdftk>


作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[toknow-gh](https://github.com/toknow-gh) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出