Velvet Star Monitor

Standout celebrity highlights with iconic style.

general

How can I install pdftk in Ubuntu 18.04 and later?

Writer Matthew Martinez

Is there any chance of getting pdftk working in Ubuntu 18.04? I need this for creating PDF files with a watermark in shell.

Or, does anybody know a working alternative to pdftk to generate a PDF with a watermark in shell?

I already check/try out all of them:

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

But did not find a working tool.

10

15 Answers

The pdftk package in Ubuntu (and its upstream Debian package) was dropped due to its dependency on the now deprecated GCJ runtime. I found a fork that depends on OpenJDK or similar instead.

Install from a future Ubuntu release (recommended)

Starting with Cosmic (Ubuntu 18.10), Ubuntu ships pdftk-java from the same source code as below as a replacement. Attempting to install pdftk will install this package instead. Users of earlier releases can download it manually from the package repository and install it with their favourite package manager.

Install from PPA (outdated)

I built a Deb package (for Bionic only) with suitable dependencies:

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

The package contains a wrapper script placed in /usr/bin, so you can invoke it as normally:

pdftk <arguments> ...

Install from source

  1. Install the build tools and dependencies:

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

    Of course you can use a different supported JDK than the one supplied by default-jdk-headless.

  2. Download Marc Vinyal’s pdftk fork:

    git clone
    cd pdftk
  3. Place symbolic links to the required libraries into the lib folder:

    mkdir lib
    ln -st lib /usr/share/java/{commons-lang3,bcprov}.jar
  4. Build the JAR package:

    ant jar
  5. Run the JAR package:

    java -jar build/jar/pdftk.jar --help
  6. (Optional) To run the JAR package, e. g. when you distribute it to other systems, you need at least a working (headless) JRE like from the default-jre-headless package as well as the Java libraries libcommons-lang3-java and libbcprov-java:

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

    Again you can use a different JRE than default-jre-headless. This pdftk fork also supports builds for older JRE versions (≥ 7 according to the documentation).

  7. (Optional) You can teach Linux to execute JAR (Java Archive) files via update-binfmts(8). Most JREs shipped in Deb packages, including those in Canonical’s package repositories, take care of that during installation, though it appears to be buggy in some OpenJDK packages.

P.S.: I tried this with the non-headless OpenJDK 9 in Ubuntu Trusty but I see little reasons why it shouldn't work with headless OpenJDK 10 in Bionic.

Depending applications

A commenter raised the valid question whether the depending PDF Chain applications is affected by this change:

  • No, PDF Chain is a C++ application and not directly affected by the deprecation of GCJ. It needs a working pdftk executable but doesn’t care how it works under the hood. In any case, PDF Chain was dropped from Bionic as well as pdftk.
6

For Ubuntu 18.04, just install the pdftk snap package:

sudo snap install pdftk
12

Installing pdftk on Ubuntu 18.04 amd64

I've written a small bash script which automatise the installation on Ubuntu 18.04. Note that I've downloaded only amd64 packages!

#!/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 \ \ \
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

This script will download the packages to /tmp and install from there using an apt installcommand! Afterwards the packages in the /tmp directory will be removed.

To run this script, copy it in an editor and save it e.g. pdftk_installer. Then run it in a terminal with

chmod 755 pdftk_installer
./pdftk_installer

Installing pdftk on Ubuntu 20.04 amd64

The script above will fail due to missing gcc-6 libraries on Ubuntu 20.04. However, those who would like to avoid the snap or docker solution may use schroot. I know that this is a pretty overload - it takes about 500MB; but you can use this environment to install further elderly programs, libs, compilers, etc. in the Xenial (Ubuntu 16.04) environment.

First install the schroot package

 sudo apt install schroot debootstrap

The last package is required to install a debian-like-system. Now write a xenial.conf file into the /etc/schroot/schroot.d directory:

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

Verify that the new conf-file is written

cat /etc/schroot/chroot.d/xenial.conf

Next create the xenial directory (if you choose another directory alter the conf file above):

 sudo mkdir -p /srv/chroot/xenial

Now the show begins, while installing go for a coffee:

sudo debootstrap xenial /srv/chroot/xenial 

