(используя 'imgkit' на сервере Ubuntu) wkhtmltopdf: не удалось подключиться ни к одному X-дисплею - PullRequest
0 голосов
/ 25 октября 2019

У меня есть скрипт Python, работающий на удаленном сервере Ubuntu. В какой-то момент в моем коде я создаю HTML-файл, который затем преобразую в png. Поэтому я решил использовать imgkit, который прекрасно справляется с этой задачей (перед загрузкой скрипта python на удаленный сервер Ubuntu я тестировал свой код на Mac OS):

import imgkit

imgkit.from_url('MyFile.html', 'MyFile.png')

Теперь проблема в том, чтоНа сервере Ubuntu не было установлено imgkit и wkhtmltopdf. Поэтому я выполнил следующую команду:

sudo pip install imgkit

Затем:

sudo apt-get install wkhtmltopdf

Затем он вернул ошибку:

QXcbConnection: Could not connect to display 
Could not connect to any X display.


You need to install xvfb(sudo apt-get install xvfb, yum install xorg-x11-server-Xvfb, etc), 
then add option: {"xvfb": ""}.

Пока все хорошо. Поэтому я выполнил следующую команду:

sudo apt-get install xvfb

, которая сработала. Но сервер Ubuntu по-прежнему возвращает ту же ошибку. Теперь, во-первых, я понятия не имею, что: then add option: {"xvfb": ""}. даже означает. Я пытался искать ответы в Интернете, и люди цитировали это раньше, не объясняя, что на самом деле нужно делать или писать в терминале. Я также чувствую, что мне не хватает расширений для wkhtmltopdf, но я не уверен, какой (опять же, я запустил онлайн-поиск, но сейчас я запутался больше, чем что-либо другое. Я обнаружил похожие потоки при переполнении стека, но ничего похожего на проблемуЯ испытываю). Любая помощь будет принята с благодарностью.

Большое спасибо, С наилучшими пожеланиями, Берти

1 Ответ

0 голосов
/ 29 октября 2019

Я не нашел решения моего вопроса: then add option: {"xvfb": ""}

Однако я смог заставить свой код работать. Существует два решения.

1) Используйте wkhtmltopdf:

import os

os.system("xvfb-run -a wkhtmltopdf %s %s"%('filenameIn.html','filenaneOut.png'))

, который создает файл PDF без необходимости настройки виртуального дисплея.

2) Настройка aВиртуальный дисплей с использованием pyvirtualdisplay:

import imgkit
from pyvirtualdisplay import Display

display = Display(visible=0, size=(600,600))
display.start()
imgkit.from_file("filenameIn.html", "filenameOut.png")
display.stop()

На самом деле, 2) был получен ответ раньше, и я пропустил его при поиске StackOverflow: «Не удалось подключиться к дисплею» на сервере EC2

Примечание: вы можете объединить 1) и 2): используйте wkhtmltopdf для непосредственного преобразования в png, но с виртуальным дисплеем (в противном случае png не покажет полученное изображение, по крайней мере, для меня).

Я думал, что это может помочь. :) Берти

------------------------------------ РЕДАКТИРОВАТЬ -----------------------------------

У меня была ошибка (теперь исправленная) в моем решении: для2): это должно было быть "filenameOut.png" вместо "filenameOut.html

...