How can I add a signature .png to a PDF in Linux?

I have a scanned copy of my written signature and I need to apply it to some documents in the signature block. I used to do this on Windows all the time but I now have only Linux.

Is this possible? How can I add a signature image to a PDF file in Linux (Gnome 3)?

Asked By: Freedom_Ben

||

I found this script which you can modify to attach a signature to an existing PDF file.

You can also download it from this pastebin URL:

There is also this Q&A on AskUbuntu that has many other methods for doing this. The Q&A is titled: How to put a picture on an existing pdf file?.

Answered By: slm

I’ve had a reasonably good experience with uPdf.

Installation

sudo add-apt-repository ppa:atareao/updf
sudo apt-get update
sudo apt-get install -y updf

Then fix a bug by editing 2 lines in a Python script.

Usage

Launch uPdf, select the Add an image tool, draw a rectangle around the area where you want the signature to go and select the image file with your signature. A PNG with a transparent background works best.

Answered By: kynan

While putting my own signature commands into a shell script, I was looking for a way to interactively select the area where the signature should go. Luckily I found this question and the script of Emmanuel Branlard contains the idea on how to do it (with xv). I implemented the following points:

  • use ImageMagicks display instead of xv
  • use stdbuf -oL and the -update option to have a live preview
  • overlay the signature with pdftk stamp to prevent image quality degradation
  • only extract the specific page from the pdf file
  • decrypt the signature with gpg
  • encrypt the signed pdf file with pdftk
  • cleanup intermediate files containing the signature with wipe

So here is the code:

#!/bin/env zsh

#dependencies: pdftk, ImageMagick, gpg, wipe, openssl

signature=~/PGP/signature.png.gpg

f=${1%.pdf}
page=$2
density=144
bo=0.2 #baseline overlap in relation to y-size of the signature

pagecount=$(pdftk $f.pdf dump_data | grep NumberOfPages | sed "s/.*: //")
#sign on last page by default
if [ -z "$page" ]; then page=$pagecount; fi

function cleanup
{
    echo "Cleaning up..."
    rm $f.$page.pdf
    wipe $f.$page.signature.pdf $f.$page.signed.pdf $f.signed.pdf signature.png
}
trap cleanup EXIT

echo "Signing document $f.pdf on page $page."

echo "Decrypting signature..."
gpg -d $signature > signature.png
identity=$(identify -format "%w,%h,%x,%y" signature.png)
sdata=(${(s/,/)identity})

echo "Please give the signature area with two clicks and finish by pressing β€˜q’!"

#extract page
pdftk $f.pdf cat $page output $f.$page.pdf
cp $f.$page.pdf $f.$page.signed.pdf
size=$(identify -format "%wx%h" $f.$page.pdf)

#select signature area
display -density $sdata[3]x$sdata[4] -immutable -alpha off -update 1 -debug X11 -log "%e" -title "sign $f.pdf#$page" $f.$page.signed.pdf 2>&1 >/dev/null | 
    grep --line-buffered "Button Press" | 
    stdbuf -oL sed -r "s/^.*+([0-9]+)+([0-9]+).*$/1,2/" | 
    while read line
do
    p1=($p2)
    p2=(${(s/,/)line})

    if [ -n "$p1" ]
    then
        p=(0 0)
        if (( p1[1] < p2[1] )); then dx=$((p2[1]-p1[1])); p[1]=$p1[1]; else dx=$((p1[1]-p2[1])); p[1]=$p2[1]; fi
        if (( p1[2] < p2[2] )); then dy=$((p2[2]-p1[2])); p[2]=$p1[2]; else dy=$((p1[2]-p2[2])); p[2]=$p2[2]; fi
        dy=$((dy*(1+bo)))

        if (( $dx*$sdata[2] > $sdata[1]*$dy ))
        then
            resize=$(((dy+0.0)/sdata[2]))
            p[1]=$((p[1]+(dx-resize*sdata[1])/2))
        else
            resize=$(((dx+0.0)/sdata[1]))
            p[2]=$((p[2]+(dy-resize*sdata[2])/2))
        fi

        echo "Inserting signature..."
        convert -density $density -size $size xc:transparent ( signature.png -resize $((resize*100))% ) -geometry +$p[1]+$p[2] -composite $f.$page.signature.pdf
        pdftk $f.$page.pdf stamp $f.$page.signature.pdf output $f.$page.signed.pdf

        unset p1 p2
    fi