The xenial file system is now available on /srv/chroot/xenial.

Now it's time to include the necessary xenial apt repositories. To do so type

cat <<EOF | sudo tee /srv/chroot/xenial/etc/apt/sources.list
deb xenial main restricted universe multiverse
deb xenial-security main restricted universe multiverse
EOF

Again check that the file /srv/chroot/xenial/etc/apt/sources.list exists

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

It's time to enter the xenial schroot (note: no root privileges needed!) and update the apt

schroot -c xenial -u root apt-get update

Finally you are ready to install the pdftk package:

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

You can use pdftk by invoking it via the schroot:

schroot -c xenial -- pdftk <your arguments>

E.g. to show the help menu type

schroot -c xenial -- pdftk --help

Last of all I suggest to make an alias for pdftk in your .bashrc file:

First make a copy of your .bashrc

cp ~/.bashrc ~/.bashrc_backup

and then add an alias

echo alias pdftk='schroot -c xenial -- pdftk' >> ~/.bashrc

Now you can use pdf as usual in your bash. To test open a new terminal and type

 pdftk --version

If you have to install other older programs as I had to do, use the apt commands similar as described above.

Note that all commands beside the apt-get and the xenial.config are executed with user privileges.

11

This works for ubuntu 18.04:

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

You can try use a docker image of Ubuntu 16.04 with pdftk installed to run pdftk:

  1. Install docker:

    sudo apt install docker.io
  2. Pull Ubuntu 16.04 and run a bash shell:

    sudo docker run -it ubuntu:16.04 bash
  3. Update and install pdftk from container prompt:

    apt update
    apt install pdftk
  4. On a new terminal run:

    sudo docker ps -a
  5. Commit the image using the CONTAINER ID of ubuntu:16.04 to a new image with pdftk installed:

    sudo docker commit CONTAINER_ID ubuntu_pdftk

    (Replace CONTAINER_ID with your container ID.)

  6. Create a file named pdftk in /usr/bin and then make it executable using 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
1

Install the pdftk snap package.

  1. Run:

     sudo snap install pdftk
  2. Do as follows to run your package from root or you want to run from node, etc.

    Once you install Pdftk from snap you need to change the path /snap/pdftk/current/usr/.. to Ubuntu to /usr for replace run the following command.

     sudo ln -s /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftk

    or for overwrite run the following command.

     sudo ln -fs /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftk
  3. Test with pdftk input.pdf cat output new.pdf

1

I was able to install pdftk from artful (17.10) deb packages. Download and then install, in that order :

It's best to install gcc-6-base first to avoid dependencies error if you do it from cli.

That should do the trick… for now.

I made a quick and dirty workaround to get PDFTK running under Bionic.

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: 

I update my sources.list and include the following lines:

deb artful main restricted
deb artful-updates main restricted
deb artful universe
deb artful-updates universe
deb artful multiverse
deb artful-updates multiverse
deb artful-backports main restricted universe multiverse
deb artful-security main restricted
deb artful-security universe
deb artful-security multiverse

After that I run a simple

sudo apt update

to make the changes take effect.

Then install pdftk via

sudo apt install pdftk

Then remove the Artful sources from the source.list again and this is how I get PDFTK running under Bionic.

Source:

6

I like Ademir's docker answer, but it has the typical problems with security and permissions, because docker has to run as root. If that bothers you, try using Singularity. You need to build the image as root, but any user can then run it.

Here's the Singularity file I used:

# 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 "$@"

Then I built the image.

sudo singularity build pdftk.simg Singularity

Once that worked, I installed it to a folder on the path, along with a wrapper script that sets the home folder to the current directory.

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

And now I can run pdftk.

$ pdftk --version
pdftk 2.02 a Handy Tool for Manipulating PDF Documents
Copyright (c) 2003-13 Steward and Lee, LLC - Please Visit:
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.

The only down side is that it's a rather large executable, because it contains a complete Ubuntu 16.04 distribution. You might also have trouble if you're trying to manipulate PDF files that aren't in the current directory.

$ 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

