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

WiK*_*rIe 151 pdf software-installation pdftk 18.04

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

或者,有人知道pdftk在 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
Run Code Online (Sandbox Code Playgroud)

但是没有找到工作工具。

Dav*_*ter 113

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

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

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

从 PPA 安装(过时)

我构建了一个具有合适依赖项的 Deb 包(仅适用于 Bionic):

sudo add-apt-repository ppa:malteworld/ppa
sudo apt update
sudo apt install pdftk
Run Code Online (Sandbox Code Playgroud)

该包包含一个放置在 中的包装脚本/usr/bin,因此您可以像往常一样调用它:

pdftk <arguments> ...
Run Code Online (Sandbox Code Playgroud)

从源安装

  1. 安装构建工具和依赖项:

    sudo apt install git default-jdk-headless ant \
        libcommons-lang3-java libbcprov-java
    
    Run Code Online (Sandbox Code Playgroud)

    当然,您可以使用与default-jdk-headless.

  2. 下载Marc Vinyal 的 pdftk fork

    git clone https://gitlab.com/pdftk-java/pdftk.git
    cd pdftk
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将所需库的符号链接放入lib文件夹中:

    mkdir lib
    ln -st lib /usr/share/java/{commons-lang3,bcprov}.jar
    
    Run Code Online (Sandbox Code Playgroud)
  4. 构建 JAR 包:

    ant jar
    
    Run Code Online (Sandbox Code Playgroud)
  5. 运行 JAR 包:

    java -jar build/jar/pdftk.jar --help
    
    Run Code Online (Sandbox Code Playgroud)
  6. (可选)要运行 JAR 包,例如,当您将其分发到其他系统时,您至少需要一个工作(无头)JRE,例如来自该default-jre-headless包的JRE以及 Java 库libcommons-lang3-javalibbcprov-java

    sudo apt install default-jre-headless libcommons-lang3-java libbcprov-java
    
    Run Code Online (Sandbox Code Playgroud)

    同样,您可以使用与default-jre-headless. 这个 pdftk fork 还支持旧 JRE 版本的构建(根据文档?7)。

  7. (可选)您可以通过update-binfmts(8). 大多数在 Deb 包中提供的 JRE,包括那些在 Canonical 包存储库中的,在安装过程中都会处理这个问题,尽管它在某些 OpenJDK 包中似乎有问题。

PS:我在 Ubuntu Trusty 中使用 non-headless OpenJDK 9 尝试过这个,但我看不出为什么它不能与 Bionic 中的 headless OpenJDK 10 一起使用。

