115

I have been using wkthmltopdf to convert html to pdf documents on-the-fly on my linux web server. The program originally needed X11 or similar X server to run correctly, but through many requests by developers to have this run on servers without GUI, I am pretty sure it runs a virtual X server in the static version. I have been using the static (stand-alone) version of the program and it works great! I would put the executable file in a folder, and run:

./wkhtmltopdf file1.html file2.pdf

However I would like to install this program system-wide. I used the apt-get install wkhtmltopdf (just installed yesterday) and since I am running on a 64 bit system, I also needed apt-get install ia32-libs. After installation I can find the version like this:

wkhtmltopdf --version

output:

Name:
  wkhtmltopdf 0.9.9

License:
  Copyright (C) 2008,2009 Wkhtmltopdf Authors.



  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
  This is free software: you are free to change and redistribute it. There is NO
  WARRANTY, to the extent permitted by law.

Authors:
  Written by Jakob Truelsen. Patches by Mário Silva, Benoit Garret and Emmanuel
  Bouthenot.

Now when I try to run the program installed via aptitude, I get the following error:

wkhtmltopdf: cannot connect to X server

Does anyone know how I can fix this? I guess this version is missing a virtual X server or something.

jeffery_the_wind
  • 17,048
  • 34
  • 98
  • 160

21 Answers21

210