For getting pdftk onto 18.04 specifically, I've found that this works:

  1. get 18.10 version of the deb for pdftk-java
  2. install dependencies from normal 18.04 repos
  3. dpkg install pdftk-java package downloaded from 18.10

IE:

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

You can run pdftk on Ubuntu 18.04 with docker. That's an enhanced variant of Ademir's answer.

Assuming we only need a cli component of the pdftk and there's docker installed on the machine. Just put the following script somewhere on the $PATH with the name pdftk and executable bit set:

#!/bin/bash
# Build or use cached image and tag with "local/local/ubuntu_pdftk", suppress
# output to maintain compatibility in case you are parsing the pdftk output.
# It will build the image if it's absent or use the cached one.
echo "FROM ubuntu:16.04
RUN apt-get update && \ apt-get install -y pdftk && \ rm -rf /var/lib/apt/lists/*" | docker build -t local/local/ubuntu_pdftk - 2>&1 > /dev/null
# Run the pdftk as current user
set -eu
docker run --name pdftk -it --user $(id -u):$(id -g) --rm -v "$PWD:/workdir$PWD" -w "/workdir$PWD" local/local/ubuntu_pdftk pdftk "$@"

First run will take like 2 minutes to build the image, if the built image will remain on the machine next runs will be faster. You can freely clean up the image, it will be built when you'll need it next time.

The download links in the script posted by @abu_bua seem to not be working anymore (probably because of end of support for 17.10?), so here is a modified version of the same script that uses the corresponding packages from the 16.04 build. Tried and tested on a machine running 18.04.

#!/bin/bash
#
# author: abu
# date: May 12 2018
# description: bash script to install pdftk on Ubuntu 18.04 for amd64 machines
##############################################################################
#
# change to /tmp directory
cd /tmp
# download packages
wget \ \ \
echo -e "Packages for pdftk downloaded\n\n"
# install packages
echo -e "\n\n Installing pdftk: \n\n"
sudo apt-get install ./libgcj16_5.4.0-6ubuntu1~16.04.10_amd64.deb \ ./libgcj-common_4.9.3-9ubuntu1_all.deb \ ./pdftk_2.02-4_amd64.deb \ ./pdftk-dbg_2.02-4_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 ./libgcj16_5.4.0-6ubuntu1~16.04.10_amd64.deb
rm ./libgcj-common_4.9.3-9ubuntu1_all.deb
rm ./pdftk_2.02-4_amd64.deb
rm ./pdftk-dbg_2.02-4_amd64.deb

What a great opportunity to use some docker magic!

What I did was to use a docker container running ubuntu 16.04, install pdftk inside it and run it there.

Here are the exact steps if you want to do the same thing:

  1. Install docker if you don't already have it ()
  2. Create a directory somewhere called pdftk
  3. Create a directory called docker inside the pdftk directory
  4. Copy this Dockerfile into the pdftk/docker directory:
  5. Copy this script also into the pdftk/docker directory:
  6. Make sure the dockershell script is executable
  7. Into the pdftk directory, copy all the pdf files you want to work with
  8. cd /path/to/pdftk
  9. Run the dockershell script with the path of the Dockerfile: docker/dockershell docker/Dockerfile (this will take some time the very first time you run it)

Now you should have a prompt inside the docker container, from where you can run pdftk. When you're done, type exit to exit the container and return to the host machine. Any newly generated files will be present in the pdftk directory (but they'll be owned by root, so you may need to change ownership as necessary).

On my 18.04 running in WSL I did the following

Get the dependencies from the (.deb files):

  • libgcj-common (download: )
  • libgcj17 (download: )

wget

wget

sudo apt install gcc-6-base

then install the above dependencies

sudo dpkg -i libgcj*

then I took the .deb from

wget
sudo dpkg -i pdftk_2.02-4+b2_amd64.deb
2

Running sudo snap install pdftk on Digital Oceans Droplet Ubuntu 18.04 worked fine for me. PDFTK seems to be added to the system path as well as I can access it from the command line, such as pdftk --help works.

My dev platform is Windows. On my Linux server, what do I substitute for the following line?

$pathToPdfTKBinary = "C:\\Program Files (x86)\\PDFtk Server\\bin\\pdftk.exe";

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy