How can I install pdftk in Ubuntu 18.04 and later?
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 amd64But did not find a working tool.
1015 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 pdftkThe package contains a wrapper script placed in /usr/bin, so you can invoke it as normally:
pdftk <arguments> ...Install from source
Install the build tools and dependencies:
sudo apt install git default-jdk-headless ant \ libcommons-lang3-java libbcprov-javaOf course you can use a different supported JDK than the one supplied by
default-jdk-headless.Download Marc Vinyal’s pdftk fork:
git clone cd pdftkPlace symbolic links to the required libraries into the
libfolder:mkdir lib ln -st lib /usr/share/java/{commons-lang3,bcprov}.jarBuild the JAR package:
ant jarRun the JAR package:
java -jar build/jar/pdftk.jar --help(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-headlesspackage as well as the Java librarieslibcommons-lang3-javaandlibbcprov-java:sudo apt install default-jre-headless libcommons-lang3-java libbcprov-javaAgain 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).(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.
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.debThis 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_installerInstalling 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 debootstrapThe 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
> EOFVerify that the new conf-file is written
cat /etc/schroot/chroot.d/xenial.confNext create the xenial directory (if you choose another directory alter the conf file above):
sudo mkdir -p /srv/chroot/xenialNow 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
EOFAgain check that the file /srv/chroot/xenial/etc/apt/sources.list exists
cat /srv/chroot/xenial/etc/apt/sources.listIt's time to enter the xenial schroot (note: no root privileges needed!) and update the apt
schroot -c xenial -u root apt-get updateFinally you are ready to install the pdftk package:
schroot -c xenial -u root apt-get install pdftkYou 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 --helpLast of all I suggest to make an alias for pdftk in your .bashrc file:
First make a copy of your .bashrc
cp ~/.bashrc ~/.bashrc_backupand then add an alias
echo alias pdftk='schroot -c xenial -- pdftk' >> ~/.bashrcNow you can use pdf as usual in your bash. To test open a new terminal and type
pdftk --versionIf 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.
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:
Install docker:
sudo apt install docker.ioPull Ubuntu 16.04 and run a bash shell:
sudo docker run -it ubuntu:16.04 bashUpdate and install pdftk from container prompt:
apt update apt install pdftkOn a new terminal run:
sudo docker ps -aCommit 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_IDwith your container ID.)Create a file named
pdftkin/usr/binand then make it executable usingchmod +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
Install the pdftk snap package.
Run:
sudo snap install pdftkDo 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/usrfor replace run the following command.sudo ln -s /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftkor for overwrite run the following command.
sudo ln -fs /snap/pdftk/current/usr/bin/pdftk /usr/bin/pdftkTest with
pdftk input.pdf cat output new.pdf
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 multiverseAfter that I run a simple
sudo apt updateto make the changes take effect.
Then install pdftk via
sudo apt install pdftkThen remove the Artful sources from the source.list again and this is how I get PDFTK running under Bionic.
Source:
6I 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 SingularityOnce 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/binAnd 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:
- get 18.10 version of the deb for
pdftk-java - install dependencies from normal 18.04 repos
- 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:
- Install docker if you don't already have it ()
- Create a directory somewhere called
pdftk - Create a directory called
dockerinside thepdftkdirectory - Copy this Dockerfile into the
pdftk/dockerdirectory: - Copy this script also into the
pdftk/dockerdirectory: - Make sure the
dockershellscript is executable - Into the
pdftkdirectory, copy all the pdf files you want to work with cd /path/to/pdftk- 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-basethen 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";