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)?

14 Answers 14


Using 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/

| improve this answer | |
  • 12
    Xournal was really buggy - when I finally managed to import the signature and exported the PDF, the scanned PDF was blurred - my signature was the only crisp element on the resulting pdf. – Antti Haapala Jan 2 '17 at 22:00
  • 1
    I just did this on with xournal on arch and it worked quite nicely, but the background pdf was from a document, not a scan. maybe relevant? – Brandon Kuczenski Jul 3 '17 at 8:39
  • 1
    Worked for me as well on Ubuntu 16.04. As a sidenote, you can also use xournal to annotate the PDF by adding text on top of it in different layers (usefull for example to complete forms). – jotadepicas Sep 10 '17 at 0:52
  • hm. so this works, actually, but other pdf programs on mint don't save text fields... – mendota Apr 26 '18 at 17:47
  • 2
    As @AnttiHaapala discovered - this makes the resulting PDF very blurry. I can't recommend this method. – Adam Barnes Dec 16 '19 at 13:19

A lot of people recommend Xournal, but i found it to work as a version of Gimp that i can't use. 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

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!

| improve this answer | |
  • 3
    I tried all the above solutions, they all failed after much effort. xournal doesn't really work properly, there seem to be bugs in it's user interface and I wasn't able to scale or move the images after I imported them. xv did not compile, requires numerous patches to C code, then finally doesn't work either. updf, or its ubuntu PPA, doesn't exist anymore afaict. (tested on ubuntu xenial dec 2016) gimp is the way to go, thanks for this! – Chris Beck Dec 12 '16 at 21:04
  • 3
    This is a beautiful solution! It does require some image editing skills to create the signature with a transparent background, and to scale the image when added to the document as a layer. BTW, the date can also be added to the working XCF file as a layer with a bit of fuss (text size and location). The resulting PDF export is quite acceptable! – Tom Russell Jun 12 '18 at 17:53
  • 5
    If the document has multiple pages: import page as layers (default option), save the document as ".mng" (means multiple png) just adding .mng extensions and "export as" option on gimp, now got to command line and do: convert original_name.mng output_name.pdf. That's all. By the way, if the resolution for output is low, try enlarge size of pdf images while importing the pdf at the begining: try something like "2000" for width. When exporting to MNG dont forget to check the option "compression level" to the maximum this way final file will not be too heavy. – Diego Andrés Díaz Espinoza Sep 24 '18 at 18:05
  • This answer along with this (onlinesignature.com/es/draw-a-signature-online) is all you need – Alfergon Aug 28 '19 at 16:03
  • 2
    The main issue with this solution is that it renders the PDF as an image. If the original PDF had embedded text that can be selected and copied, or forms - these are all lost. So it is a good option if the source is a scanned image PDF, but if you want to retain non-image PDF features on the source - use Xournal. Also - the default rendering resolution of PDFs in GIMP is 100 ppi, which is very low and results in blurred text - use at least 600. – Guss Jul 5 at 12:19

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.

| improve this answer | |
  • 3
    It is worth nothing that this method does NOT turn the page into an image, so no potential quality losses are incurred on the final results. – davidovitch May 27 at 10:14
  • It is also easy to add the date and the full name if needed – Pierre H. Jul 3 at 12:41
  • It supports perfectly multipage PDF files (unlike another method I used before: importing one PDF page in Inkscape) – Pierre H. Jul 3 at 12:43
  • 1
    I tried Draw with a PDF I had to insert a signature in, but it couldn't find the fonts used in the document, which were then substituted, and a lot of images looked warped. So I used Xournal instead and that worked perfectly in my case. – kasimir Aug 12 at 9:03
  • Draw won't open my PDF – Philip Rego Aug 21 at 0:02

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.

| improve this answer | |

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?.

| improve this answer | |
  • @Freedom_Ben - also if you're interested I found how to sign your PDFs using certificates instead of just a PNG. LMK. – slm Aug 7 '13 at 22:44
  • 3
    The problem is that it creates images of the pages in very bad quality. :/ The other answer (about updf) works better. :) – odinho - Velmont Jun 4 '14 at 11:11
  • 3
    @slm: Very true. But it still creates a /picture/ of the page, instead of only stamping the image on like updf does. pdftk is also able to do such operations, but would need a driver-script like the one here. – odinho - Velmont Jun 4 '14 at 11:16
  • 1
    I've used pdftk and reportlab to do similar things before (mail merge on top of pdf): stackoverflow.com/questions/356502/… -- took lots of effort to find out an effective way. Very many bad ways to process PDFs out there. – odinho - Velmont Jun 4 '14 at 12:07
  • 2
    Is there a version of this that does not use xv? It is too difficult to install xv and it's not free software... – Chris Beck Dec 12 '16 at 19:09