done

if [ -z "$p" ]
then
    echo "You have to click two times. Aborting..."
    exit 1
fi

echo "Joining PDF pages..."
sew=( pdftk A=$f.pdf B=$f.$page.signed.pdf cat )
if (( page > 1 )); then
    sew+=A1-$((page-1))
fi
sew+=B
if (( page < pagecount )); then
    sew+=A$((page+1))-end
fi
sew+=( output $f.signed.pdf )
$sew

echo "Encrypting PDF file..."
pdftk $f.signed.pdf output $f.signenc.pdf user_pw PROMPT owner_pw $(openssl rand -base64 32) allow AllFeatures
Answered By: bodo

updf is really good for this. Having used preview on MacOS to “sign” documents, updf offers the closest user experience to this.

The following works on Ubuntu 14.10 and Debian 8.

I didn’t want to add a third party ppa to my system, so got updf running in the following way instead:

$ bzr branch lp:updf

then made the 2 line edit as referenced from the other answer.

Install dependencies:

# apt-get install python-poppler gir1.2-gtk-3.0 gir1.2-gdkpixbuf-2.0 gir1.2-poppler-0.18 python-cairo librsvg2-2 gir1.2-rsvg-2.0 python-gi-cairo

(the above was sufficient; not every package may be necessary, though).

and then the python program is runnable in-place:

$ ./src/updf.py

Unfortunately, quality can be severely affected in the output document compared to the input document. The right way to do this would be to overlay the signature, and not change the original, in a lossless process. Whereas updf appears to engage in re-encoding of the original.

Answered By: projix

It’s worth mentioning Xournal which has a nice UI and allows adding text, images, and hand-written notes to PDF files. The only problem I’ve had is it doesn’t seem to handle text from native PDF forms very well.

Answered By: Mike Chelen

Using Xournal (or Xournal++) you can annotate PDFs and add custom images (e.g. a transparent PNG). Although it is used for taking freehand notes and drawing, it can also annotate PDFs.

On Ubuntu:

  • Install Xournal through the Ubuntu Software Center
  • Open Xournal
  • Select "Annotate PDF" from the File menu and select your PDF file to be signed.
  • Click the "Image" button in the toolbar (it looks like a silhouette of a person).
  • Click on document. A file browser dialog will open.
  • Select a PNG image of your signature.
  • Resize and position the image on the PDF.
  • Select "Export to PDF" from the File menu.

More info at http://www.howtogeek.com/215485/sign-pdf-documents-without-printing-and-scanning-them-from-any-device/

Answered By: Nate Lampton

A lot of people recommend Xournal, but i found it to work as a version of Gimp that i can’t use.

Open PDF with GIMP and add the signature image

Thus if you are familiar with GIMP, i would recommend trying it.

  • You should have a file with the signature (even a picture taken with the phone or webcam), and a file with the document to be signed. The latter is going to be in PDF format, that can be opened by Gimp
  • Apply a threshold on the signature if the white is not white enough
  • Convert white to alpha in the signature if the background of the document is not white
  • Open the document with Gimp
  • Open the signature on top of the document as a new layer (File -> Open as layer)
  • Adjust size and position
  • Merge layers
  • Export as PDF

Personal Experience

I do this regularly when i need to sign single page documents, and it takes me more or less five minutes. Unfortunately this won’t work if you need for example to sign every page of a multi page document. In the latter case i just print, sign, and scan again!

See also

Answered By: danza

For completeness, there is an alternative script to do this, which does not convert the pdf to a (low quality) image, in contrast to the one mentioned so far: https://github.com/martinruenz/signpdf

