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

系统 Linux
技术白皮书、手稿和 RPG 手册,我每天都要处理大量的 PDF 文件。用这个方便的 Linux 命令合并 PDF、删除页面、分割 PDF 和填写表格。

[[442333]]

用这个方便的 Linux 命令合并 PDF、删除页面、分割 PDF 和填写表格。

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

在 Linux 上安装 pdftk-java

顾名思义,pdftk-java 是用 Java 编写的,所以只要你安装了 Java,它就能在所有主流的操作系统上工作。

Linux 和 macOS 用户可以从 AdoptOpenJDK.net 安装 Java。Windows 用户可以安装 Red Hat 的 OpenJDK 的 Windows版本

要安装 pdftk-java

1、从 Gitlab 仓库下载 pdftk-all.jar 程序,并将其保存到 ~/.local/bin/ 或你 path 变量中的其他位置

2、在你喜欢的文本编辑器中打开 ~/.bashrc 并添加这一行:

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

3、加载你的新 Bash 设置:

  1. $ source ~/.bashrc

命令语法

一个有效的 pdftk-java 命令的结构遵循一个模式,但在模式中的内容有很大的灵活性。语法有点不寻常,因为它没有使用传统风格的 终端选项,但经过实践,它并不难记。

  • pdftk:调用该命令的别名
  • 输入文件:你想修改的 PDF 文件
  • 动作:你想对输入文件做什么
  • 输出:你想在哪里保存你修改过的 PDF 文件

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

将两个 PDF 文件合并成一个

一本书的封面通常在一个单独的应用中创建,如 Inkscape 或 GIMP,而书的其他部分通常在 Scribus 等排版程序或 LibreOffice 等办公套件中完成,这种情况并不罕见。你可以在你的排版应用中把这两者结合起来。像 Scribus 这样的出版软件可以很容易地引用一张图片,这样当封面改变时,它就会在版面中自动更新。然而,也可以用 pdftk-java 将封面预置到 PDF 中:

  1. $ pdftk cover.pdf body.pdf \
  2. cat \
  3. output book.pdf

在这个例子中,动作是 cat 即 连接concatenate 的缩写,和 Linux 的 cat 命令 一样,它将一个或多个 PDF 文件串联成一个数据流,数据流被引导到“输出output”参数指定的任何文件中。

从一个 PDF 中删除页面

你不能确切地从一个 PDF 中删除一页,但你可以创建一个新的 PDF,只包含你想保留的页面。

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

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

将一个 PDF 分割成不同的文件

将一个 PDF 文件分割成许多不同的文件也使用 cat 动作,它的原理与删除页面相似。你可以通过将你想要的页面发送到一个新文件来分割一个 PDF:

  1. $ pdftk book.pdf \
  2. cat 1-15 \
  3. output part-1.pdf
  4. $ pdftk book.pdf \
  5. cat 16-42 \
  6. output part-2.pdf

如果你需要将一个 PDF 分割成单页文件,有一个特殊的动作,叫做 burst

  1. $ pdftk book.pdf burst
  2. $ ls
  3. book.pdf pg_0001.pdf pg_0002.pdf
  4. pg_0003.pdf pg_0004.pdf pg_0005.pdf
  5. [...]
  6.  

填写表格

很少有人能否认多年来 PDF 格式变得越来越臃肿,而你有时在 PDF 文件中发现的一个功能是可填写的表格。你会在美国税务文件、RPG 角色表、线上学校作业本和其他旨在互动的 PDF 文件中看到这种情况。虽然大多数现代的 PDF 浏览器,比如 GNOME 的 Evince 和 KDE 的 Okular,都可以填写 PDF 表格,但你也可以在 pdftk-java 的帮助下填写 PDF 表格。

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

  1. $ pdftk character-sheet.pdf \
  2. generate_fdf \
  3. output chsheet-form.txt
  4.  

你的目标文件(在这个例子中是 chsheet-form.txt)包含 PDF 中的表格数据,但只是文本部分。你可以在任何标准的文本编辑器中编辑它,如 Atom 或 Gedit

在对生成 PDF 的组织的工作流程的有时令人钦佩和有时尴尬的一瞥中,你会发现一些表格有明确的标签,而其他表格有默认的名字,如 “Checkbox_001” 和 “Textfield-021”,所以你可能要把你的文本文件和你的 PDF 对照一下,但如果你要写一个脚本来自动填写表格,这可能是值得的。每个标签都被标记为 /T 项,在接下来的一行中,有空间(标记为 /V)提供给文本输入。下面是一个片段,它的标签有上下文,并填入了一些数据:

  1. /T (CharacterName 2)
  2. /V (Abaddon)
  3. >>
  4. <<
  5. /T (SlotsTotal 24)
  6. /V ()
  7. >>
  8. <<
  9. /T (Hair)
  10. /V (Brown)
  11. >>
  12. <<
  13. /T (AC)
  14. /V (15)
  15. >>
  16. <<
  17. /T (Background)
  18. /V ()
  19. >>
  20. <<
  21. /T (DEXmod )
  22. /V ()

当你输入了表单数据,你就可以用 fill_form 动作将你的文本输入与 PDF 结构结合起来:

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

下面是一个结果示例。 

[[442334]]

A form filled by pdftk-java

PDF 修改变得简单

当你处理大量的 PDF 文件或通过 shell 脚本处理 PDF 文件时,像 pdftk-java 这样的工具是非常有价值的,因为它使你不必手动做所有的事情。当我从 Docbook 的输出建立一个 PDF 时,它是一个 Makefile,调用 pdftk-java 完成任何数量的任务,所以我没有机会忘记某个步骤或打错命令,也没有必要把时间花在这上面。在你自己的工作流程中,还有很多其他的原因你可能会使用 pdftk-java,它还可以做很多其他的事情,包括 shufflerotatedump_dataupdate_info 和 attach_files 等动作。如果你发现自己经常与 PDF 文件打交道,可以试试 pdftk-java。 

 

责任编辑:庞桂玉 来源: Linux中国
相关推荐

2014-03-17 09:22:43

Linux命令

2021-11-08 12:17:09

LinuxLinux命令编辑照片

2014-02-28 10:50:24

Linux命令

2011-06-22 15:21:08

XML

2009-03-31 13:12:30

解析XMLJava

2022-09-02 14:29:01

JavaScrip数组属性

2010-03-18 17:57:37

Java XMLSoc

2009-11-23 15:57:51

PHP伪静态

2021-03-10 10:13:39

爬虫Python代码

2020-08-10 00:30:55

备份密码iPhone移动安全

2009-02-25 09:52:14

类型转换.NET 强制转型

2022-11-04 13:35:29

IT远程工作混合工作

2022-12-07 10:28:22

2020-01-21 19:15:23

漏洞安全IT

2021-09-03 11:24:04

云计算云计算环境云应用

2010-08-02 16:47:46

Flex

2009-09-17 16:55:58

C#组件设计

2020-07-24 09:56:12

React开发数据

2010-07-16 13:50:53

Perl哈希表

2016-06-28 10:19:31

云计算云安全
点赞
收藏

51CTO技术栈公众号