1
exec("wkhtmltopdf test.html output.pdf");

In the php command line it works but if I try to call it from apache it doesn't create the pdf file and the log show this:

$ tail -f  /var/log/apache2/error.log
wkhtmltopdf: cannot connect to X server
Sadiel
  • 1,344
  • 3
  • 18
  • 33

3 Answers3

6

You can use Xvfb to emulate a x-environment

<?php exec("xvfb-run -a wkhtmltopdf test.html output.pdf");

OR

<?php exec("startx -- `which Xvfb` :1 -screen 0 800x600x24 && DISPLAY=:1 && wkhtmltopdf test.html output.pdf");

I made this script for myself to get wkhtml running on centos 6+:

 yum install xorg-x11-server-Xvfb
    nano /etc/init.d/xvfbd
    #paste this:
    #!/bin/bash

#
# /etc/rc.d/init.d/xvfbd
#
# chkconfig: 345 95 28
# description: Starts/Stops X Virtual Framebuffer server
# processname: Xvfb
#

. /etc/init.d/functions

[ "${NETWORKING}" = "no" ] && exit 0

PROG="/usr/bin/Xvfb"
PROG_OPTIONS=":1 -screen 1 1024x768x24 -nolisten tcp"
PROG_OUTPUT="/tmp/Xvfb.out"

case "$1" in
start)
echo -n "Starting : X Virtual Frame Buffer "
$PROG $PROG_OPTIONS>>$PROG_OUTPUT 2>&1 &
disown -ar
/bin/usleep 500000
status Xvfb & >/dev/null && echo_success || echo_failure
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
/bin/touch /var/lock/subsys/Xvfb
/sbin/pidof -o %PPID -x Xvfb > /var/run/Xvfb.pid
fi
echo
;;
stop)
echo -n "Shutting down : X Virtual Frame Buffer"
killproc $PROG
RETVAL=$?
[ $RETVAL -eq 0 ] && /bin/rm -f /var/lock/subsys/Xvfb
/var/run/Xvfb.pid
echo
;;
restart|reload)
$0 stop
$0 start
RETVAL=$?
;;
status)
status Xvfb
RETVAL=$?
;;
*)
echo $"Usage: $0 (start|stop|restart|reload|status)"
exit 1
esac

exit $RETVAL


#END
chmod 550 /etc/init.d/xvfbd
chkconfig xvfdb on
service xvfdb start

#Compile wkhtml compelety:
http://code.google.com/p/wkhtmltopdf/wiki/compilation

./configure -nomake examples,demos,docs,translations -opensource -webkit -prefix "../wkqt"


#Install fonts:
yum install xorg-x11-fonts*

After that run it in PHP:

exec("DISPLAY=:1  timeout 60 wkhtmltoimage --height 1024 --width 1280 --quality 80 \"" . $site . "\" " . $filename);
Green Black
  • 5,037
  • 1
  • 17
  • 29
0

There's a newer version of wkhtmltopdf (0.11) available on it's website that doesn't require the X server running.

wdev
  • 2,190
  • 20
  • 26
  • I have *wkhtmltopdf* 0.12.1 which comes with Debian 8 but it still requires *xvfb-run*. Without it *wkhtmltopdf* exits with status 134, probably due to a failing assertion. – August Karlstrom Sep 14 '15 at 09:39
-1

For everything else, there's shell scripting.

    #!/bin/bash
    if [[ $EUID -ne 0 ]]; then
      echo "This script must be run as root" 1>&2
      exit 1
    fi
    apt-get install xvfb wkhtmltopdf
    mv /usr/bin/wkhtmltopdf /usr/bin/wkhtmltopdfbin
    echo 'xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdfbin $*' > /usr/bin/wkhtmltopdf.sh
    ln -s /usr/bin/wkhtmltopdf.sh /usr/bin/wkhtmltopdf