如何在Ubuntu 18.04及更高版本中安装pdftk?

在Ubuntu 18.04上有没有机会让pdftk工作? 我需要这个来在shell中创建带水印的PDF文件。

或者,有没有人知道一个能在shell中生成带水印的PDF文件的可行替代方案?

我已经检查/尝试了所有的这些:

sudo apt list pdf*
Listing... Done
pdf-presenter-console/bionic 4.1-2 amd64
pdf-redact-tools/bionic,bionic 0.1.2-1 all
pdf.js-common/bionic,bionic 1.5.188+dfsg-1 all
pdf2djvu/bionic 0.9.8-0ubuntu1 amd64
pdf2svg/bionic 0.2.3-1 amd64
pdfcrack/bionic 0.16-1 amd64
pdfcube/bionic 0.0.5-2build6 amd64
pdfcube-dbg/bionic 0.0.5-2build6 amd64
pdfgrep/bionic 2.0.1-1 amd64
pdfminer-data/bionic,bionic 20140328+dfsg-1 all
pdfmod/bionic,bionic 0.9.1-8 all
pdfmod-dbg/bionic,bionic 0.9.1-8 all
pdfposter/bionic,bionic 0.6.0-2 all
pdfresurrect/bionic 0.14-1 amd64
pdfsam/bionic,bionic 3.3.5-1 all
pdfsandwich/bionic 0.1.6-1 amd64
pdfshuffler/bionic,bionic 0.6.0-8 all
pdftoipe/bionic 1:7.2.7-1build1 amd64

但是没有找到一个可用的工具。

5和 PDF 链接(PDF Chain),这两个工具对我来说非常宝贵! - Joshp.23
请访问https://bugs.launchpad.net/ubuntu/+source/pdftk/+bug/1764450,并标记该错误也影响到您。 - DK Bose
你可以尝试使用一个安装了pdftk的Ubuntu 16.04的Docker镜像来运行pdftk。 - Ademir F Furtado
4不要只写“你可以试试……”,解释一下如何做以及需要遵循的步骤,这样答案会更有帮助。 - ADDB
这个主意不错,我现在就试试看……听起来比从artful软件包中安装pdftk更有用。 - WiKrIe
如果需要的话,我可以做一个简短的教程,介绍如何安装和运行Docker版本。 - WiKrIe
1如果您自己解决了问题,请回答您自己的问题并接受您的答案。请不要将答案放在问题或评论中! :-) 我已经恢复了添加答案的更改,但您始终可以通过链接查看帖子的历史记录。 - David Foerster
我已经在我的原始问题中做了一个简短的回答,更新2。我只是想问一下是否有人需要一个详细的逐步教程。 - WiKrIe
6FYI,pdftk已从软件仓库中删除,并且有一个功能请求要求将其重新添加。 - David Foerster
2真可惜,这么好的工具就因为开发者找不到一个可接受的解决方案而被移除了。 - Daniel Alder
17个回答

由于其依赖于现已弃用的GCJ运行时,Ubuntu中的pdftk软件包(以及其上游Debian软件包)已被删除。我找到了一个依赖于OpenJDK或类似软件的分支。

从未来的Ubuntu版本安装(推荐)

从Cosmic(Ubuntu 18.10)开始,Ubuntu使用与下面相同的源代码提供pdftk-java作为替代品。尝试安装pdftk将会安装这个软件包。早期版本的用户可以从软件包存储库手动下载并使用他们喜欢的软件包管理器进行安装

从PPA安装(已过时)

我构建了一个适合Bionic版本的Deb软件包,并具备适当的依赖关系:

sudo add-apt-repository ppa:malteworld/ppa
sudo apt update
sudo apt install pdftk

包含一个包装脚本,放置在 /usr/bin 中,所以您可以像平常一样调用它。
pdftk <arguments> ...

从源代码安装

