通过从一些带有书签的pdf文件中获取元数据pdftk
,我观察了pdf元数据中书签的格式。所以我猜测使用pdftk
,可以添加和编辑 pdf 文件的书签。
我遵循以下三个步骤:
- 我首先将元数据(包括书签,如果有)从 pdf 文件获取到文本文件
pdftk in.pdf dump_data > in.info
。 接下来,我将一些书签添加到元数据文本文件中
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
- 然后我尝试将编辑后的元数据放回到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
书签格式写起来有点乏味。相反,我使用bash
、sed
、pdftk
和创建了自己的脚本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 脚本,那么
- 提取转储的书签数据
pdftk
- 编写一个额外的脚本将转储的书签数据转换为 pdfmarks 格式,该格式
gs
接受 Ghostscript 命令。 - 使用
gs
脚本将它们与 pdfmarks 合并在一起
看一眼http://blog.tremily.us/posts/PDF_bookmarks_with_Ghostscript/该脚本pdf-merge.py
完全符合您(或我)的要求。
pdf-merge.py --output=merged.pdf input1.pdf input2.pdf
他的脚本可以做一些小的改进
- 统一码处理
- 输出书签文件,以便人们也可以调整它
无论如何,它应该有效