My experience with the other solutions was:

  • Xournal messed with the pdf (it seemed to work after building from source though)
  • The script SignPDF converts pdfs to images and reduces quality significantly. It also has a troublesome dependency (xv)
  • I didn’t try the gimp and updf option
  • In the end I used Acrobat Reader in a VM as I also had to fill various forms
Answered By: Martin R.

Okular PDF viewer has this built-in with annotations.
Open the PDF you want to sign, select reviews on the bar to the left, select the third option on the pop up menu that says, ‘freehand line.’ Draw out your signature. If you want it black ink rather then neon green, select ‘Settings’ from the menu, select ‘Configure Okular,’ select ‘Annotations’ button on the left. Select ‘Freehand Line’ from the options, then select the ‘Edit’ button. You can adjust both the line thickness and color here. Hit Apply and enjoy.

Answered By: Christian

On Debian (Bullseye) I’ve found the simplest (?) free way is to use Scribus 1.5.5 which can easily import a PDF (this may be possible in earlier releases, too):

Import the PDF, then make an image box where you want your signature, choose your signature file, resize as necessary and then export as a new PDF (of course, you can use a text box to place necessary text such as date etc.) It’s no different ultimately to using GIMP or similar, but if you’re familiar with Scribus then it’s a matter of seconds to do it. I’ve just done it twice for signing off accounts, which is how I ended up here πŸ˜‰

Answered By: Dartmoor Tom

I’m surprised to find the premier free office software for Linux mentioned nowhere on this page. LibreOffice Draw will open a PDF and allow you to insert an image. If your signature file already exists in the file system as a PNG with a transparent background, it’s a snap to get it onto a page, change the size and move it into place in Draw. Draw will save the document as an ODG by default, so you’ll need to export the modified document to PDF.

Answered By: Tom Russell

Inspired by the answer from bodo I created a simplified version in hope others can reuse/modify this easily for their purpose to sign a single page pdf. I’m not sure if this might also work for multipage pdf’s.

Save the following script as sign.sh. Given some pdf called origin.pdf you want to add an image, e.g. a png of your signature, somewhere in the pdf, you run the script like this:

./sign.sh origin signature.png 10 400 690
This command creates a new pdf origin.1.signed.pdf where the signature.png is scaled to 10% of it’s size and positioned to 400×690 in the pdf.

#!/bin/bash -x

density=144

f=$1
s=$2
p=$3
x=$4
y=$5

# determine the size of the original pdf
pdfsize=$(identify -format "%wx%h" "$f.pdf")
# just in case someone needs this: get the size of the signature image
#identify -format "%w,%h,%x,%y" "$s"

# create a new pdf with the same size as the original pdf with transparent background and the signature image positioned at the final position
convert -density $density -size $pdfsize xc:transparent ( "$s" -resize $p% ) -geometry +$x+$y -composite "$f.1.signature.pdf"
# stamp the original pdf with the new signature template pdf
pdftk "$f.pdf" stamp "$f.1.signature.pdf" output "$f.1.signed.pdf"
# remove the signature pdf
rm "$f.1.signature.pdf"
Answered By: John Doe

Since some users mentioned bugs in the output file (crisp signature but blurred source document), I suggest using xournalpp (xournal++) instead of xournal.
I’ve not encountered any problem.

It’s packaged in some distributions (in Arch, pacman -Ss xournal only shows xournalpp) and works as intended.

From Arch Wiki:

Xournal++ (xournalpp) is the successor to Xournal that is currently in development. If you want a newer version Xournal, then you could try this. It is currently stable with little to no bugs that causes crashes.

Link to repository:
https://github.com/xournalpp/xournalpp

Answered By: Philipp

Let me start from the beginning of the question which mentions a "scanned copy of my written signature". I used a picture taken with my phone. By the way, I recommend using ink or a strong black pen to make sure the written portion has clear lines that stand out from the white paper background.

Step 1 – Make a transparent signature image

You’ll only need to do this once. For this I used gimp, which you can install on Ubuntu with:

sudo apt install gimp

You might want to start by getting a nice rectangle with only the signature. For this I used the Rectangle Select Tool, then Edit > Cut, and Edit > Paste as New Image.

