wkhtmltopdf (pdfkit) Не удалось подключиться ни к одному X-дисплею
Я пытаюсь использовать wkhtmltopdf с Django,nginx,uwsgi, он отлично работает при разработке env, запущенной с использованием manage.py runserver, но при работе с nginx и uwsgi я получаю эту ошибку:
wkhtmltopdf exited with non-zero code 1. error:
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-isp'
qt.qpa.screen: QXcbConnection: Could not connect to display
Could not connect to any X display.
Exception Location: /home/isp/Env/isp/lib/python3.6/site-package/pdfkit/pdfkit.py in to_pdf, line 159
команда:
wkhtmltopdf http://www.google.com output.pdf
отлично работает на терминале, и я использовал это руководство для развертывания приложения Django https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-ubuntu-16-04
я думаю, что это связано с virtualenv, я пытался использовать эту оболочку https://github.com/JazzCore/python-pdfkit/wiki/Using-wkhtmltopdf-without-X-server
но все еще с той же ошибкой
мой код:
import pdfkit
pdfkit.from_file("./invoices/invoice"+str(booking_id)+"-"+str(invoice_id)+".html", "invoices/invoice_initial"+str(booking_id)+"-"+str(invoice_id)+".pdf")
4 ответа
Решение: вместо использования
apt-get install wkhtmltopdf
я скачал последнюю версию со страницы релизов, теперь все работает
Просто установите последнюю версию
sudo apt install ./wkhtmltox_0.12.6-1.bionic_amd64.deb
У меня это сработало на Ubuntu 18.04
У вас есть 2 подхода для решения этой проблемы.
1) os.system("xvfb-run wkhtmltopdf %s %s"%(INPUT_URL, OUTPUT_FILE_PATH))
2) Использование pyvirtualdisplay.
Монтаж:
$ sudo apt-get install xvfb
$ sudo pip install pyvirtualdisplay
чем:
from pyvirtualdisplay import Display
import pdfkit
try:
display.start()
pdfkit.from_string(input_html_string, output_file_path)
# pdfkit.from_url(input_url, output_file_path)
finally:
display.stop()
Я думаю, что это как-то связано с пересылкой X11. Вам необходимо включить его на сервере.
Проверьте это.