取决于应用

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

  • PDF Chain是一个 C++ 应用程序,不受 GCJ 弃用的直接影响。它需要一个有效的pdftk可执行文件,但并不关心它在幕后是如何工作的。无论如何,PDF Chain已从 Bionic 和pdftk 中删除。

  • 此答案中的两组说明都安装了 Marc Vinyal 的 `pdftk-java` fork。这将(很可能)成为 Debian([参见](https://bugs.debian.org/892539))和 Ubuntu(带有 [可用软件包](https://launchpad)中`pdftk` 的官方替代品.net/ubuntu/+source/pdftk-java) 用于 18.10)。所以这似乎是**最佳答案**,因为它是“面向未来的证明”:从 18.10 开始,您将获得官方存储库中提供的相同软件。 (6认同)

小智 101

对于 Ubuntu 18.04,只需安装 pdftk snap 包:

sudo snap install pdftk
Run Code Online (Sandbox Code Playgroud)

  • 这似乎安装得很好,但随后 pdftk 无法打开或处理任何文件(总是说“错误:无法找到文件。错误:无法打开 PDF 文件:”),也没有手册页。最后,我用 snap remove 删除了它,并使用了上面的 @abu_bua 解决方案,效果很好。 (7认同)
  • 我更新了上面的答案,只使用“pdftk”而不是“pdftk”,因为我(smoser)已将一个名为“pdftk”的快照上传到商店,内容相同。(https://snapcraft.io/pdftk) (3认同)
  • 由于快照的设计要点,快照无法访问所有文件。有关这方面的一些信息可在 https://github.com/smoser/pdftk/issues/1 获得。最简单的解决方案是将文件放在您的主目录中。 (2认同)

abu*_*bua 64

在 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
Run Code Online (Sandbox Code Playgroud)

该脚本将/tmp使用apt install命令将软件包下载到那里并从那里安装!之后/tmp目录中的包将被删除。

要运行此脚本,请将其复制到编辑器中并保存,例如pdftk_installer。然后在终端中运行它

chmod 755 pdftk_installer
./pdftk_installer
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 20.04 amd64 上安装 pdftk

由于 Ubuntu 20.04 上缺少 gcc-6 库,上述脚本将失败。但是,那些想要避免使用 snap 或 docker 解决方案的人可以使用schroot。我知道这是一个相当大的过载——它需要大约 500MB;但是您可以使用此环境在 Xenial (Ubuntu 16.04) 环境中安装更多旧程序、库、编译器等。

首先安装schroot

 sudo apt install schroot debootstrap
Run Code Online (Sandbox Code Playgroud)

安装类似 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
Run Code Online (Sandbox Code Playgroud)

验证是否写入了新的 conf 文件

cat /etc/schroot/chroot.d/xenial.conf
Run Code Online (Sandbox Code Playgroud)

接下来创建 xenial 目录(如果您选择另一个目录,请更改上面的 conf 文件):

 sudo mkdir -p /srv/chroot/xenial
Run Code Online (Sandbox Code Playgroud)

现在节目开始,一边安装一边喝咖啡:

sudo debootstrap xenial /srv/chroot/xenial 
Run Code Online (Sandbox Code Playgroud)

xenial 文件系统现在可以在/srv/chroot/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
Run Code Online (Sandbox Code Playgroud)

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

cat /srv/chroot/xenial/etc/apt/sources.list
Run Code Online (Sandbox Code Playgroud)

是时候进入 xenial schroot(注意:不需要 root 权限!)并更新 apt

schroot -c xenial -u root apt-get update
Run Code Online (Sandbox Code Playgroud)

最后,您已准备好安装pdftk package

schroot -c xenial -u root apt-get install pdftk
Run Code Online (Sandbox Code Playgroud)

您可以pdftk通过 schroot 调用它来使用它:

schroot -c xenial -- pdftk <your arguments>
Run Code Online (Sandbox Code Playgroud)

例如显示帮助菜单类型

schroot -c xenial -- pdftk --help
Run Code Online (Sandbox Code Playgroud)

最后,我建议在您的.bashrc文件中为 pdftk 创建一个别名:

首先复制你的 .bashrc

cp ~/.bashrc ~/.bashrc_backup
Run Code Online (Sandbox Code Playgroud)

然后添加别名

echo alias pdftk='schroot -c xenial -- pdftk' >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

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

 pdftk --version
Run Code Online (Sandbox Code Playgroud)

如果您必须像我一样安装其他较旧的程序,请使用与上述类似的 apt 命令。

请注意,除了apt-get和之外的所有命令xenial.config都是以用户权限执行的。

  • 这比来自 PPA 的 snap 版本或基于 Java 的版本更可取——谢谢! (3认同)
  • 所有链接都坏了 (3认同)

小智 14

这适用于 ubuntu 18.04:

sudo add-apt-repository ppa:malteworld/ppa
sudo apt update
sudo apt install pdftk
Run Code Online (Sandbox Code Playgroud)

  • 截至 2020 年 5 月 1 日对我不起作用。PPA 维护者表示它会消失,也许那个时候已经到了。 (9认同)

小智 13

您可以尝试使用安装了 pdftk 的 Ubuntu 16.04 docker 映像来运行 pdftk:

  1. 安装码头工人:

    sudo apt install docker.io
    
    Run Code Online (Sandbox Code Playgroud)
  2. 拉取 Ubuntu 16.04 并运行 bash shell:

    sudo docker run -it ubuntu:16.04 bash
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从容器提示更新并安装 pdftk:

    apt update
    apt install pdftk
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在新的终端上运行:

    sudo docker ps -a
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用 ubuntu:16.04 的 CONTAINER ID 将图像提交到安装了 pdftk 的新图像:

    sudo docker commit CONTAINER_ID ubuntu_pdftk
    
    Run Code Online (Sandbox Code Playgroud)

    (替换CONTAINER_ID为您的容器 ID。)

  6. 创建一个名为pdftkin的文件/usr/bin,然后使用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
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

我能够从 artful (17.10) deb 包安装 pdftk。下载然后安装,按顺序:

gcc-6-base如果从 cli安装,最好先安装以避免出现依赖项错误。

这应该可以解决问题……现在。


小智 5

安装 pdftk snap 包。

  1. 跑:

     sudo snap install pdftk
    
    Run Code Online (Sandbox Code Playgroud)
  2. 执行以下操作从 root 运行你的包,或者你想从 node 运行,等等。

    从 snap 安装 Pdftk 后,您需要/snap/pdftk/current/usr/..将 Ubuntu的路径更改/usr为替换运行以下命令。

     sudo ln -s /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftk
    
    Run Code Online (Sandbox Code Playgroud)

    或覆盖运行以下命令。

     sudo ln -fs /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftk
    
    Run Code Online (Sandbox Code Playgroud)
  3. 测试 pdftk input.pdf cat output new.pdf