wkhtmltopdf: cannot connect to X server
Asked Answered
S

21

116

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.

Superscribe answered 7/3, 2012 at 15:48 Comment(0)
S
5

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

Superscribe answered 7/3, 2012 at 16:47 Comment(0)
B
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.

Bomber answered 13/3, 2012 at 13:36 Comment(7)
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.Superscribe
it worked for me.. in some situations. I think installing missing 32bit libraries fixed it for me - thanks for that tipBomber
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?Mortensen
Yes, that is what is meant...the original article had mis-numbered the items. So go on to #7Commend
thanks, renumbered.. The suggested answer should work in most cases though, so try that firstBomber
with pdfkit in python I get a Exec error when I try this :/ even though it works fine in terminalLeticialetisha
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)Operose
G
62

This solved the issue for me:

sudo apt-get install xvfb
xvfb-run --server-args="-screen 0, 1024x768x24" wkhtmltopdf file1.html file2.pdf
Gertudegerty answered 28/11, 2012 at 12:12 Comment(3)
This is the easiest and safest approach, since the standard installation of wkhtmltopdf doesn't include the x-server.Regain
This is how to solve "cannot connect to X server" in the vast majority of cases.Organize
On Redhat based distros use sudo yum install xorg-x11-server-Xvfb resp. sudo dnf install xorg-x11-server-Xvfb.Championship
E
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

Enclose answered 7/3, 2013 at 5:30 Comment(4)
code.google.com/p/wkhtmltopdf/issues/detail?id=730 seems like vs 11.0_rc1 has some issuesGahnite
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.bz2Launceston
downloading wkhtmltox-linux-amd64_0.12.0-03c001d.tar.xz works for me now. For some reason the latest does not.Diphosgene
I can confirm this worked for me: (getting latest stable version atm) wget download.gna.org/wkhtmltopdf/0.12/0.12.3/… tar -vxf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz chmod a+x wkhtmltox/bin/wkhtmltopdf sudo mv wkhtmltopdf /usr/local/bin/wkhtmltopdfTinatinamou
A
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!

Admonish answered 14/11, 2014 at 12:28 Comment(5)
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.Ladd
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.debSade
this is still the better solution provided to this question.Dactylogram
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..Baggywrinkle
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.Inn
R
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.

Rienzi answered 22/1, 2016 at 13:8 Comment(4)
for some reason this was working for me and the newer version (0.13) was not thank you!Santosantonica
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 :)Economist
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 :)Economist
gna.org is now shut down. :(Nicolais
R
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>');
Roveover answered 21/5, 2013 at 19:16 Comment(0)
O
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
<<
Oblique answered 16/10, 2014 at 8:58 Comment(2)
I have installed 0.12.1 and it still prompts me cannot connect to X server. Am I missing something?Laurettelauri
Tried it again and this works for me (no install, just to keep the box clean). See edit above.Oblique
D
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
Denysedenzil answered 21/4, 2017 at 21:25 Comment(0)
E
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
Elliott answered 2/5, 2014 at 18:35 Comment(0)
U
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
Underbid answered 13/9, 2015 at 15:10 Comment(0)
G
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
    
Gapin answered 12/5, 2016 at 8:12 Comment(0)
S
5

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

Superscribe answered 7/3, 2012 at 16:47 Comment(0)
S
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

Santasantacruz answered 28/8, 2015 at 18:1 Comment(1)
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.rpmCooks
T
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

Turk answered 12/1, 2017 at 11:23 Comment(0)
R
2

Just tell the Qt backend to not use X:

QT_QPA_PLATFORM=offscreen wkhtmltopdf <input> <outfile.pdf>
Ridglee answered 24/6, 2020 at 7:52 Comment(0)
R
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.

Robena answered 15/4, 2014 at 15:42 Comment(0)
D
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
Dipole answered 18/4, 2019 at 20:39 Comment(0)
E
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

Eskilstuna answered 25/6, 2016 at 11:9 Comment(0)
F
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
Fingering answered 12/4, 2017 at 12:13 Comment(0)
M
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?.

Manifestation answered 25/9, 2017 at 8:17 Comment(0)
P
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.

Parma answered 13/11, 2019 at 15:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.