使用 pdftk-java 命令编辑 PDF 的 4 种方法

使用这个方便的 Linux 命令,合并 PDF、删除页面、拆分 PDF 和填写表单。
42 位读者喜欢这个。
a checklist for a team

Opensource.com

在技术白皮书、手稿和 RPG 书籍之间,我每天都要处理大量的 PDF 文件。PDF 格式很受欢迎,因为它包含处理过的 PostScript 代码。PostScript 是现代打印机的本地语言,因此出版商通常会发布书籍的数字 PDF 版本,因为他们已经投入时间和精力来生成用于打印的文件。但是 PDF 并非旨在成为可编辑的格式,虽然可以进行一些逆向处理,但它应该是数字数据在发送到打印机之前的最后一站。即便如此,有时您需要对 PDF 进行调整,而我最喜欢的工具之一就是 pdftk-java 命令。

在 Linux 上安装 pdftk-java

顾名思义,pdftk-java 是用 Java 编写的,因此只要您安装了 Java,它就可以在所有主要操作系统上运行。

Linux 和 macOS 用户可以从 AdoptOpenJDK.net 安装 Java。Windows 用户可以安装 红帽的 Windows 版 OpenJDK

安装 pdftk-java

1. 从其 Gitlab 仓库下载 pdftk-all.jar 发布版,并将其保存到 ~/.local/bin/路径中的其他位置

2. 在您喜欢的文本编辑器中打开 ~/.bashrc,并将此行添加到其中

alias pdftk='java -jar $HOME/.local/bin/pdftk-all.jar'

3. 加载新的 Bash 设置

$ source ~/.bashrc

命令语法

有效的 pdftk-java 命令的结构遵循一种模式,但是模式中包含的内容具有很大的灵活性。语法有点不寻常,因为它不使用传统的 终端选项 样式,但是通过练习,记住它并不太难。

  • pdftk:调用命令的别名
  • 输入文件:您要修改的 PDF
  • 操作:您要对输入文件执行的操作
  • 输出:您要保存修改后的 PDF 文件的位置

操作部分是最复杂的,所以我将从简单的任务开始。

将两个 PDF 文件合并为一个

书籍的封面通常在一个单独的应用程序中创建,例如 Inkscape 或 GIMP,而书籍的其余部分通常在 Scribus 等排版应用程序或 LibreOffice 等办公套件中完成。您可以将两者在排版应用程序中合并。像 Scribus 这样的优秀桌面出版软件可以轻松地引用图像,以便在封面更改时,它会在排版中自动更新。但是,也可以使用 pdftk-java 将封面添加到 PDF 的前面

$ pdftk cover.pdf body.pdf \
cat \
output book.pdf

在此示例中,操作是 cat,就像 concatenate 中的那样,并且像 Linux cat 命令 一样,它将一个或多个 PDF 文件连接到单个数据流中,并且数据流被定向到 output 参数指定的任何文件中。

从 PDF 中删除页面

您不能完全从 PDF 中删除页面,但是可以创建一个新的 PDF,其中仅包含您要保留的页面。

$ pdftk book.pdf \
cat 1 3-end \
output shorter-book.pdf

在此示例中,我的书文件的第 1 页以及从第 3 页到结尾的所有页面都保存到一个新文件中。因此,我删除的页面是第 2 页。

将 PDF 拆分为单独的文件

将 PDF 文件拆分为多个不同的文件也使用 cat 操作,并且其原理与删除页面类似。您可以通过将您想要的页面发送到新文件来拆分 PDF

$ pdftk book.pdf \
cat 1-15 \
output part-1.pdf

$ pdftk book.pdf \
cat 16-42 \
output part-2.pdf

如果您需要将 PDF 拆分为单页文件,则有一个特殊的操作,称为 burst

$ pdftk book.pdf burst

$ ls
book.pdf pg_0001.pdf pg_0002.pdf
pg_0003.pdf pg_0004.pdf pg_0005.pdf
[...]

填写表单

很少有人会认为 PDF 格式多年来没有变得臃肿,您有时在 PDF 文件中找到的一个功能是可填写的表单。您在美国税务文件、RPG 角色表、在线学校练习册以及其他旨在交互的 PDF 文件中看到这种情况。虽然大多数现代 PDF 查看器(例如 GNOME 的 Evince 和 KDE 的 Okular)都可以填写 PDF 表单,但您也可以在 pdftk-java 的帮助下填写 PDF 表单。

首先,您必须使用 generate_fdf 操作提取表单数据。这将提取表单元素的 ID,并将它们放入文本文件中。

$ pdftk character-sheet.pdf \
generate_fdf \
output chsheet-form.txt

您的目标文件(在本例中为 chsheet-form.txt)包含 PDF 中包含的表单的数据,但仅包含文本部分。您可以在任何标准文本编辑器中编辑它,例如 AtomGedit

有时令人钦佩,有时令人尴尬地瞥见生成 PDF 的组织的工作流程,您会发现一些表单被清楚地标记,而另一些表单则具有默认名称,例如“Checkbox_001”和“Textfield-021”,因此您可能需要将文本文件与 PDF 交叉引用,但如果您正在编写脚本以自动填写表单,那么这可能是值得的。每个标签都标记为 /T 项目,在下一行,有用于文本输入的空间(标记为 /V)。这是一个代码片段,其中包含其标签的上下文和一些已填写的数据

/T (CharacterName 2)
/V (Abaddon)
>>
<<
/T (SlotsTotal 24)
/V ()
>>
<<
/T (Hair)
/V (Brown)
>>
<<
/T (AC)
/V (15)
>>
<<
/T (Background)
/V ()
>>
<<
/T (DEXmod )
/V ()

输入表单数据后,您可以将文本输入与 fill_form 操作的 PDF 结构结合起来

$ pdftk character-sheet.pdf \
fill_form chsheet-form.txt \
output completed.pdf

这是一个结果示例

A form filled by pdftk-java

(Seth Kenlon,CC BY-SA 4.0)

PDF 修改变得容易

当您通过 shell 脚本处理大量 PDF 文件或 PDF 文件时,像 pdftk-java 这样的工具非常宝贵,因为它使您不必手动完成所有操作。当我从 Docbook 的输出构建 PDF 时,它是调用 pdftk-java 执行任意数量任务的 Makefile,因此我不会忘记任何步骤或错误输入命令,也不需要我花费时间在上面。您可能出于许多其他原因在自己的工作流程中使用 pdftk-java,并且 pdftk-java 可以做很多其他事情,包括诸如 shufflerotatedump_dataupdate_infoattach_files 之类的操作。如果您发现自己经常处理 PDF 文件,请尝试 pdftk-java

接下来要阅读的内容
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时从事这两个行业。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.