wkhtmltopdf: невозможно подключиться к X-серверу
Я использую wkthmltopdf для преобразования html в pdf документы на своем веб-сервере linux. Первоначально программе требовался X11 или аналогичный X-сервер для правильной работы, но благодаря многочисленным запросам разработчиков, чтобы он запускался на серверах без графического интерфейса, я почти уверен, что в статической версии он запускает виртуальный X-сервер. Я использую статическую (автономную) версию программы, и она прекрасно работает! Я бы положил исполняемый файл в папку и запустил:
./wkhtmltopdf file1.html file2.pdf
Однако я хотел бы установить эту программу для всей системы. Я использовал apt-get install wkhtmltopdf
(только что установлен вчера) и так как я работаю на 64-битной системе, мне также нужно было apt-get install ia32-libs
, После установки я могу найти версию как это:
wkhtmltopdf --version
выход:
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.
Теперь, когда я пытаюсь запустить программу, установленную через aptitude, я получаю следующую ошибку:
wkhtmltopdf: cannot connect to X server
Кто-нибудь знает, как я могу это исправить? Я полагаю, что в этой версии отсутствует виртуальный X-сервер или что-то в этом роде.
18 ответов
Я только что понял, что я могу просто переместить статический исполняемый файл в /usr/bin/
каталог и выполнить его из любого места.
Или попробуйте это (с http://drupal.org/node/870058)
Скачать wkhtmltopdf. Или лучше установить его с помощью менеджера пакетов:
sudo apt-get install wkhtmltopdf
Извлеките его и переместите в
/usr/local/bin/
- Переименуйте его в
wkhtmltopdf
так что теперь у вас есть исполняемый файл в/usr/local/bin/wkhtmltopdf
- Установить разрешения:
sudo chmod a+x /usr/local/bin/wkhtmltopdf
Установите необходимые пакеты поддержки.
sudo apt-get install openssl build-essential xorg libssl-dev
Проверьте, работает ли это: запустите
/usr/local/bin/wkhtmltopdf http://www.google.com test.pdf
Если это работает, то вы сделали. Если вы получили сообщение об ошибке "Не удается подключиться к X-серверу", перейдите к номеру 7.
Нам нужно запустить его без поддержки на "виртуальном" x-сервере. Мы сделаем это с пакетом под названием xvfb.
sudo apt-get install xvfb
Нам нужно написать небольшой сценарий оболочки, чтобы обернуть wkhtmltopdf в xvfb. Сделайте файл с именем
wkhtmltopdf.sh
и добавьте следующее:xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf "$@"
Переместите этот сценарий оболочки в
/usr/local/bin
и установите разрешения:sudo chmod a+x /usr/local/bin/wkhtmltopdf.sh
Проверьте, работает ли он еще раз: запустите
/usr/local/bin/wkhtmltopdf.sh http://www.google.com test.pdf
Обратите внимание, что http://www.google.com/ может выдавать ошибку, например: "Завершенный ResourceObject получил сигнал о завершении загрузки. Это может указывать на то, что для загрузки iframe потребовалось много времени". Вы можете проверить с более простой страницей, как http://www.example.com
,
Это решило проблему для меня:
sudo apt-get install xvfb
xvfb-run --server-args="-screen 0, 1024x768x24" wkhtmltopdf file1.html file2.pdf
Я пытался сделать sudo apt-get install wkhtmltopdf
но безуспешно Вместо этого я рекомендую вам попробовать:
Загрузите последний исполняемый файл (.11 rc1):
wget https://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.11.0_rc1-static-i386.tar.bz2
распакуйте его:
tar -vxf wkhtmltopdf-0.11.0_rc1-static-i386.tar.bz2
переименуйте это:
mv wkhtmltopdf-i386 wkhtmltopdf
chmod это исполняемый файл:
chmod a+x wkhtmltopdf
поместите его в /usr/bin:
sudo mv wkhtmltopdf /usr/bin
Просто сделал это:
1- Чтобы загрузить зависимости wkhtmltopdf
# apt-get install wkhtmltopdf
2- Скачать с источника
# wget http://downloads.sourceforge.net/project/wkhtmltopdf/xxx.deb
# dpkg -i xxx.deb
3- Попробуйте
# wkhtmltopdf http://google.com google.pdf
Работает нормально
Оно работает!
Я нашел способ решить эту проблему без поддельного X-сервера. В новейшей версии wkhtmltopdf не требуется X-сервер для работы, но его нет в официальных репозиториях Linux.
Решение для Ubuntu 14.04.4 LTS (верный) 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
Решение для Ubuntu 14.04.4 LTS (верный) 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
Пользователь felixhummel получил очень хорошее решение, но хранилище с утилитой изменилось.
Обновление до последней версии wkhtmltopdf из SourceForge (0.12 на момент написания статьи). Ему не нужен X-сервер для запуска.
Пример для 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
<<
Расширяя ответ Тимофея...
Если вы веб-разработчик и хотите использовать wkhtmltopdf как часть вашего веб-приложения, вы можете просто установить его в свой веб-приложение. /usr/bin/
папка вот так:
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
Теперь вы можете запустить его в любом месте, используя wkhtmltopdf
,
Я лично использую библиотеку Snappy в PHP. Вот пример того, как легко создать 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>');
Для 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
wkhtmltopdf
> 0.11
не имеет этого X-server
вопрос.
Итак, установка 0.12.2.1
на сервере Linux.
Сначала установите сервер xvfb:
sudo apt-get install xvfb
Получить необходимую версию wkhtmltopdf можно по http://wkhtmltopdf.org/downloads.html.
Установите wkhtmltopdf:
sudo dpkg -i wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
или установить с
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
Установить зависимость (при необходимости):
sudo apt-get -f install
Создать символическую ссылку в
/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
Теперь попробуйте ниже, и это должно работать,
/usr/local/bin/wkhtmltopdf http://www.google.com test.pdf
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
Проблема, вероятно, в старой версии wkhtmltopdf - версия 0.9 из репозитория дистрибутива требует запуска X-сервера, но текущая версия - 0.12.2.1 не требует этого - может работать без головы.
Загрузите пакет для вашего дистрибутива с http://wkhtmltopdf.org/downloads.html и установите его - для Ubuntu:
sudo apt-get install xfonts-75dpi
sudo dpkg -i wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
решение для 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
Мы сталкиваемся с этой проблемой внутри докер-контейнеров, и вышеупомянутая установка имеет wkhtmltopdf с исправленным QT
Рекомендуется использовать как минимум 0.12.2.1.
Начиная с wkhtmltopdf >= 0.12.2 он больше не требует X-сервера или эмуляции. Вы можете скачать новую версию с http://wkhtmltopdf.org/downloads.html
Просто скажите бэкэнду Qt не использовать X:
QT_QPA_PLATFORM=offscreen wkhtmltopdf <input> <outfile.pdf>
Я следовал приведенным здесь инструкциям и заставил wkhtmltopdf работать для меня, но я хотел бы предложить немного перспективы, которую я обнаружил, когда исполнял свой собственный маленький танец с wkhtmltopdf
- xvfb
,
Это важно, потому что та же самая причина, которая заставляет его бросать печально известную cannot connect to X server
ошибка также приводит к тому, что он запускается с серьезными ограничениями, даже если вы предоставляете ему X-сервер. Эти ограничения включают в себя невозможность использования нескольких входных источников, установки верхних и нижних колонтитулов и т. Д. ( См. Раздел " Ограниченная функциональность" руководства).
wkhtmltox
сам по себе не требует X11, однако он использует библиотеки QT, которые делают. В новых версиях wkthmltox разработчики сделали патч для QT, который позволяет ему работать с X11.
В настоящее время некоторые версии построены против исправленного QT, а некоторые нет. Вы можете проверить свою версию, запустив wkhtmltopds --version
, В конце должна быть строчка Compiled against wkhtmltopdf patched qt.
Итак, в заключение, если вы устанавливаете и используете версию, использующую исправленные библиотеки, она должна работать на сервере Linux без xvfb
сервер, как я могу подтвердить.
Вы должны скопировать его в каталог: / usr / local / bin, сделать его исполняемым и добавить символическую ссылку на wkhtmltopdf.sh, например:
1- команда:
sudo apt-get install wkhtmltopdf
2 - вставьте двоичный файл в каталог / usr / bin, чтобы у браузера не было разрешения на выполнение в этом каталоге. Вы должны скопировать wkhtmltopdf.sh в каталог / usr / local / bin, так как браузер имеет разрешение на этот каталог, например:
sudo cp /usr/bin/wkhtmltopdf.sh /usr/local/bin/wkhtmltopdf.sh
3 - После make sur бинарный файл имеет разрешение на выполнение, например:
sudo chmod a+x /usr/local/bin/wkhtmltopdf.sh
4 - так что теперь вы можете проверить, это работает как:
/usr/local/bin/wkhtmltopdf.sh http://www.google.com google.pdf
это сделать скачать PDF в текущем каталоге в вашем терминале
5 - Необязательно, теперь вы можете добавить символическую ссылку в ваш каталог / usr / local / bin как
ln -s /usr/local/bin/wkhtmltopdf.sh /usr/local/bin/wkhtmltopdf
Враг 64-битный Использование:
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
- Скачать файл по этой ссылке
- Распакуйте его и переместите исполняемый файл (/wkhtmltox/bin/wkhtmltopdf) в
/usr/bin/
- Переименуйте его в wkhtmltopdf, если текущее имя не является wkhtmltopdf. Так что теперь у вас есть исполняемый файл в
/usr/bin/wkhtmltopdf
- Установите права доступа: sudo chmod a+x /usr/bin/wkhtmltopdf
- Установите необходимые пакеты поддержки. sudo apt-get установить openssl build-essential xorg libssl-dev
- Теперь проверьте с
wkhtmltopdf http://www.google.com test.pdf
подсказка: подробная информация по этой ссылке
Если вы настраиваете wkhtmltopdf для Rails или Somethings в Centos, вы можете выполнить следующие шаги:
- Перейдите на https://wkhtmltopdf.org/downloads.html и скопируйте ссылку на файл rpm.
На сервере centos bash.
wget link_of_wkhtmltopdf_rpm.rpm
rpm -ivh link_of_wkhtmltopdf_rpm.rpm
which wkhtmltopdf
=> Вы получите путь к wkhtmltopdf.
Настройка wicked_pdf или pdfkit с указанием пути на шаге 4. Это пример конфигурации с wickedpdf. конфигурация / инициализаторы /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 }
Перезагрузите сервер.
СДЕЛАННЫЙ.
Просто установите версию 0.12.4 или выше. Кажется, это решает проблему.
См. Как я могу установить последнюю версию wkhtmltopdf в Ubuntu 16.04?,