Next I followed the steps to make the background transparent by using the Fuzzy Select Tool and pressing Delete. This gets rid of the white background (important because in my case the picture didn’t come out with a clear white, was more like grey) leaving only the black signature. I then exported this to a PNG file. Now I have a signature file that I can reuse!

Step 2 – Insert Signature in PDF

Once you have a transparent signature it makes it easier to use a variety of tools. I used GIMP again. I was given a Word document so I used LibreWriter to convert it to a PDF first. Then I opened it with GIMP and accepted the default of each page as a layer.

Next I opened the signatured file using File > Open as Layers. I used CTRL+S to resize it and then the Move Tool to position it nicely on the page. Then I right-clicked on the signature layer on the right and selected "Merge Down".

The final step was to use "File > Export as" and giving the file name a PDF extension. In the options dialog I accepted the default of "use layers as pages" and also had to tick "reverse page order" to get the order page right.

Note: I had done this before on Windows and it was a lot easier with Acrobat Reader, because I already had the transparent image. Although the Linux method is a bit more involved, it’s not that much more complicated if you follow the steps, once you have a transparent PNG. Any suggestion for improving this answer is welcome.

Answered By: Nagev

Inspired by bodo’s answer I went ahead and wrote a tool with a complete GUI that won’t reduce the output quality.

Here it is:

https://github.com/svenssonaxel/pdf-sign

Answered By: Axel Svensson

Here’s a solution that preserves the PDF layout, the text, and forms.

  1. Open the original PDF file orig.pdf with Xournal.
  2. Add the signature as an image (and possibly other things) with Xournal.
  3. Still in Xournal, select "Page β†’ Apply To All Pages", then "Page β†’ Page Style β†’ plain" (this will remove everything from the original PDF file). Then export to PDF, say as signature.pdf. The goal here is to keep only the data added in Xournal (e.g. the signature).
  4. Remove the background from signature.pdf in a similar way to what is said in How to change white background of an included PDF to transparent. In short: qpdf -qdf signature.pdf tmp.pdf, then remove each occurrence of the data consisting of 4 numbers followed by "re f". But to fix the obtained PDF, instead of using fix-qdf, I suggest to use ps2pdf tmp.pdf new-signature.pdf (ignore the error) in order to also recompress the PDF file.
  5. Add the signature to the original file with: pdftk orig.pdf multistamp new-signature.pdf output result.pdf

The obtained PDF file result.pdf has the contents from orig.pdf (including the forms) and the signature (and possibly other data that were added with Xournal) from new-signature.pdf.

Note: this should also work with Xournal++ instead of Xournal.

Answered By: vinc17

I have just finished putting together an early version of a tool that makes it quite easy to draw anything you can in Inkscape and overlay it onto pages of PDF. It’s a GUI app for linux written in Go:

https://github.com/oxplot/pdfrankestein

Answered By: Mansour

Most answers here will rasterize the signature and/or the document. I prefer a solution with is as least invasive as possible, not changing the document (text, fonts, kerning,…) except for the added signature.

  1. Create a document with the same page-size containing only the signature in the target location.
    I like to use Inkscape (I just imported the page I want to sign, placed the signature, remove the imported parts, saved the page as PDF). Others like to use enscript.
  2. Overlay the signature onto the document.
    qpdf document.pdf --overlay signature.pdf -- signed_document.pdf

This assumes a one-page document, signature shall be placed on that one page. For alternative variants, have a look at this answer.

Answered By: Hermann

The problem with the xournal solution is it is not working with the signature was produced via a scan, as setting the background to transparent does not work properly. Unfortunately with xournal it is also not possible to set the signature image into the background. SO the best solution in my opinion that always works is to:

Do it online with adobe acrobat reader…

https://acrobat.adobe.com/link/home/

Create an account, upload your pdf document, open the document and then select signature and upload your signature .png file.

enter image description here

Then place the signature in your document.

Answered By: newandlost

LibreOffice Draw worked very well for me.

Answered By: progonkpa
Categories: Answers Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.