Wkhtmltopdf (pdfkit) не удалось подключиться ни к одному дисплею x

Я пытаюсь использовать wkhtmltopdf с Django, nginx, uwsgi он отлично работает в среде разработки, работающей с использованием 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#setting-up-the-uwsgi-application- сервер

я думаю, что это связано с 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")
5
0
8 451
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я думаю, это как-то связано с пересылкой X11. Вам нужно включить его на сервере.

Проверьте это.

Ответ принят как подходящий

Решение

Вместо использования

apt-get install wkhtmltopdf

Я скачал последнюю версию с страница релизов и теперь все работает.

После установки последней версии нам также необходимо добавить опцию {"xvfb": ""}

SangamAngre 08.05.2020 21:51

У вас есть 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()
    

Я думаю, что нужно создать экземпляр дисплея?

florian 16.04.2020 10:42

вы можете упростить: с помощью Display (): pdfkit.from_string (input_html_string, output_file_path)

Ivan Carrasco Quiroz 20.10.2020 21:10

Скачайте или получите ссылку на последнюю версию с официальная страница

sudo wget -p ./ https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb

sudo apt install ./wkhtmltox_0.12.6-1.bionic_amd64.deb

У меня это сработало на Ubuntu 18.04

Другие вопросы по теме