or try this (from http://drupal.org/node/870058)

  1. Download wkhtmltopdf. Or better install it with a package manager:

    sudo apt-get install wkhtmltopdf
    
  2. Extract it and move it to /usr/local/bin/

  3. Rename it to wkhtmltopdf so that now you have an executable at /usr/local/bin/wkhtmltopdf
  4. Set permissions: sudo chmod a+x /usr/local/bin/wkhtmltopdf
  5. Install required support packages.

    sudo apt-get install openssl build-essential xorg libssl-dev
    
  6. Check to see if it works: run

    /usr/local/bin/wkhtmltopdf http://www.google.com test.pdf
    

    If it works, then you are done. If you get the error "Cannot connect to X server" then continue to number 7.

  7. We need to run it headless on a 'virtual' x server. We will do this with a package called xvfb.

    sudo apt-get install xvfb
    
  8. We need to write a little shell script to wrap wkhtmltopdf in xvfb. Make a file called wkhtmltopdf.sh and add the following:

    xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf "$@"
    
  9. Move this shell script to /usr/local/bin, and set permissions:

    sudo chmod a+x /usr/local/bin/wkhtmltopdf.sh
    
  10. Check to see if it works once again: run

    /usr/local/bin/wkhtmltopdf.sh http://www.google.com test.pdf
    

Note that http://www.google.com may throw an error like "A finished ResourceObject received a loading finished signal. This might be an indication of an iframe taking to long to load." You may want to test with a simpler page like http://www.example.com.

Evan Donovan
  • 748
  • 9
  • 18
TimoSolo
  • 7,068
  • 5
  • 34
  • 50
  • 1
    I tried that tutorial originally, and it didn't quite work, also I didn't like having to create the wrapper with symbolic link. Like I wrote in my answer, if you just move the static executable to the `/usr/bin/` directory you can use it from anywhere. They added a virtual x-server to static executable, so no need to make the wrapper script. – jeffery_the_wind Mar 13 '12 at 13:43
  • it worked for me.. in some situations. I think installing missing 32bit libraries fixed it for me - thanks for that tip – TimoSolo Mar 14 '12 at 07:03
  • What is the statement in number 6 `If you get the error "Cannot connect to X server" then continue to number 6.` supposed to mean? I'm very confused by this. Do you mean to say to continue to number 7? – Noz Apr 08 '13 at 19:43
  • Yes, that is what is meant...the original article had mis-numbered the items. So go on to #7 – dwaz May 01 '13 at 18:53
  • thanks, renumbered.. The suggested answer should work in most cases though, so try that first – TimoSolo May 02 '13 at 10:50
  • with pdfkit in python I get a Exec error when I try this :/ even though it works fine in terminal – Charles Haro Apr 15 '15 at 23:00
  • And if you have a script with a hardcoded installation path; you can create a symlink to run the shell script. Works like a charm (y) – Alex2php Jul 30 '15 at 10:52
62

This solved the issue for me:

sudo apt-get install xvfb
xvfb-run --server-args="-screen 0, 1024x768x24" wkhtmltopdf file1.html file2.pdf
Aleksander Blomskøld
  • 18,374
  • 9
  • 76
  • 82
syzspectroom
  • 721
  • 5
  • 3
  • This is the easiest and safest approach, since the standard installation of wkhtmltopdf doesn't include the x-server. – Peter Dec 04 '14 at 14:39
  • 1
    This is how to solve "cannot connect to X server" in the vast majority of cases. – tripleee Oct 24 '16 at 08:27
  • 3
    On Redhat based distros use `sudo yum install xorg-x11-server-Xvfb` resp. `sudo dnf install xorg-x11-server-Xvfb`. – TNT Mar 26 '17 at 10:09
28

I tried to do sudo apt-get install wkhtmltopdf but without any success. Instead I recommend you try:

  1. Download the latest executable (.11 rc1) :

    wget https://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.11.0_rc1-static-i386.tar.bz2

  2. uncompress it :

    tar -vxf wkhtmltopdf-0.11.0_rc1-static-i386.tar.bz2

  3. rename it :

    mv wkhtmltopdf-i386 wkhtmltopdf

  4. chmod it to executable :

    chmod a+x wkhtmltopdf

  5. place it into /usr/bin :

    sudo mv wkhtmltopdf /usr/bin

montrealmike
  • 11,433
  • 10
  • 64
  • 86
Yakob Ubaidi
  • 1,846
  • 2
  • 20
  • 23
  • https://code.google.com/p/wkhtmltopdf/issues/detail?id=730 seems like vs 11.0_rc1 has some issues – montrealmike Mar 28 '13 at 00:05
  • this worked for me but the pdf generation failed so I replaced the above instructions with `https://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-i386.tar.bz2` – martincarlin87 Sep 30 '13 at 14:28
  • 1
    downloading wkhtmltox-linux-amd64_0.12.0-03c001d.tar.xz works for me now. For some reason the latest does not. – chasetheskyforever Jul 17 '14 at 15:35
  • 1
    I can confirm this worked for me: (getting latest stable version atm) wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz tar -vxf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz chmod a+x wkhtmltox/bin/wkhtmltopdf sudo mv wkhtmltopdf /usr/local/bin/wkhtmltopdf – Magico Feb 17 '16 at 14:21
27

Just made it:

1- To download wkhtmltopdf dependencies

# apt-get install wkhtmltopdf

2- Download from source

# wget http://downloads.sourceforge.net/project/wkhtmltopdf/xxx.deb

# dpkg -i xxx.deb

3- Try

# wkhtmltopdf http://google.com google.pdf

Its working fine

It works!

Bala
  • 117
  • 4
  • 13
Sfblaauw
  • 1,556
  • 18
  • 21
  • I had to run `apt-get install -f` after installing the package to get the dependencies. Otherwise worked like a charm. Much prefer this method to the others described. – dmuir Jan 30 '15 at 03:42
  • 2
    I agree. This solution got me to the current rev. The dpkg -i command did generate some ambiguous info but regardless, it worked: `wget -q http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb` followed by `sudo dpkg --install wkhtmltox-0.12.2.1_linux-trusty-amd64.deb` – Bill Butler Feb 23 '15 at 23:17
  • this is still the better solution provided to this question. – versvs Jul 02 '15 at 15:07
  • 1
    I had to run `sudo mv wkhtmltopdf /usr/bin` from the `/usr/local/bin/` directory, but this worked great! I tried every other method on this page with no luck before hand.. – shaneparsons Oct 14 '15 at 16:13
  • this should get higher upvotes as a latest and simpler solution without relying other packages (which also solves 'Cannot connect to X server' problem). and I have issues with relative css path not being loaded when using xvfb. – zynick Jan 25 '16 at 17:39
16

I found method to resolve this problem without fake X server. In newest version of wkhtmltopdf dont need X server for work, but it no into official linux repositories.

Solution for Ubuntu 14.04.4 LTS (trusty) i386

$ sudo apt-get install xfonts-75dpi
$ wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2/wkhtmltox-0.12.2_linux-trusty-i386.deb
$ sudo dpkg -i wkhtmltox-0.12.2_linux-trusty-i386.deb
$ wkhtmltopdf http://www.google.com test.pdf

Solution for Ubuntu 14.04.4 LTS (trusty) amd64

$ sudo apt-get install xfonts-75dpi
$ wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2/wkhtmltox-0.12.2_linux-trusty-amd64.deb
$ sudo dpkg -i wkhtmltox-0.12.2_linux-trusty-amd64.deb
$ wkhtmltopdf http://www.google.com test.pdf

User felixhummel got very good solution, but repository with utilite has changed.

PRIHLOP
  • 1,441
  • 1
  • 16
  • 16
  • for some reason this was working for me and the newer version (0.13) was not thank you! – talsibony Sep 01 '16 at 07:24
  • This is the solution that worked for me, i have tried lot of other resolution but none of them worked. As i am new to php/Laravel environment so i have no deep knowledge of these libraries & dependencies, but this solution is awesome simply saved my hours :) – Amit Sep 23 '16 at 07:15
  • Really this solution is awesome today i moved to production and got same issue, without wasting anytime i just run these solution and it worked smoothly :) – Amit Sep 25 '16 at 09:36
  • gna.org is now shut down. :( – Jya Nov 28 '17 at 05:28
11

Expanding on Timothy's answer...

If you're a web developer looking to use wkhtmltopdf as part of your web app, you can simply install it into your /usr/bin/ folder like so:

cd /usr/bin/
curl -C - -O http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.11.0_rc1-static-i386.tar.bz2
tar -xvjf wkhtmltopdf-0.11.0_rc1-static-i386.tar.bz2
mv wkhtmltopdf-i386 wkhtmltopdf

You can now run it anywhere using wkhtmltopdf.

I personally use the Snappy library in PHP. Here is an example of how easy it is to create a PDF:

<?php

// Create new PDF
$pdf = new \Knp\Snappy\Pdf('wkhtmltopdf');

// Set output header
header('Content-Type: application/pdf');

// Generate PDF from HTML
echo $pdf->getOutputFromHtml('<h1>Title</h1><p>Your content goes here.</p>');
Jonathan
  • 18,229
  • 10
  • 57
  • 56
11

Update to latest wkhtmltopdf version from SourceForge (0.12 as of this writing). It does not need an X Server to run.

Example for Ubuntu 14.04:

$ cd /tmp/                                                                                                                                                                                                       
$ wget -q http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
$ dpkg -x wkhtmltox-0.12.2.1_linux-trusty-amd64.deb foo

$ echo '<p>hi</p>' | ./foo/usr/local/bin/wkhtmltopdf - /tmp/hi.pdf
Loading pages (1/6)
Counting pages (2/6)                                               
Resolving links (4/6)                                                       
Loading headers and footers (5/6)                                           
Printing pages (6/6)
Done                                                                      

$ head -n3 /tmp/hi.pdf 
%PDF-1.4
1 0 obj
<<
felixhummel
  • 1,229
  • 10
  • 10
9

for 14.04.1-Ubuntu https://wkhtmltopdf.org/downloads.html

wget https://downloads.wkhtmltopdf.org/0.12/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz -O mktemp.tar.xz
tar xf mktemp.tar.xz
sudo cp wkhtmltox/bin/wkhtmltopdf /usr/bin/wkhtmltopdf
sudo chmod +x /usr/bin/wkhtmltopdf
rm mktemp.tar.xz
rm wkhtmltox -rf
apt-get update
apt-get install -y libxrender1 libxtst6 libxi6
wkhtmltopdf http://www.google.com test.pdf
Matthias
  • 1,150
  • 20
  • 38
6
sudo -i
apt-get install wkhtmltopdf xvfb libicu48
mv /usr/bin/wkhtmltopdf /usr/bin/wkhtmltopdf-origin
touch /usr/bin/wkhtmltopdf && chmod +x /usr/bin/wkhtmltopdf && cat > /usr/bin/wkhtmltopdf << END
#!/bin/bash

/usr/bin/xvfb-run -a -s "-screen 0 1024x768x24" /usr/bin/wkhtmltopdf-origin  "\$@"
END
GoTLiuM
  • 781
  • 9
  • 3
6

Problem is probably in old version of wkhtmltopdf - version 0.9 from distribution repository require running X server, but current version - 0.12.2.1 doesnt require it - can run headless.

Download package for your distribution from http://wkhtmltopdf.org/downloads.html and install it - for Ubuntu:

sudo apt-get install xfonts-75dpi
sudo dpkg -i wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
Honza
  • 974
  • 10
  • 18
6

wkhtmltopdf > 0.11 doesn't have this X-server issue.
So installing 0.12.2.1 on a linux server.

  1. At first install xvfb server:

    sudo apt-get install xvfb
    
  2. Get needed version of wkhtmltopdf from http://wkhtmltopdf.org/downloads.html

  3. Install wkhtmltopdf:

    sudo dpkg -i wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
    

    or install with wget

    URL='http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb'; FILE=`mktemp`; wget "$URL" -qO $FILE && sudo dpkg -i $FILE; rm $FILE
    
  4. Install dependency (if needed):

    sudo apt-get -f install
    
  5. Create symblic link in /usr/local/bin/:

    echo 'exec xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf "$@"' | sudo tee /usr/local/bin/wkhtmltopdf.sh >/dev/null
    sudo chmod a+x /usr/local/bin/wkhtmltopdf.sh
    
  6. Now try below and it should work,

    /usr/local/bin/wkhtmltopdf http://www.google.com test.pdf
    
Parag Tyagi
  • 8,780
  • 3
  • 42
  • 47
5

I just figured out that I can simply move the static executable to the /usr/bin/ directory and execute it from anywhere.

jeffery_the_wind
  • 17,048
  • 34
  • 98
  • 160
3

solution for Centos7:

yum -y install xorg-x11-fonts-75dpi \
               xorg-x11-fonts-Type1 \
&& rpm -Uvh http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos7-amd64.rpm

We run into this problem inside docker containers and the above install has wkhtmltopdf with patched QT

DmitrySemenov
  • 9,204
  • 15
  • 76
  • 121
  • 4
    for me URL was not working, I used this one: `sudo rpm -Uvh https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos7-amd64.rpm` – WebOrCode Nov 29 '17 at 13:36
3

It is recommended to use at least 0.12.2.1.

Starting from wkhtmltopdf >= 0.12.2 it doesn't require X server or emulation anymore. You can download new version from http://wkhtmltopdf.org/downloads.html

David Ginanni
  • 1,617
  • 15
  • 9
1

I did follow the instructions here and made wkhtmltopdf work for me but I would like to offer a bit of perspective which I discovered while doing my own little dance with wkhtmltopdf - xvfb.

This is important because the same reason that causes it to throw the infamous cannot connect to X server error is also causing it to run with sever limitations even if you do provide it a X server. These limitations include not being able to take multiple input sources, set header and footers, etc (check the Reduced Functionality section of the manual).

wkhtmltox by itself doesn't require a X11, however it's making use of QT libraries which do. In newever versions of wkthmltox developers made a patch for QT which allows it to run with a X11.

Currently some versions are built against patched QT and some are not. You can check your version by running wkhtmltopds --version. There should be a line at the end saying Compiled against wkhtmltopdf patched qt.

So, to conclude, if you install and use a version that uses the patched libraries it should work on a linux server without the xvfb server, as I can confirm.

Cristian Vrabie
  • 3,972
  • 5
  • 30
  • 49
1

Pay attention: your file could be wkhtmltopdf.sh or wkhtmltopdf, check it on second step

You must copy it into directory : /usr/local/bin, make sur it's executable and add symlink of wkhtmltopdf.sh like :

1- the command :

sudo apt-get install wkhtmltopdf

2 - insert the binary in directory /usr/bin so the browser can't have permission to execute in this directory. You must copy the wkhtmltopdf.sh to directory /usr/local/bin cause the browser have permission in this directory like:

sudo cp /usr/bin/wkhtmltopdf.sh /usr/local/bin/wkhtmltopdf.sh

3 - After make sur the binary have permission of execution like :

sudo chmod a+x /usr/local/bin/wkhtmltopdf.sh

4 - so now you can test, it's work like:

/usr/local/bin/wkhtmltopdf.sh http://www.google.com google.pdf

it make download the pdf in the current directory in your terminal

5 - Optional now you can add symlink in your directory /usr/local/bin like

ln -s /usr/local/bin/wkhtmltopdf.sh /usr/local/bin/wkhtmltopdf
ankitkanojia
  • 3,072
  • 4
  • 22
  • 35
rapaelec
  • 1,238
  • 12
  • 10
1

Just tell the Qt backend to not use X:

QT_QPA_PLATFORM=offscreen wkhtmltopdf <input> <outfile.pdf>
loonix
  • 161
  • 1
  • 2
0

For 64-bit Use:

wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-amd64.tar.bz2

tar xvjf wkhtmltopdf-0.9.9-static-amd64.tar.bz2

sudo mv wkhtmltopdf-amd64 /usr/bin/wkhtmltopdf

sudo chmod +x /usr/bin/wkhtmltopdf

Taazar
  • 1,545
  • 18
  • 27
0
  1. Download file from this link
  2. Extract it and move executable file(/wkhtmltox/bin/wkhtmltopdf) to /usr/bin/
  3. Rename it to wkhtmltopdf if current name is not wkhtmltopdf. So that now you have an executable at /usr/bin/wkhtmltopdf
  4. Set permissions: sudo chmod a+x /usr/bin/wkhtmltopdf
  5. Install required support packages. sudo apt-get install openssl build-essential xorg libssl-dev
  6. Now, check with wkhtmltopdf http://www.google.com test.pdf hint: detail information from this link
Ratna Halder
  • 1,954
  • 16
  • 17
0

Just install a version 0.12.4 or higher. This seems to solve the problem.

See How can I install the latest wkhtmltopdf on Ubuntu 16.04?.

Martin Thoma
  • 124,992
  • 159
  • 614
  • 958
0

If you config wkhtmltopdf for Rails or Somethings in Centos, you can follow these step bellow:

  1. Go to https://wkhtmltopdf.org/downloads.html and copied the link of rpm file.

In centos server bash.

  1. wget link_of_wkhtmltopdf_rpm.rpm

  2. rpm -ivh link_of_wkhtmltopdf_rpm.rpm

  3. which wkhtmltopdf

=> You will get path of wkhtmltopdf.

  1. Setup for wicked_pdf or pdfkit with path in step 4. This is sample config with wickedpdf. config/initializers/wicked_pdf.rb

    if Rails.env != "production"
        path = %x[which wkhtmltopdf].gsub(/\n/, "")
    else
        path = "path_of_wkhtmltopdf_in_step_4"
    end
    WickedPdf.config = { exe_path: path }
    
  2. Restart server.

DONE.

ThienSuBS
  • 1,574
  • 18
  • 26