在 Ubuntu 18.04 amd64 上安装 pdftk

在 Ubuntu 18.04 amd64 上安装 pdftk

有没有可能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

但没有找到可行的工具。

答案1

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

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

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

从 PPA 安装(已过时)

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

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

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

pdftk <arguments> ...

从源代码安装

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

    sudo apt install git default-jdk-headless ant \
        libcommons-lang3-java libbcprov-java
    

    当然,您可以使用与 提供的 JDK 不同的受支持的 JDK default-jdk-headless

  2. 下载Marc Vinyal 的 pdftk fork

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

    mkdir lib
    ln -st lib /usr/share/java/{commons-lang3,bcprov}.jar
    
  4. 构建JAR包:

    ant jar
    
  5. 运行JAR包:

    java -jar build/jar/pdftk.jar --help
    
  6. (可选)要运行 JAR 包,例如当您将其分发到其他系统时,您至少需要一个可以正常工作的(无头)JRE(类似于包中的)default-jre-headless以及 Java 库libcommons-lang3-javalibbcprov-java

    sudo apt install default-jre-headless libcommons-lang3-java libbcprov-java
    

    再次强调,您可以使用与 不同的 JRE default-jre-headless。此 pdftk fork 还支持旧 JRE 版本(根据文档,≥ 7)的构建。

  7. (可选)您可以通过以下方式教 Linux 执行 JAR(Java 存档)文件update-binfmts(8). Deb 包中附带的大多数 JRE(包括 Canonical 包存储库中的 JRE)在安装过程中都会处理这个问题,尽管在某些 OpenJDK 包中它似乎存在缺陷。

附言:我尝试在 Ubuntu Trusty 中使用非无头 OpenJDK 9,但我不明白为什么它不能与 Bionic 中的无头 OpenJDK 10 一起使用。

取决于应用程序

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

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

答案2

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

sudo snap install pdftk

答案3

在 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_安装程序.然后在终端中运行

chmod 755 pdftk_installer
./pdftk_installer

在 Ubuntu 20.04 amd64 上安装 pdftk

由于 Ubuntu 20.04 上缺少 gcc-6 库,上述脚本将失败。但是,那些想避免使用 snap 或 docker 解决方案的人可以使用施鲁特。我知道这是一个相当大的负担——它占用了大约 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 目录(如果选择其他目录,请更改上面的 conf 文件):

 sudo mkdir -p /srv/chroot/xenial

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

sudo debootstrap xenial /srv/chroot/xenial 

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

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

cat /srv/chroot/xenial/etc/apt/sources.list

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

schroot -c xenial -u root apt-get update

最后,您可以安装pdftk package

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

您可以pdftk通过 schroot 调用它:

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

现在,您可以pdf在 bash 中照常使用。要测试,请打开一个新终端并输入

 pdftk --version

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

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

答案4

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

  1. 安装docker:

    sudo apt install docker.io
    
  2. 拉取 Ubuntu 16.04 并运行 bash shell:

    sudo docker run -it ubuntu:16.04 bash
    
  3. 从容器提示更新并安装 pdftk:

    apt update
    apt install pdftk
    
  4. 在新的终端运行:

    sudo docker ps -a
    
  5. 使用 ubuntu:16.04 的容器 ID 将图像提交到安装了 pdftk 的新图像:

    sudo docker commit CONTAINER_ID ubuntu_pdftk
    

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

  6. pdftk创建一个名为的文件/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
    

相关内容