用 pdftk-java 命令编辑 PDF 的 4 种方法
创始人
2024-03-02 09:36:59
0

用这个方便的 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 并添加这一行:

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

PDF 修改变得简单

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


via: https://opensource.com/article/21/12/edit-pdf-linux-pdftk

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

PDF

相关内容

pdf编辑软件哪个好用?这...
PDF是一种常见的文件格式,因为其跨平台且保留文档格...
2025-06-01 12:41:41
如何转换PDF文件?试试这...
因工作需要,我们经常需要对PDF文件进行格式转换&#...
2025-06-01 07:12:35
Windows Serve...
需求:ppt上传后转成图片网上搜索了很多方法...
2025-05-31 13:40:01
Bytescout.PDF...
在.NET Core 2.0/2.1上,可以使用Bytescout...
2025-01-12 22:33:40
不支持HLMT2PDF列表...
这个错误提示通常意味着在将列表类型转换为PDF时出现了问题。下面是...
2025-01-11 22:30:28
不支持的操作:无法进行非零...
这个错误通常是由于使用PyPDF2库中的相对寻址方法(如extra...
2025-01-11 19:31:10

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...