Linux下用pdftk-java 命令编辑 PDF 的四种方法
<p><img title="Linux下用pdftk-java 命令编辑 PDF 的四种方法" alt="Linux下用pdftk-java 命令编辑 PDF 的四种方法" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/4e84eb57fdf5886ecfa78f35f14df2bd.jpg" width="auto"></p>
<p>
用这个方便的 Linux 命令合并 PDF、删除页面、分割 PDF 和填写表格。</p>
<p>
技术白皮书、手稿和 RPG 手册,我每天都要处理大量的 PDF 文件。PDF 格式之所以受欢迎,是因为它包含经过处理的 PostScript 代码。PostScript 是现代打印机的原生语言,所以出版商经常将一本书的数字版本发布为 PDF,因为他们已经投入了时间和精力来制作印刷用的文件。但是,PDF 并不是一种可编辑的格式,虽然可以进行一些逆向处理,但它是数字数据发送到打印机之前的最后一站。即便如此,有时你还是需要对 PDF 进行调整,而我最喜欢的工具之一就是 pdftk-java 命令。</p>
<h3 class="mume-header" id="%E5%9C%A8-linux-%E4%B8%8A%E5%AE%89%E8%A3%85-pdftk-java">
在 Linux 上安装 pdftk-java</h3>
<p>
顾名思义,<code>pdftk-java</code> 是用 Java 编写的,所以只要你安装了 Java,它就能在所有主流的操作系统上工作。</p>
<p>
Linux 和 macOS 用户可以从 AdoptOpenJDK.net 安装 Java。Windows 用户可以安装 Red Hat 的 OpenJDK 的 Windows版本。</p>
<p>
要安装 <code>pdftk-java</code>:</p>
<p>
1、从 Gitlab 仓库下载 pdftk-all.jar 程序,并将其保存到 <code>~/.local/bin/</code> 或你 path 变量中的其他位置。</p>
<p>
2、在你喜欢的文本编辑器中打开 <code>~/.bashrc</code> 并添加这一行:</p>
<ol class="linenums">
<li class="L0">
<code><span class="kwd">alias</span><span class="pln"> pdftk</span><span class="pun">=</span><span class="str">'java -jar $HOME/.local/bin/pdftk-all.jar'</span></code>
</li>
</ol>
<p>
3、加载你的新 Bash 设置:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pln">$ source </span><span class="pun">~/.</span><span class="pln">bashrc</span></code>
</li>
</ol>
<h3 class="mume-header" id="%E5%91%BD%E4%BB%A4%E8%AF%AD%E6%B3%95">
命令语法</h3>
<p>
一个有效的 <code>pdftk-java</code> 命令的结构遵循一个模式,但在模式中的内容有很大的灵活性。语法有点不寻常,因为它没有使用传统风格的 终端选项,但经过实践,它并不难记。</p>
<ul>
<li>
<code>pdftk</code>:调用该命令的别名</li>
<li>
输入文件:你想修改的 PDF 文件</li>
<li>
动作:你想对输入文件做什么</li>
<li>
输出:你想在哪里保存你修改过的 PDF 文件</li>
</ul>
<p>
最复杂的是动作部分,所以我将从简单的任务开始。</p>
<h3 class="mume-header" id="%E5%B0%86%E4%B8%A4%E4%B8%AA-pdf-%E6%96%87%E4%BB%B6%E5%90%88%E5%B9%B6%E6%88%90%E4%B8%80%E4%B8%AA">
将两个 PDF 文件合并成一个</h3>
<p>
一本书的封面通常在一个单独的应用中创建,如 Inkscape 或 GIMP,而书的其他部分通常在 Scribus 等排版程序或 LibreOffice 等办公套件中完成,这种情况并不罕见。你可以在你的排版应用中把这两者结合起来。像 Scribus 这样的出版软件可以很容易地引用一张图片,这样当封面改变时,它就会在版面中自动更新。然而,也可以用 <code>pdftk-java</code> 将封面预置到 PDF 中:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pln">$ pdftk cover</span><span class="pun">.</span><span class="pln">pdf body</span><span class="pun">.</span><span class="pln">pdf \</span></code>
</li>
<li class="L1">
<code><span class="kwd">cat</span><span class="pln"> \</span></code>
</li>
<li class="L2">
<code><span class="pln">output book</span><span class="pun">.</span><span class="pln">pdf</span></code>
</li>
</ol>
<p>
在这个例子中,动作是 <code>cat</code> 即 <ruby>连接<rt>concatenate</rt></ruby> 的缩写,和 Linux 的 cat 命令 一样,它将一个或多个 PDF 文件串联成一个数据流,数据流被引导到“<ruby>输出<rt>output</rt></ruby>”参数指定的任何文件中。</p>
<h3 class="mume-header" id="%E4%BB%8E%E4%B8%80%E4%B8%AA-pdf-%E4%B8%AD%E5%88%A0%E9%99%A4%E9%A1%B5%E9%9D%A2">
从一个 PDF 中删除页面</h3>
<p>
你不能确切地从一个 PDF 中删除一页,但你可以创建一个新的 PDF,只包含你想保留的页面。</p>
<ol class="linenums">
<li class="L0">
<code><span class="pln">$ pdftk book</span><span class="pun">.</span><span class="pln">pdf \</span></code>
</li>
<li class="L1">
<code><span class="kwd">cat</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="lit">3</span><span class="pun">-</span><span class="kwd">end</span><span class="pln"> \</span></code>
</li>
<li class="L2">
<code><span class="pln">output shorter</span><span class="pun">-</span><span class="pln">book</span><span class="pun">.</span><span class="pln">pdf</span></code>
</li>
</ol>
<p>
在这个例子中,我的书的文件的第 1 页,以及从 3 到结尾的所有页面,都被保存到一个新文件中。因此,我删除的那一页是第 2 页。</p>
<h3 class="mume-header" id="%E5%B0%86%E4%B8%80%E4%B8%AA-pdf-%E5%88%86%E5%89%B2%E6%88%90%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%87%E4%BB%B6">
将一个 PDF 分割成不同的文件</h3>
<p>
将一个 PDF 文件分割成许多不同的文件也使用 <code>cat</code> 动作,它的原理与删除页面相似。你可以通过将你想要的页面发送到一个新文件来分割一个 PDF:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pln">$ pdftk book</span><span class="pun">.</span><span class="pln">pdf \</span></code>
</li>
<li class="L1">
<code><span class="kwd">cat</span><span class="pln"> </span><span class="lit">1</span><span class="pun">-</span><span class="lit">15</span><span class="pln"> \</span></code>
</li>
<li class="L2">
<code><span class="pln">output part</span><span class="pun">-</span><span class="lit">1.pdf</span></code>
</li>
<li class="L3">
<code><span class="pln">$ pdftk book</span><span class="pun">.</span><span class="pln">pdf \</span></code>
</li>
<li class="L4">
<code><span class="kwd">cat</span><span class="pln"> </span><span class="lit">16</span><span class="pun">-</span><span class="lit">42</span><span class="pln"> \</span></code>
</li>
<li class="L5">
<code><span class="pln">output part</span><span class="pun">-</span><span class="lit">2.pdf</span></code>
</li>
</ol>
<p>
如果你需要将一个 PDF 分割成单页文件,有一个特殊的动作,叫做 <code>burst</code>:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pln">$ pdftk book</span><span class="pun">.</span><span class="pln">pdf burst</span></code>
</li>
<li class="L1">
<code><span class="pln">$ </span><span class="kwd">ls</span></code>
</li>
<li class="L2">
<code><span class="pln">book</span><span class="pun">.</span><span class="pln">pdf pg_0001</span><span class="pun">.</span><span class="pln">pdf pg_0002</span><span class="pun">.</span><span class="pln">pdf</span></code>
</li>
<li class="L3">
<code><span class="pln">pg_0003</span><span class="pun">.</span><span class="pln">pdf pg_0004</span><span class="pun">.</span><span class="pln">pdf pg_0005</span><span class="pun">.</span><span class="pln">pdf</span></code>
</li>
<li class="L4">
<code><span class="pun">[...]</span></code>
</li>
<li class="L5">
</li>
</ol>
<h3 class="mume-header" id="%E5%A1%AB%E5%86%99%E8%A1%A8%E6%A0%BC">
填写表格</h3>
<p>
很少有人能否认多年来 PDF 格式变得越来越臃肿,而你有时在 PDF 文件中发现的一个功能是可填写的表格。你会在美国税务文件、RPG 角色表、线上学校作业本和其他旨在互动的 PDF 文件中看到这种情况。虽然大多数现代的 PDF 浏览器,比如 GNOME 的 Evince 和 KDE 的 Okular,都可以填写 PDF 表格,但你也可以在 <code>pdftk-java</code> 的帮助下填写 PDF 表格。</p>
<p>
首先,你必须使用 <code>generate_fdf</code> 动作提取表单数据。这将提取表单元素的 ID,并将它们放入一个文本文件。</p>
<ol class="linenums">
<li class="L0">
<code><span class="pln">$ pdftk character</span><span class="pun">-</span><span class="pln">sheet</span><span class="pun">.</span><span class="pln">pdf \</span></code>
</li>
<li class="L1">
<code><span class="pln">generate_fdf \</span></code>
</li>
<li class="L2">
<code><span class="pln">output chsheet</span><span class="pun">-</span><span class="pln">form</span><span class="pun">.</span><span class="pln">txt</span></code>
</li>
<li class="L3">
</li>
</ol>
<p>
你的目标文件(在这个例子中是 <code>chsheet-form.txt</code>)包含 PDF 中的表格数据,但只是文本部分。你可以在任何标准的文本编辑器中编辑它,如 Atom 或 Gedit。</p>
<p>
在对生成 PDF 的组织的工作流程的有时令人钦佩和有时尴尬的一瞥中,你会发现一些表格有明确的标签,而其他表格有默认的名字,如 “Checkbox_001” 和 “Textfield-021”,所以你可能要把你的文本文件和你的 PDF 对照一下,但如果你要写一个脚本来自动填写表格,这可能是值得的。每个标签都被标记为 <code>/T</code> 项,在接下来的一行中,有空间(标记为 <code>/V</code>)提供给文本输入。下面是一个片段,它的标签有上下文,并填入了一些数据:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pun">/</span><span class="pln">T </span><span class="pun">(</span><span class="typ">CharacterName</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span></code>
</li>
<li class="L1">
<code><span class="pun">/</span><span class="pln">V </span><span class="pun">(</span><span class="typ">Abaddon</span><span class="pun">)</span></code>
</li>
<li class="L2">
<code><span class="pun">>></span></code>
</li>
<li class="L3">
<code><span class="pun"><<</span></code>
</li>
<li class="L4">
<code><span class="pun">/</span><span class="pln">T </span><span class="pun">(</span><span class="typ">SlotsTotal</span><span class="pln"> </span><span class="lit">24</span><span class="pun">)</span></code>
</li>
<li class="L5">
<code><span class="pun">/</span><span class="pln">V </span><span class="pun">()</span></code>
</li>
<li class="L6">
<code><span class="pun">>></span></code>
</li>
<li class="L7">
<code><span class="pun"><<</span></code>
</li>
<li class="L8">
<code><span class="pun">/</span><span class="pln">T </span><span class="pun">(</span><span class="typ">Hair</span><span class="pun">)</span></code>
</li>
<li class="L9">
<code><span class="pun">/</span><span class="pln">V </span><span class="pun">(</span><span class="typ">Brown</span><span class="pun">)</span></code>
</li>
<li class="L0">
<code><span class="pun">>></span></code>
</li>
<li class="L1">
<code><span class="pun"><<</span></code>
</li>
<li class="L2">
<code><span class="pun">/</span><span class="pln">T </span><span class="pun">(</span><span class="pln">AC</span><span class="pun">)</span></code>
</li>
<li class="L3">
<code><span class="pun">/</span><span class="pln">V </span><span class="pun">(</span><span class="lit">15</span><span class="pun">)</span></code>
</li>
<li class="L4">
<code><span class="pun">>></span></code>
</li>
<li class="L5">
<code><span class="pun"><<</span></code>
</li>
<li class="L6">
<code><span class="pun">/</span><span class="pln">T </span><span class="pun">(</span><span class="typ">Background</span><span class="pun">)</span></code>
</li>
<li class="L7">
<code><span class="pun">/</span><span class="pln">V </span><span class="pun">()</span></code>
</li>
<li class="L8">
<code><span class="pun">>></span></code>
</li>
<li class="L9">
<code><span class="pun"><<</span></code>
</li>
<li class="L0">
<code><span class="pun">/</span><span class="pln">T </span><span class="pun">(</span><span class="typ">DEXmod</span><span class="pln"> </span><span class="pun">)</span></code>
</li>
<li class="L1">
<code><span class="pun">/</span><span class="pln">V </span><span class="pun">()</span></code>
</li>
</ol>
<p>
当你输入了表单数据,你就可以用 <code>fill_form</code> 动作将你的文本输入与 PDF 结构结合起来:</p>
<ol class="linenums">
<li class="L0">
<code><span class="pln">$ pdftk character</span><span class="pun">-</span><span class="pln">sheet</span><span class="pun">.</span><span class="pln">pdf \</span></code>
</li>
<li class="L1">
<code><span class="pln">fill_form chsheet</span><span class="pun">-</span><span class="pln">form</span><span class="pun">.</span><span class="pln">txt \</span></code>
</li>
<li class="L2">
<code><span class="pln">output completed</span><span class="pun">.</span><span class="pln">pdf</span></code>
</li>
</ol>
<p>
下面是一个结果示例。</p>
<p>
<img title="Linux下用pdftk-java 命令编辑 PDF 的四种方法" alt="Linux下用pdftk-java 命令编辑 PDF 的四种方法" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/024242b15c7cca21076f93953d3b9f96.jpg"></p>
<p class="article_img_desc">
<em>A form filled by pdftk-java</em></p>
<h3 class="mume-header" id="pdf-%E4%BF%AE%E6%94%B9%E5%8F%98%E5%BE%97%E7%AE%80%E5%8D%95">
PDF 修改变得简单</h3>
<p>
当你处理大量的 PDF 文件或通过 shell 脚本处理 PDF 文件时,像 <code>pdftk-java</code> 这样的工具是非常有价值的,因为它使你不必手动做所有的事情。当我从 Docbook 的输出建立一个 PDF 时,它是一个 Makefile,调用 <code>pdftk-java</code> 完成任何数量的任务,所以我没有机会忘记某个步骤或打错命令,也没有必要把时间花在这上面。在你自己的工作流程中,还有很多其他的原因你可能会使用 <code>pdftk-java</code>,它还可以做很多其他的事情,包括 <code>shuffle</code>、<code>rotate</code>、<code>dump_data</code>、<code>update_info</code> 和 <code>attach_files</code> 等动作。如果你发现自己经常与 PDF 文件打交道,可以试试 <code>pdftk-java</code>。</p>
<p>
原文链接:https://linux.cn/article-14121-1.html</p>
頁:
[1]