安装构建工具和依赖项: ``` sudo apt install git default-jdk-headless ant \ libcommons-lang3-java libbcprov-java ``` 当然,您可以使用与`default-jdk-headless`提供的不同支持的JDK。
下载Marc Vinyal的pdftk分支: ``` git clone https://gitlab.com/pdftk-java/pdftk.git cd pdftk ```
将所需库的符号链接放入`lib`文件夹: ``` mkdir lib ln -st lib /usr/share/java/{commons-lang3,bcprov}.jar ```
构建JAR包: ``` ant jar ```
运行JAR包: ``` java -jar build/jar/pdftk.jar --help ```
(可选)要运行JAR包,例如在将其分发到其他系统时,您至少需要一个可用的(无头)JRE,例如来自`default-jre-headless`软件包,以及Java库`libcommons-lang3-java`和`libbcprov-java`: ``` sudo apt install default-jre-headless libcommons-lang3-java libbcprov-java ``` 同样,您可以使用与`default-jre-headless`不同的JRE。根据文档,此pdftk分支还支持旧版JRE版本(≥ 7)。
(可选)您可以通过update-binfmts(8)让Linux执行JAR(Java Archive)文件。大多数Deb软件包中提供的JRE(包括Canonical软件包存储库中的软件包)在安装过程中会处理此问题,尽管某些OpenJDK软件包似乎存在错误。

P.S.:我在Ubuntu Trusty上尝试了非无头的OpenJDK 9,但我看不出为什么它不能与无头的OpenJDK 10在Bionic上一样工作。

相关应用程序

一个评论者提出了一个合理的问题,即依赖于PDF Chain应用程序是否受到此更改的影响:

  • 不会PDF Chain是一个C++应用程序,不会直接受到GCJ弃用的影响。它需要一个可用的pdftk可执行文件,但不关心其内部工作方式。无论如何,PDF Chain以及pdftk都已从Bionic中删除。

我正在阅读关于在18.04版本中从软件仓库中删除的另一个软件包的问题,有一位用户建议使用gdebi安装.deb软件包,它应该能处理依赖关系。你认为这样做会起作用还是会导致一些问题?这可能是个愚蠢的问题,我只是想更多地了解软件包管理。 - Hee Jin
6这个答案中的两组说明都是安装Marc Vinyal的pdftk-java分支。这很可能会成为Debian(参见)和Ubuntu(18.10有一个可用的软件包)中pdftk的官方替代品。因此,这似乎是最好的答案,因为它是“未来可靠”的:从18.10开始,您将在官方仓库中获得相同的软件。 - tanius
@DavidFoerster 好的。问题:为什么推荐使用通过apt安装的库时,要使用ant而不是Gradle进行构建? - Raphael
在关于这些虚拟包的后续问题中,对pdftk-java的依赖是否选择得当产生了疑问。你可能想要去核实一下。 - Raphael
我创建了用于equivs的软件包描述,它提供了通过SDKMAN!安装的Java作为满足pdftk-java依赖的软件包。 - Raphael
非常出色的回答 - 现在我在我的18.04安装中有了pdftk,非常感谢你! - Astrid_Redfern

对于Ubuntu 18.04,只需安装pdftk的快照包:

sudo snap install pdftk