I've had a reasonably good experience with uPdf.


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.


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.

| improve this answer | |
  • 8
    lol, that's so funny about the editing 2 lines of Python. Because I'm the one who created that comment. And here I am looking for a way to sign a PDF again, so happy about helpful people on the intarwebs :) – odinho - Velmont Jun 4 '14 at 11:12
  • Looks like the last release was for Ubuntu Quantal. Adding the repo on 15.04 (Vivid) errors with "Failed to fetch ..." – Ponkadoodle Jun 16 '15 at 20:20
  • @Wallacoloo The package is only built for Raring and Saucy. For any other distribution you need to manually change the distribution in the lst file created in /etc/apt/sources.list.d. – kynan Jun 16 '15 at 22:31
  • Crashes after splash screen on Wily 15.10 using either Precise or Quantal distributions. – Jonathan Neufeld Jan 6 '16 at 1:33
  • 1
    Works for me on Debian Buster. Other answers like the custom scripts use pdftk which is currently unavailable, and Xournal is not in the repositories. Updf download page or direct download link. Install with sudo dpkg -i file.deb; sudo apt install -f and then edit the Python code as mentioned in the answer. – Luc Jul 6 '18 at 10:38

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


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)

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

    if [ -n "$p1" ]
        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

        if (( $dx*$sdata[2] > $sdata[1]*$dy ))

        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

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

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

echo "Encrypting PDF file..."
pdftk $f.signed.pdf output $f.signenc.pdf user_pw PROMPT owner_pw $(openssl rand -base64 32) allow AllFeatures
| improve this answer | |
  • This isn't working for me, imagamagick loads but only displays splash screen. – Andreas Jul 27 '16 at 20:41

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 ;)

| improve this answer | |
  • And the advantage over other graphics applications here is that multi-page files are treated perfectly sensibly. – Dartmoor Tom Nov 30 '19 at 13:26
  • 1
    Works well in Scribus 1.5.5, 1.4.9 didn't work yet. – Erik Dec 4 '19 at 10:59

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
| improve this answer | |
  • Thanks for sharing back. I'll check out your script. I've had really good success with Xournal, tho you have to make sure not to export to the original filename as that can cause issues. If you pick a new name to export to (so you aren't overwriting the original pdf) then you'll avoid this bug. – Freedom_Ben Jun 9 '18 at 3:15
  • That doesn't solve the blurriness issue @Freedom_Ben – Adam Barnes Dec 16 '19 at 13:21

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

| improve this answer | |
  • 1
    It seems to have been recently added to the Extra repo. – Folât Aug 23 at 9:56

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.

| improve this answer | |
  • In my case I also need to "tick" menu item "Tools" -> "Review" to see "Freehand Line" and "Inline Note" (add normal text) menu. And I can right-click the thing I draw and choose "Properties" to edit color, set border width to 0, set Align "center", and drag the line to adjust border height. – Fruit Mar 31 at 13:50

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 400x690 in the pdf.

#!/bin/bash -x



# 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"
| improve this answer | |
  • You saved my day! Thanks! :) – cartoonist Jul 3 at 16:28

I run a business and Xournal doesnt have the quality or breadth of control over pdf files that I need.

I'm also using or applying digital signatures all the time.

Master PDF Editor (version 5 as of this date) is a paid application that easily exceeds expectations and is now my default pdf reader for Ubuntu. Key feature: - sign documents - fill in forms - modify text and objects - annotate and highlight documents - merge and split pdf files - etc

For more details go to: https://code-industry.net/masterpdfeditor/?-about&ver=5438

| improve this answer | |

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.

| improve this answer | |
  • I had to add python-gi-cairo to the dependencies to make it work. – Joma Mar 18 '15 at 7:07
  • Joma: thanks; I've now added python-gi-cairo to the list. – projix Jun 5 '16 at 20:01

Not the answer you're looking for? Browse other questions tagged or ask your own question.