1符号链接对我来说不起作用,因为snap似乎需要脚本名称。但是一个最简单的包装脚本/snap/bin/pdftk-smoser.pdftk "$@"同样有效。 - Boldewyn
什么版本的Ubuntu?我上面给出的详细说明对我有效。我从一些Perl XML处理脚本中调用pdftk,酸性测试是这些脚本能够正常工作并生成合并的PDF文件。 - pgoetz
Kubuntu 18.04,刚从16.04升级过来,发现pdftk不见了。当我创建符号链接后,在bash中运行pdftk会显示snap的帮助信息。¯\(ツ) - Boldewyn
请确保 Snap 守护进程正在运行。 - pgoetz
3我在上面的答案中进行了更新,现在只使用'pdftk'而不是'pdftk',因为我(smoser)已经上传了一个名为'pdftk'的快照到商店,并且内容相同。(https://snapcraft.io/pdftk) - smoser
你们能否(@pgoetz或@smoser)详细说明一下还需要哪些额外步骤?我需要将snap链接到/usr/local/bin/pdftk,以便在bash中使命令正常工作,但即使我以devmode重新安装snap,仍然无法访问/var/www/some/path中的pdf文件。 - cypherabe
符号链接只是一个路径问题,我怀疑。无论如何,出于方便起见,您都希望这样做。不过,我不确定为什么您在访问/var/www/*中的PDF文件时会遇到麻烦——您是否检查过这是否只是权限问题?当您尝试从这些位置打开PDF文件时会发生什么?我记得我曾经留下了一个更详细的答案,但似乎被smoser编辑过了。也许他也可以对此发表意见。至少,人们会认为您至少希望将符号链接指向一个常见的路径位置。 - pgoetz
7这似乎安装得很好,但之后 pdftk 无法打开或处理任何文件(总是显示“错误:找不到文件。错误:无法打开 PDF 文件:”),而且没有 man 手册。最后我使用 snap remove 将其移除,并采用了上述 @abu_bua 的解决方案,完美地解决了问题。 - scoobydoo
这个通过快速安装的 pdftk 版本似乎无法处理由非运行 pdftk 的用户拥有的文件,即使这些文件设置为全局可读。我选择了上面提到的 "David Foerster" 的 PPA,并且效果更好。(尽管我仍然在使用文件 "-" 时遇到问题) - Daniel Martin
2由于快照的设计要点,快照无法访问所有文件。关于此问题的一些信息可在https://github.com/smoser/pdftk/issues/1上找到。最简单的解决方案是将文件放在您的主目录中。 - smoser
1谢谢,我在Ubuntu 18.04 LTS上使用snap install pdftk命令安装了pdftk,并且它完美地开箱即用! - Timo Jyrinki
1/snap/bin/无论什么都可以在Ubuntu 18.04上运行一段时间,但会出现各种权限被拒绝的问题。对于pdftk来说,错误是java.io.FileNotFoundException。其他应用程序的失败列表是无穷无尽的。我不得不删除几乎所有的snap应用,并用apt替换它们。Snap是目前在Ubuntu 18.04上发生的最糟糕的事情。 - SYK

在Ubuntu 18.04 amd64上安装pdftk

我编写了一个小的bash脚本,用于自动化在Ubuntu 18.04上的安装。请注意,我只下载了amd64包!

#!/bin/bash
#
# author: abu
# date:   July 3 2019 (ver. 1.1)
# description: bash script to install pdftk on Ubuntu 18.04 for amd64 machines
##############################################################################
#
# change to /tmp directory
cd /tmp
# download packages
wget http://launchpadlibrarian.net/340410966/libgcj17_6.4.0-8ubuntu1_amd64.deb \
 http://launchpadlibrarian.net/337429932/libgcj-common_6.4-3ubuntu1_all.deb \
 https://launchpad.net/ubuntu/+source/pdftk/2.02-4build1/+build/10581759/+files/pdftk_2.02-4build1_amd64.deb \
 https://launchpad.net/ubuntu/+source/pdftk/2.02-4build1/+build/10581759/+files/pdftk-dbg_2.02-4build1_amd64.deb


echo -e "Packages for pdftk downloaded\n\n"
# install packages 
echo -e "\n\n Installing pdftk: \n\n"
sudo apt-get install ./libgcj17_6.4.0-8ubuntu1_amd64.deb \
    ./libgcj-common_6.4-3ubuntu1_all.deb \
    ./pdftk_2.02-4build1_amd64.deb \
    ./pdftk-dbg_2.02-4build1_amd64.deb
echo -e "\n\n pdftk installed\n"
echo -e "   try it in shell with: > pdftk \n"
# delete deb files in /tmp directory
rm ./libgcj17_6.4.0-8ubuntu1_amd64.deb
rm ./libgcj-common_6.4-3ubuntu1_all.deb
rm ./pdftk_2.02-4build1_amd64.deb
rm ./pdftk-dbg_2.02-4build1_amd64.deb

这个脚本将下载软件包到/tmp目录,并使用apt install命令从该目录安装!之后,将删除/tmp目录中的软件包。
要运行此脚本,请将其复制到编辑器中并保存为pdftk_installer。然后在终端中运行它。
chmod 755 pdftk_installer
./pdftk_installer

在Ubuntu 20.04 amd64上安装pdftk

由于Ubuntu 20.04缺少gcc-6库,上述脚本将失败。然而,那些想避免使用snap或docker解决方案的人可以使用schroot。我知道这会导致一定的负担 - 大约需要500MB;但您可以使用此环境在Xenial(Ubuntu 16.04)环境中安装其他老旧的程序、库、编译器等。

首先安装schroot软件包

 sudo apt install schroot debootstrap

最后一个包需要安装一个类似于Debian的系统。 现在将一个`xenial.conf`文件写入`/etc/schroot/schroot.d`目录中:
cat <<EOF | sudo tee /etc/schroot/chroot.d/xenial.conf
> [xenial]
> description=Ubuntu 16.04
> directory=/srv/chroot/xenial
> root-users=$USER
> type=directory
> users=$USER
> EOF

验证新的配置文件是否已经写入。
cat /etc/schroot/chroot.d/xenial.conf

接下来创建xenial目录(如果您选择其他目录,请修改上面的配置文件):
 sudo mkdir -p /srv/chroot/xenial

现在节目开始了,安装时去喝杯咖啡吧。
sudo debootstrap xenial /srv/chroot/xenial 

现在可以在/srv/chroot/xenial上使用xenial文件系统了。
现在是时候包含必要的xenial apt仓库了。要做到这一点,请输入:
cat <<EOF | sudo tee /srv/chroot/xenial/etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu xenial main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
EOF

请再次检查文件 /srv/chroot/xenial/etc/apt/sources.list 是否存在。
cat /srv/chroot/xenial/etc/apt/sources.list

是时候进入友好的schroot环境了(注意:无需root权限!)并更新apt。
schroot -c xenial -u root apt-get update

最后,您准备安装 pdftk 包

schroot -c xenial -u root apt-get install pdftk

您可以通过调用schroot使用pdftk来使用它。
schroot -c xenial -- pdftk <your arguments>

例如,要显示帮助菜单,请键入

schroot -c xenial -- pdftk --help

最后,我建议在您的.bashrc文件中为pdftk创建一个别名:
首先复制您的.bashrc文件。
cp ~/.bashrc ~/.bashrc_backup

然后添加一个别名
echo alias pdftk='schroot -c xenial -- pdftk' >> ~/.bashrc

现在你可以像往常一样在bash中使用pdf。要进行测试,打开一个新的终端并输入。
 pdftk --version

如果你需要安装其他旧版本的程序,就像我所做的那样,请使用与上述描述类似的apt命令。
请注意,除了apt-get和xenial.config之外的所有命令都是以用户权限执行的。

看起来 pdftk-dbg_2.02-4build1_amd64.deb 是可选的。 - Jossef Harush Kadouri
3这比PPA中的快照版本或基于Java的版本更可取 - 谢谢! - simon
为了提供一些解释,这似乎是下载Ubuntu-artful(17.10)软件包。 - Randall Whitman
4所有的链接都已损坏。 - Developer
1链接已更新! - abu_bua
很好的解决方案。PPA并不总是有效,而Snap则过于限制性。 - AVK
太棒了!谢谢。 - senty
@senty:我认为最好的解决方案,也许在将来的发行版中也适用,是使用Snap的pdftk,甚至是Dock容器的解决方案。 - abu_bua
snap pdftk 对我没用;而且移除它会弄乱符号链接。 - senty
脚本在两个不同的场合完美地安装了pdftk,这绝对是最好的答案。 - Rayner
1对我来说,唯一有效的解决方案。Snap安装正常,但存在一些问题。真的越来越讨厌Snap了。 - Gino

这适用于Ubuntu 18.04:
sudo add-apt-repository ppa:malteworld/ppa
sudo apt update
sudo apt install pdftk

是的,它确实可以解决Inkscape上使用olibia/inkscape-multipage-export(https://github.com/olibia/inkscape-multipage-export)时遇到的问题。 - Geppettvs D'Constanzo
这在我18.04版本上运行良好。 - Divyesh Prajapati
11截至2020年5月1日,对我来说没有起作用。 PPA的维护者表示它将会消失,也许这个时候已经到来。 - Noah Duncan
故障了。看起来这个PPA不再活跃了。:-( - loved.by.Jesus
这对我在WSL上起作用了。 - Max Carroll
2023年3月在WSL上出现“包'pdftk'没有安装候选项”的错误。 - Asu

你可以尝试使用已安装pdftk的Ubuntu 16.04的docker镜像来运行pdftk。
安装docker: sudo apt install docker.io
拉取Ubuntu 16.04并运行bash shell: sudo docker run -it ubuntu:16.04 bash
从容器提示符更新并安装pdftk: apt update apt install pdftk
在新的终端运行: sudo docker ps -a
使用ubuntu:16.04的CONTAINER ID将镜像提交到已安装pdftk的新镜像中: sudo docker commit CONTAINER_ID ubuntu_pdftk (将CONTAINER_ID替换为您的容器ID。)
在/usr/bin中创建一个名为pdftk的文件,然后使用chmod +x /usr/bin/pdftk使其可执行: #!/bin/sh set -eu docker run --name pdftk -it -v "$PWD:/workdir$PWD" -w "/workdir$PWD" ubuntu_pdftk pdftk "$@" docker rm pdftk

几乎完全是我所做的。只是,你在 -v "$PWD:/workdir$PWD" -w "/workdir$PWD" 中有一个错误吧? - Ondra Žižka

安装pdftk的snap软件包。
运行: ``` sudo snap install pdftk ```
要从根目录或节点运行您的软件包,请按照以下步骤操作。 一旦您从snap安装了Pdftk,您需要将路径`/snap/pdftk/current/usr/..`更改为Ubuntu的`/usr`,以便替换运行以下命令。 ``` sudo ln -s /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftk ``` 或者如果要覆盖,请运行以下命令。 ``` sudo ln -fs /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftk ```
使用以下命令进行测试:`pdftk input.pdf cat output new.pdf`。

收到了对“Test with”这行的点赞。这就是我想要的功能,也可能是我会用这个东西的唯一目的。 - Nathan Chappell

我能够从artful(17.10)deb软件包安装pdftk。按顺序下载并安装:

最好先安装gcc-6-base,以避免命令行安装时出现依赖错误。

就这样……暂时应该可以了。


要在特定的18.04版本上安装pdftk,我发现以下方法有效:

  1. 获取pdftk-java的18.10版本deb包
  2. 从正常的18.04软件源中安装依赖项
  3. 使用从18.10下载的pdftk-java软件包进行dpkg安装

例如:

$ wget wget http://launchpadlibrarian.net/383018194/pdftk-java_0.0.0+20180723.1-1_all.deb
$ sudo apt install default-jre-headless libcommons-lang3-java libbcprov-java
$ sudo dpkg -i pdftk-java_0.0.0+20180723.1-1_all.deb

我喜欢Ademir's的Docker答案,但它有典型的安全和权限问题,因为Docker必须以root身份运行。如果这让你感到困扰,可以尝试使用Singularity。你需要以root身份构建镜像,但任何用户都可以运行它。
这是我使用的Singularity文件:
# Generate the Singularity container to run pdftk from Ubuntu 16.04.
Bootstrap: docker
From: ubuntu:16.04

%help
    pdftk was removed from Ubuntu 18.04, so this container packages up the old
    version.

%post
    apt-get update -qq
    apt-get install -qq pdftk

%runscript
    pdftk "$@"

然后我建立了这个图像。
sudo singularity build pdftk.simg Singularity

一旦这个工作了,我将它安装到了一个路径下的文件夹中,同时还有一个包装脚本,将主目录设置为当前目录。
sudo mv pdftk.simg /usr/bin/
echo 'singularity run --home $PWD /usr/bin/pdftk.simg "$@"' > pdftk
sudo chown root:root pdftk
sudo chmod +x pdftk
sudo mv pdftk /usr/bin

现在我可以运行 pdftk
$ pdftk --version

pdftk 2.02 a Handy Tool for Manipulating PDF Documents
Copyright (c) 2003-13 Steward and Lee, LLC - Please Visit: www.pdftk.com
This is free software; see the source code for copying conditions. There is
NO warranty, not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

唯一的缺点是它是一个相当大的可执行文件,因为它包含了完整的Ubuntu 16.04发行版。如果你试图操作不在当前目录中的PDF文件,可能也会遇到麻烦。
$ ls -lh /usr/bin/pdftk*
-rwxr-xr-x 1 root root  53 Jul 23 12:32 /usr/bin/pdftk
-rwxr-xr-x 1 root root 88M Jul 23 12:06 /usr/bin/pdftk.simg

我制作了一个快速而简单的临时解决方法,以在Bionic下运行PDFTK。
lsb_release -a && pdftk --version
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04 LTS
Release:        18.04
Codename:       bionic

pdftk 2.02 a Handy Tool for Manipulating PDF Documents
Copyright (c) 2003-13 Steward and Lee, LLC - Please Visit: www.pdftk.com

我更新了我的sources.list文件,并包含了以下几行内容:
deb http://no.archive.ubuntu.com/ubuntu/ artful main restricted
deb http://no.archive.ubuntu.com/ubuntu/ artful-updates main restricted
deb http://no.archive.ubuntu.com/ubuntu/ artful universe
deb http://no.archive.ubuntu.com/ubuntu/ artful-updates universe
deb http://no.archive.ubuntu.com/ubuntu/ artful multiverse
deb http://no.archive.ubuntu.com/ubuntu/ artful-updates multiverse
deb http://no.archive.ubuntu.com/ubuntu/ artful-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu artful-security main restricted
deb http://security.ubuntu.com/ubuntu artful-security universe
deb http://security.ubuntu.com/ubuntu artful-security multiverse

之后,我运行了一个简单的程序。
sudo apt update

使更改生效。

然后通过安装pdftk来完成。

sudo apt install pdftk

然后再次从source.list中删除Artful源,这就是我在Bionic下运行PDFTK的方法。
来源:https://christiandietze.de/pdftk-with-ubuntu-bionic-18-04/

5嗨Christian,你介意更新一下你的回答,包括你的解决方法吗?我们更希望你在这里包含回答的关键部分,然后提供链接作为参考。谢谢! - CalvT
1是的,尤其是因为你提供的链接似乎无法访问。 - terdon
嗨CalvT,我使用的解决方法很简单,只需将artfull软件包添加到apt中,安装pdftk并将它们删除。而且,terdon,我的网站在过去30天内没有出现故障,所以我不知道为什么你无法访问该网站。 - WiKrIe
@WiKrIe 你的网站有问题。我可以访问基本的URL,但是无法访问你提供的链接页面。Wayback Machine也无法访问。Google缓存无法加载该页面,但是可以加载源代码。这个页面肯定有问题。所以terdon♦认为你的网站挂了。在我检查之前,我也是这么认为的。希望这能帮到你。 - Dɑvïd
@David,我现在检查了一下我的网站,对我来说所有页面都是在线的,但我注意到可能有一个来自你的IP范围的阻止,因为我使用fail2ban来阻止恶意IP地址。如果你能告诉我你的IP地址,我可以检查是否能在任何监狱中找到它,并查明为什么它被关在那个监狱里。这可能是我方唯一的解释。 - WiKrIe
1建议混合存储库,这些存储库用于不同版本的Ubuntu且没有适当的优先级规则,是不可取的。 - David Foerster